ios core-graphics cgcontext

ios - Al dibujar un arco utilizando CGContextAddArcToPoint(), ¿qué significa(x1, y1) y(x2, y2)?



core-graphics (4)

AddArcToPoint funciona así:

donde P1 es el punto en el que se encuentra actualmente la ruta, r es el radius asignado a la función y la línea roja es la línea que addArcToPoint agregará a la ruta actual. No continuará hasta el segundo punto en x2, y2 ; Se detendrá al final del arco.

Tengo una entrada de blog sobre esto here .

Puedes usar el siguiente código para dibujar un arco usando Cuarzo:

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

En estas funciones, (x,y) es el punto de inicio r es el radio del arco, pero ¿cuáles son (x1,y1) y (x2,y2) ?


Aquí está el código que acabo de construir para resolver esto, abordándolo desde la perspectiva del centro del círculo, con declaraciones y valores de muestra:

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);

Por lo tanto, el código anterior debe producir un pequeño arco de ángulo de 45 grados en la parte superior de un círculo.

Editado: en respuesta a un comentario recibido, el código súper conciso que se muestra arriba se muestra a continuación, con comentarios y envuelto en un método (más un pequeño ajuste en el cálculo de 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); }


Yo la documentación de la manzana que describí brevemente.

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

x1: el valor x, en las coordenadas del espacio de usuario, para el punto final de la primera línea tangente. La primera línea tangente se dibuja desde el punto actual hasta (x1, y1).

y1: El valor y, en coordenadas de espacio de usuario, para el punto final de la primera línea tangente. La primera línea tangente se dibuja desde el punto actual hasta (x1, y1).

x2: El valor de x, en coordenadas de espacio de usuario, para el punto final de la segunda línea tangente. La segunda línea tangente se dibuja de (x1, y1) a (x2, y2).

y2: El valor y, en coordenadas de espacio de usuario, para el punto final de la segunda línea tangente. La segunda línea tangente se dibuja de (x1, y1) a (x2, y2).


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

x1 : el valor x, en las coordenadas del espacio de usuario, para el punto final de la primera línea tangente. La primera línea tangente se dibuja desde el punto actual hasta (x1, y1).

y1 : El valor y, en coordenadas de espacio de usuario, para el punto final de la primera línea tangente. La primera línea tangente se dibuja desde el punto actual hasta (x1, y1).

x2 : El valor de x, en coordenadas de espacio de usuario, para el punto final de la segunda línea tangente. La segunda línea tangente se dibuja de (x1, y1) a (x2, y2).

y2 : El valor y, en coordenadas de espacio de usuario, para el punto final de la segunda línea tangente. La segunda línea tangente se dibuja de (x1, y1) a (x2, y2).