使用CGContextAddArcToPoint()绘制圆弧时,(x1,y1)和(x2,y2)是什么意思?

你可以使用下面的代码来使用Quartz绘制一个弧:

CGContextMoveToPoint(context2, x, y); CGContextAddArcToPoint(context2, x1, y1, x2, y2, r); 

在这些函数中, (x,y)是起点, r是圆弧半径,但是(x1,y1)(x2,y2)什么?

http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextAddArcToPoint

x1 :用户空间坐标中的x值,用于第一条切线的终点。 第一条切线从当前点绘制到(x1,y1)。

y1 :用户空间坐标中的y值,用于第一条切线的终点。 第一条切线从当前点绘制到(x1,y1)。

x2 :用户空间坐标中的x值,用于第二条切线的终点。 第二条切线从(x1,y1)到(x2,y2)。

y2 :用户空间坐标中第二条切线终点的y值。 第二条切线从(x1,y1)到(x2,y2)。

AddArcToPoint的工作原理是这样的:

ArcToPoint图

其中P1是path当前所在的点, r是给予函数的radius ,红线是addArcToPoint将添加到当前path的行。 它不会继续在x2, y2的第二点; 它会停在弧线的尽头。

我在这里有一个博客文章。

下面是我刚刚构build的用于解决此问题的代码,使用声明和示例值从圆心的angular度进行处理:

 CGPoint arcCenter = CGPointMake(30,20); float arcLengthRad = M_PI_4; // Whatever, the full span of the arc in radians float radius = 10; float arcCenterRad = M_PI_2; // the angle of the center of the arc, in radians float arcP1hyp = 1/cos(arcLengthRad/2) * radius; float arcP1x = arcCenter.x + cosf(arcCenterRad)*arcP1hyp; float arcP1y = arcCenter.y + sinf(arcCenterRad)*arcP1hyp; float arcP2tx = arcCenter.x + cosf(arcCenterRad+(arcLengthRad/2))*radius; float arcP2ty = arcCenter.y + sinf(arcCenterRad+(arcLengthRad/2))*radius; float arcP2x = (arcP1x - arcP2tx)*-1 + arcP2tx; float arcP2y = (arcP1y - arcP2ty)*-1 + arcP2ty; CGContextAddArcToPoint(context, arcP1x, arcP1y, arcP2x, arcP2y, radius); 

所以上面的代码应该在圆的顶部产生一个45度angular的小圆弧。


编辑:作为对收到的评论的回应,上面列出的超简洁的代码如下所示,带有注释并包装在一个方法中(加上对arcP2计算的小调整)

 /* EOTContext:addArcWithCenter:arcLength:radius:arcMiddlePointAngle: Use this method for building a circle with breaks at certain points, for example to use other CGContext methods to draw notches in the circle, or protruding points like gear teeth. This method builds up the values to use in CGContextAddArcToPoint(), which are the x and y coordinates of two points. First added to the current point in context, form two lines that are the tangents of the entry and exit angles of the arc. This method's arguments define the length of the arc in radians, and the position of start and end using the angle centerpoint of the arc. This is useful when drawing a certain defined amount of gear teeth, rotating around the circle. It is beyond this method's scope to maintain or calculate the centerpoint relative to an arbitrary current point in the context, because this is primarily used for drawing a gear/notch circle. */ -(void)EOTContext:(CGContext*)context addArcWithCenter:(CGPoint)arcCenter arcLength:(CGFloat)arcLengthRad radius:(CGFloat)radius arcMiddlePointAngle:(CGFloat)arcCenterRad { /* Calculate the hypotenuse of the larger, outer circle where the points of the tangent lines would rest upon (imagine wrapping the drawn circle in a bounding regular convex polygon of tangent lines, then wrap that polygon in an outer circle) */ float arcP1hyp = 1/cos(arcLengthRad/2) * radius; // Build first tangent point CGPoint arcP1 = (CGPoint){ arcCenter.x + cosf(arcCenterRad)*arcP1hyp, arcCenter.y + sinf(arcCenterRad)*arcP1hyp }; // Build the final endpoint of the arc CGPoint arcP2final = (CGPoint){ arcCenter.x + cosf(arcCenterRad+(arcLengthRad/2))*radius, arcCenter.y + sinf(arcCenterRad+(arcLengthRad/2))*radius }; // Build second tangent point using the first tangent point and the final point of the arc. // This point is resting on the bounding outer circle like arcP1 is. // This would also work using the final point itself, using the simple assignment of arcP2 = arcP2final; // or of course simply omitting arcP2 altogether. CGPoint arcP2 = (CGPoint){ (arcP2final.x - arcP1.x) + arcP2final.x, (arcP2final.y - arcP1.y) + arcP2final.y }; // The following adds an arc of a circle to the current path, using a radius and tangent points. CGContextAddArcToPoint(context, arcP1.x, arcP1.y, arcP2.x, arcP2.y, radius); } 

我简要描述了苹果文档。

http://developer.apple.com/library/ios/documentation/GraphicsImaging/Reference/CGContext/Reference/reference.html#//apple_ref/c/func/CGContextAddArcToPoint

x1:用户空间坐标中的x值,用于第一条切线的终点。 第一条切线从当前点绘制到(x1,y1)。

y1:用户空间坐标中的y值,用于第一条切线的终点。 第一条切线从当前点绘制到(x1,y1)。

x2:用户空间坐标中的x值,用于第二条切线的终点。 第二条切线从(x1,y1)到(x2,y2)。

y2:用户空间坐标中第二条切线终点的y值。 第二条切线从(x1,y1)到(x2,y2)。