2012-03-19 11 views
7

Sto provando a smussare i percorsi nella grafica di base. Qualcuno lo ha già fatto per forme arbitrarie e, in caso affermativo, sono disposti a condividere il codice?Smussare un tracciato/forma in Core Graphics

Ho incluso la mia implementazione di seguito. Io uso tre variabili per determinare lo smusso: CGFloat bevelSize, UIColor highlightColor, UIColor shadow. Si noti che l'angolo della fonte di luce è sempre di 135 gradi. Non ho ancora finito di implementare questo, ma qui è essenzialmente quello che sto cercando di fare, diviso in due parti. Prima parte, genera punti focali:

  1. Trovo le bisettrici per gli angoli tra le linee adiacenti nel percorso.
  2. Per gli archi, la bisettrice è la linea perpendicolare alla linea creata dai due punti finali dell'arco, originata dal punto centrale. Questo dovrebbe occuparsi della maggior parte delle situazioni in cui viene utilizzato un arco. Non prendo la bisettrice di un arco e una linea. La bisettrice dovrebbe funzionare bene in questi casi.
  3. Quindi calcolo i punti focali in base all'intersezione di ciascuna bisettrice adiacente.
  4. Se un punto focale è all'interno della forma utilizzata, altrimenti viene scartato.

Lo scopo di generare i punti focali è "ridurre" la forma in modo proporzionale.

La seconda parte è un po 'più complicata. È essenziale creare ciascun lato/segmento della forma smussata. Lo faccio disegnando 'in' (dallo bevelSize) ogni punto della forma originale lungo il raggio della linea che si estende dal punto focale più vicino al punto in questione. Quando ho due "bevelPoints" consecutivi, creo un UIBezierPath che si estende dai punti smussati ai punti originali e torna ai punti smussati (nota, questo include gli archi). Questo crea un "lato/segmento" che posso usare per riempire. Sui lati dritti, semplicemente riempio con l'ombra o il colore di evidenziazione, a seconda dell'angolo del lato. Per gli archi, determino l'arco "radiante". Se quell'arco contiene un angolo di transizione (M_PI_4 o M_PI + M_PI_4) lo riempio con una sfumatura (dall'ombra all'evidenziazione o evidenzia l'ombra, che è sempre appropriata). Altrimenti lo riempio con un colore solido.

Aggiornamento

ho diviso la mia risposta (vedi sotto) in un post sul blog a parte. Non sto più utilizzando i dettagli di implementazione che vedi sopra, ma sto mantenendo tutto lì per riferimento. Spero che questo aiuti chiunque stia cercando di usare Core Graphics.

+0

La domanda è lunga e include molti dettagli. Puoi semplificarlo a tutti? –

+0

Sort of. La prima parte della domanda è la domanda principale: qualcuno sa come smussare una forma arbitraria in core-graphics? Il resto sta solo descrivendo come ho implementato lo smussamento (che ho finito ora). Funziona bene su alcune forme (ma non tutte). Sto lasciando la domanda aperta nel caso qualcuno abbia un metodo. –

+0

Ho pensato di pubblicare la mia soluzione, ma sono solo circa 400 righe di codice ... sembra molto da pubblicare. –

risposta

3

Così finalmente sono riuscito a scrivere una routine per smussare forme arbitrarie nella grafica di base. Ha finito per essere un sacco di lavoro, molto più di quanto inizialmente previsto, ma è stato un progetto divertente. Ho pubblicato una spiegazione e il codice per eseguire la smussatura sul mio blog. Basta notare che non ho creato una classe completa (o una serie di classi) per questo. Questo codice è stato integrato in una classe molto più ampia che uso per fare tutto il mio disegno grafico di base. Tuttavia, tutto il codice necessario per smussare la maggior parte delle forme arbitrarie è lì.

UPDATE

Ho riscritto il codice come c dritto e si è trasferito in un file separato. Non dipende più da altre variabili di istanza, in modo che la funzione di smussatura possa essere richiamata da qualsiasi contesto.

spiego il codice e il processo che ho usato per smussare qui: Beveling Shapes In Core Graphics

Ecco il codice: Github : CGPathBevel.

Il codice non è perfetto: sono aperto a suggerimenti/correzioni/modi migliori di fare le cose.

+0

sembra fantastico. Dovrò provarlo presto. Grazie! +1 –

Problemi correlati