2010-03-04 10 views
6

Quiero dibujar usando esto como mi trazo. Cómo haría esto lo más eficiente posible, y sobre la marcha del dibujo, estaba pensando en CGPatternRef, pero realmente no sé cómo hacerlo.Cómo dibujaría algo como esto en Core Graphics

Editar: No necesita deformarse en el camino. No pude solucionar ese problema en Illustrator. alt text

+3

Nadie puede ver esa imagen sin haber iniciado sesión en los foros de desarrolladores de Apple. Envíelo a http://imgur.com/ o un servicio similar y edite la pregunta para insertar la imagen desde allí. –

+0

No ayuda que al momento de escribir esto, el sitio de Apple Dev esté fuera de línea por mantenimiento. – TechZen

Respuesta

0

Parece un trabajo para OpenGL. CoreGraphics no ofrece ninguna manera simple que yo sepa de deformar las estrellas de acuerdo con su proximidad a un camino.

+0

No necesito deformar las estrellas en el camino que dibujo. – Jaba

2

Tendrá que recorrer la ruta y calcular las coordenadas de la curva a la misma distancia (a lo largo de la ruta). Esto es barato. La rotación se pone un poco peluda (gira alrededor de la tangente), pero en general, este es un problema básico de bézier curve. Simplemente resuelva la ecuación de la curva y represente una estrella en cada vértice.

No hay nada incorporado que lo haga todo. Puede consultar puntos para la intersección, pero solo el renderizado resuelve la curva. Esto está encapsulado por CoreGraphics, por lo que no puede sacarlo o aprovechar lo que ya tiene.

Esto es algo que deberías considerar escribir tú mismo. No es dificil; honesto. Solo se requiere una comprensión básica del cálculo ... en todo caso. Si lo escribe usted mismo, incluso puede agregar los efectos de deformación, si lo desea.

3

¿El documento de Apple ayuda?

Consulte la sección en Quartz 2D Programming Guide, How Patterns Work o Patrones en general.

Aquí es cómo dibujar un comienzo (de los documentos anteriores), PSIZE es el tamaño de la estrella:

static void MyDrawStencilStar (void *info, CGContextRef myContext) 
{ 
    int k; 
    double r, theta; 

    r = 0.8 * PSIZE/2; 
    theta = 2 * M_PI * (2.0/5.0); // 144 degrees 

    CGContextTranslateCTM (myContext, PSIZE/2, PSIZE/2); 

    CGContextMoveToPoint(myContext, 0, r); 
    for (k = 1; k < 5; k++) { 
     CGContextAddLineToPoint (myContext, 
        r * sin(k * theta), 
        r * cos(k * theta)); 
    } 
    CGContextClosePath(myContext); 
    CGContextFillPath(myContext); 
} 

Simplemente añadir la transformación de la curva y en cada punto de extracción de la estrella.

Aquí hay un simple C code to calculate points on cubic bezier curve.

+0

Creo que Pestilence tiene razón, traté de acariciar con el patrón, pero eso usa el patrón como fondo de pantalla, p. funciona con un rectángulo agradable pero a la vez que acaricia la curva, no pone las estrellas en el centro del trazo, simplemente teje las estrellas dentro del trazo para obtener pedazos de estrellas, como si dibujara un patrón regular en la pared y luego cortara fuera de una curva, las estrellas no encajan bien en la curva ... – stefanB

+0

¿Cómo puedo adaptar ese ejemplo para dibujar estrellas en una línea? – daveoncode

Cuestiones relacionadas