2011-08-29 12 views
7

Sto disegnando un tracciato in un CGContext seguendo una serie di punti raccolti dall'utente. Sembra che ci sia un jitter di input casuale che causa alcuni bordi della linea per sembrare frastagliati. Penso che una leggera piuma risolverebbe questo problema. Se stavo usando OpenGL ES vorrei semplicemente applicare una piuma allo sprite con cui sto accarezzando il percorso; tuttavia, questo progetto mi richiede di rimanere in Quartz/CoreGraphics e non riesco a trovare una soluzione simile.iOS Quartz/CoreGraphics disegno pennellata sfumata

Ho provato a disegnare 5 linee con ogni linea leggermente più grande e più trasparente per approssimare una piuma. Questo produce un cattivo risultato e rallenta notevolmente le prestazioni.

Questo è il codice di disegno linea:

CGContextMoveToPoint(UIGraphicsGetCurrentContext(),((int)lastPostionDrawing1.x), (((int)lastPostionDrawing1.y))); 
CGContextAddCurveToPoint(UIGraphicsGetCurrentContext(), ctrl1_x, ctrl1_y, ctrl2_x, ctrl2_y, lastPostionDrawing2.x, lastPostionDrawing2.y; 
[currentPath addCurveToPoint:CGPointMake(lastPostionDrawing2.x-((int)furthestLeft.x)+((int)penSize), lastPostionDrawing2.y controlPoint1:CGPointMake(ctrl1_x, ctrl1_y) controlPoint2:CGPointMake(ctrl2_x, ctrl2_y)]; 
+0

Hai provato la funzione CGContextSetShouldAntialias? – Davyd

+0

Ho avuto problemi simili in passato usando curve quadrangolari o curve con 2 punti di controllo. Potrei probabilmente aiutarti se mi mandi il .svg di quello che vuoi disegnare o almeno qualche informazione in più sulla piuma che stai cercando di disegnare – GianPac

risposta

2

ho intenzione di andare avanti e di assumere che il vostro CGContext ha ancora anti-aliasing attivato, ma se non, allora questo è il primo ovvio pensare a provare , come suggerisce il commento di @ Davyd: CGContextSetShouldAntialias è la funzione di interesse.

Supponendo che non sia questo il problema, e la linea è anti-aliasata dal contesto, ma si sta ancora cercando qualcosa di "più morbido". Posso pensare ad un paio di modi per farlo, che dovrebbe essere più veloce che accarezzare 5 volte.

Innanzitutto, puoi provare a ottenere il tracciato tracciato (ovvero un percorso che descrive il contorno del tratto del percorso corrente) utilizzando CGContextReplacePathWithStrokedPath puoi quindi riempire questo percorso con un gradiente (o qualsiasi altra tecnica di riempimento fornisca i risultati desiderati .) Ciò funziona bene per rettilineo, ma non sarà semplice per percorsi curvi (poiché il gradiente è il riempimento della zona del percorso accarezzò, e sarà lineare o radiale.)

Un'altra opzione forse meno evidente potrebbe essere quello di abusare del disegno dell'ombra di CG per questo scopo. La funzione che si desidera cercare è: CGContextSetShadowWithColor Ecco il metodo:

  • Salvare il GState: CGContextSaveGState
  • Prendi il riquadro di delimitazione del percorso originale
  • copiare il percorso, traducendola lontano da sé del 2,0 * bbox.width utilizzando CGPathCreateCopyByTransformingPath (nota: utilizzare la direzione X solo, in questo modo non c'è bisogno di preoccuparsi di lanci nel contesto)
  • agganciare il contesto per la Bbox originale utilizzando CGContextClipToRect
  • impostare un ombra sul contesto wi th CGContextSetShadowWithColor:
    • Alcuni sfocatura minima (Inizia con 0,5 e vai da lì. Il parametro sfocatura non è lineare e IME è una sorta di ipotesi e controllo operazione)
    • Un offset pari a -2,0 * larghezza bbox e 0,0 altezza, ridimensionato allo spazio di base. (Nota: questi offset si trovano nello spazio di base, il che sarebbe folle da capire, ma supponendo che tu non stia aggiungendo le tue trasformazioni di scala, il fattore di scala sarà 1.0 o 2.0, quindi, in pratica, imposterai un offset.width di -2.0 * bbox.width o -4.0 * bbox.width)
    • Un colore a scelta.
  • Traccia il percorso traslato.
  • pop il GState CGContextRestoreGState

Questo dovrebbe lasciare con "solo" l'ombra, che è possibile modificare spera di ottenere i risultati desiderati.

Tutto ciò detto, le prestazioni di disegno dell'ombra di CG sono, IME, meno di completamente terrificante e meno che completamente deterministico. Mi aspetterei che fosse più veloce di accarezzare il percorso 5 volte con 5 diversi colpi, ma non in modo schiacciante.

Scoprirai quanto vale la realizzazione di questo effetto.