Questo è per un'applicazione iPad, ma è essenzialmente una domanda di matematica.Uso di una curva di Bezier per disegnare una spirale
Ho bisogno di disegnare un arco circolare di larghezza della linea variabile (che aumenta in modo monotono). All'inizio della curva, avrebbe uno spessore iniziale (diciamo 2pts) e quindi lo spessore aumenterebbe gradualmente fino alla fine dell'arco dove sarebbe al suo massimo spessore (diciamo 12pts).
Credo che il modo migliore per farlo è creare un UIBezierPath e riempire la forma. Il mio primo tentativo è stato quello di utilizzare due archi circolari (con centri di offset), che funzionavano bene fino a 90 °, ma l'arco sarebbe spesso compreso tra 90 ° e 180 °, in modo che l'approccio non lo tagli.
mio approccio attuale è quella di fare una leggera spirale (uno leggermente crescente dall'arco circolare ed uno leggermente restringimento) utilizzando quad bezier o curve cubiche. La domanda è dove inserisco i punti di controllo in modo che la deviazione dall'arco circolare (ovvero la forma "spessore") sia il valore desiderato.
Vincoli:
- La forma deve essere in grado di iniziare e terminare in un angolo arbitrario (entro 180 ° l'uno dall'altro)
- Il "spessore" della forma (deviazione dal cerchio) deve iniziare e terminare con i valori indicati
- il "spessore" deve aumentare in modo monotono (non si può ottenere più grande e quindi più piccolo di nuovo)
- ha a guardare liscia per l'occhio, non ci può essere alcun curve strette
Sono aperto anche ad altre soluzioni.
Questo sembra davvero fantastico! Mi hai salvato un bel po 'di lavoro. Questo è molto più semplice dell'approccio su cui stavo lavorando (risolvendo le equazioni polinomiali di Bezier per la spirale). Ho funzionato per multipli di 90 °, ma gli angoli arbitrari sarebbero stati un dolore. Questo è molto meglio ... –
@JonHull Sono contento che ti piaccia. Mi sono appena reso conto che ho assunto implicitamente che 'endingThickness> = startingThickness', ma dovresti facilmente essere in grado di organizzare i tuoi parametri di input in modo che questa condizione sia soddisfatta. In caso contrario, potrebbero verificarsi scenari in cui "projectedEndingThickness" è negativo e quindi non posso più essere certo dell'algebra. Potrebbe ancora funzionare, ma non l'ho provato. – inwit
Oh ottimo lavoro fratello ,,, sei un vero risparmiatore di vita ,,, grazie – Dhiru