2010-03-04 11 views
6

Voglio essere in grado di disegnare usando questo come mio tratto. Come potrei farlo nel modo più efficiente possibile, e al volo disegno, stavo pensando a CGPatternRef, ma davvero non so come farlo.Come disegnerei qualcosa di simile in Core Graphics

Modifica: Non è necessario deformare sul percorso. Non ho appena risolto il problema in Illustrator. alt text

+3

Nessuno può vedere quell'immagine senza aver effettuato l'accesso ai forum degli sviluppatori Apple. Pubblicalo su http://imgur.com/ o un servizio simile e modifica la domanda per incorporare l'immagine da lì. –

+0

Al momento della stesura di questo documento, il sito Apple Dev non è in linea per manutenzione. – TechZen

risposta

0

Questo sembra un lavoro per OpenGL. CoreGraphics non offre alcun modo semplice che io conosca per deformare le stelle in base alla loro vicinanza a un percorso.

+0

Non ho bisogno di deformare le stelle sul percorso che disegno. – Jaba

2

È necessario percorrere il percorso e calcolare le coordinate della curva a distanze uguali (lungo il percorso). Questo è poco costoso. La rotazione diventa un po 'pelosa (ruotando attorno alla tangente), ma nel complesso, si tratta di un problema base bézier curve. Basta risolvere l'equazione della curva e rendere una stella in ogni vertice.

Non c'è niente di built-in che farà tutto. Puoi interrogare i punti per l'intersezione, ma solo il rendering risolve la curva. Questo è incapsulato da CoreGraphics, quindi non puoi estrarlo o approfittare di ciò che già hanno.

Questo è qualcosa che dovresti considerare di scrivere da solo. Non è difficile; onesto. Solo una conoscenza di base del calcolo è necessaria ... se non del tutto. Se lo scrivi tu stesso, puoi anche aggiungere gli effetti di deformazione, se vuoi.

3

La documentazione Apple aiuta?

Vedere la sezione in Quartz 2D Programming Guide, How Patterns Work o Modelli in generale.

Ecco come disegnare un inizio (dalla documentazione di cui sopra), pSize è la dimensione stella:

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

Basta aggiungere la trasformazione della curva e ad ogni punto di disegnare la stella.

Questo è un simple C code to calculate points on cubic bezier curve.

+0

Penso che Pestilence abbia ragione, ho provato ad accarezzare con pattern ma quello usa il pattern come sfondo, ad es. Funziona bene con il rettangolo, ma quando si accarezza la curva non mette le stelle nel mezzo del tratto, si incastra semplicemente le stelle all'interno del tratto in modo da ottenere frammenti di stelle - come se si disegnasse un motivo regolare sul muro e poi si tagli una curva, le stelle non si adattano bene alla curva ... – stefanB

+0

Come posso adattare quell'esempio per disegnare stelle su una linea? – daveoncode

Problemi correlati