2011-03-03 21 views
7

Estoy trabajando con un código de ejemplo que dibuja un arco usando CGPaths. He echado un vistazo y he encontrado documentación, pero parece que no puedo visualizar en mi cabeza lo que sucede en términos de usar MoveToPoint, AddLineToPoint, etc. No puedo 'ver' lo que está haciendo el código, puedo simplemente ver el resultadoCómo dibujar un círculo comenzando en la parte superior

Por ejemplo, el código siguiente dibuja un arco de 360 ​​grados completos a partir de la posición de las 3 en punto. Por mi vida no puedo imaginar cómo hacer que comience desde la posición de las 12 en punto con la rotación de la vista en realidad - 90 grados.

Podría alguien ayudarme a descubrir este código y cómo lo cambiaría para lograr el comienzo desde las 12 en punto, preferiblemente tratando de explicar cómo funciona todo esto. ¿O tal vez apuntarme a un recurso visual en línea?

- (void)drawPathWithArc:(CGFloat)arc { 
    CGMutablePathRef thePath = CGPathCreateMutable(); 
    CGPathMoveToPoint(thePath, NULL, 100.f, 100.f); 
    CGPathAddLineToPoint(thePath, NULL, 200.f, 100.f); 
    CGPathAddArc(thePath, NULL, 100.f, 100.f, 100.f, 0.f, (360* M_PI)/180, NO); 
    CGPathCloseSubpath(thePath); 
    shapeLayer_.path = thePath; 
    CGPathRelease(thePath); 
} 

Respuesta

16

Las rutas realmente no son tan difíciles de entender visualmente. Básicamente, todo un camino es una línea que conecta dos puntos en el plano cartesiano que define la pantalla del iphone.

Cuando moveToPoint establece el punto actual de la ruta al punto especificado.

Cuando agregaLíneaPunto dibuja una línea recta desde el punto actual al punto especificado.

Cuando agrega Curva a Punto, dibuja una línea curva desde el punto actual al punto especificado en función de ciertas tangentes y puntos de control.

Y así sucesivamente. Yo recomendaría leer la documentación de manzanas en CGPaths para comprender mejor qué está haciendo cada función.

http://developer.apple.com/library/mac/#documentation/graphicsimaging/Reference/CGPath/Reference/reference.html


En cuanto a tu pregunta va a hacer este inicio a las 12 en lugar de 3, simplemente leer la documentación de la función CGPathAddArc.

Lo que hay que hacer es cambiar su código actual:

CGPathAddArc(thePath, NULL, 100.f, 100.f, 100.f, 0.f, (360* M_PI)/180, NO); 

a:

CGPathAddArc(thePath, NULL, 100.f, 100.f, 100.f, -M_PI_2, M_PI_2*3, NO); 

Todo esto está haciendo es cambiar el ángulo inicial a -90 grados (todos los ángulos se miden en radianes desde la horizontal) y el ángulo final a 270 grados.


Espero que esto ayude. Cheers,

Brenton.

+0

tiene sentido gracias. Tenía una idea de que estaba en la línea que describió, pero dudaba de mi comprensión ya que funcionaba como quería. Resulta que no estaba funcionando debido a un problema en otro lado. – dubbeat

+0

@dubbeat - Si quiere aprender un poco más sobre el dibujo de cuarzo, le señalo un par de recursos en mi respuesta [aquí] (http://stackoverflow.com/questions/3463256/what-are-some-great- quartz-2d-drawing-tutorials/3464136 # 3464136). –

+0

Gracias Brad. Un montón de material útil allí – dubbeat

Cuestiones relacionadas