È più una domanda di matematica. Quindi, una curva di Bézier ha la seguente formula , sia nella x
e y
componente.
B_x(t) = (1-t)^3 * P0_x + (1-t)^2 * t * P1_x + (1-t) * t^2 * P2_x + t^3 * P3_x
B_y(t) = (1-t)^3 * P0_y + (1-t)^2 * t * P1_y + (1-t) * t^2 * P2_x + t^3 * P3_y
La lunghezza percorsa t
lungo una curva gamma
è data da:
length_gamma(t) = integration( sqrt( derivative( gamma_x(s) ) ^2 + derivative( gamma_y(s) ) ^2 ) )
Non esiste una soluzione scrivibile dall'uomo all'integrale, quindi è necessario approssimarsi.
Sostituisci gamma(t)
con l'espressione B(t)
per ottenere la lunghezza length_B
percorsa t
lungo il segmento più bezier. Diciamo che viaggia da 0
a L
.
Ora scegli i n
valori tra 0
e L
che corrispondono ai punti equidistanti. Ad esempio, lunghezze del modulo k*L/n
per k
da 0
a n
.
Ora è necessario invertire la funzione length_B
, in modo da poter calcolare la parte t
posteriore dalla lunghezza l
. È un bel po 'di matematica e io sono pigro da morire, prova a farlo da solo. Se non ci riesci, puoi andare allo scambio di stack matematici . Per una risposta più completa, puoi comunque andare lì.
Una volta che hai quella length_B
funzione inversa (o un'approssimazione ragionevole), il tuo processo è abbastanza semplice.
- Crea lunghezze
l[k]
della distanza del percorso data lontano dall'origine (P0_x,P1_x)
.
- Calcola il loro
t[k]
utilizzo corrispondente length_B_inverse
.
- Positivo usando i punti
(B_x(t[k]),B_y(t[k]))
.
t
di, diciamo, 100 passi e misurando le distanze tra i punti risultanti. Quindi, interpolare lungo questa polilinea come desiderato.