Come si determinerebbe la lunghezza di un percorso?


11

Ho un gioco che richiede a ciascun giocatore di muoversi lungo un percorso specificato. Traccio il percorso usando le curve di Bézier. Come posso determinare la lunghezza totale reale (non lineare) del percorso e la distanza che ogni giocatore ha fatto? (La distanza tra il punto iniziale e un punto specificato sul percorso.)

AGGIORNARE:

Il percorso è rappresentato in un piano cartesiano (2D).


Alla

Risposte:


7

Come dicevano le risposte precedenti, calcolare la lunghezza di una curva di Bezier è difficile ( impossibile ?). Direi che il 100% dei giochi utilizza un'approssimazione della lunghezza, che è praticamente sempre abbastanza accurata.

Qualche mese fa l'ho implementato usando l'approccio proposto di spezzare la curva in "piccoli" segmenti e aggiungerne la lunghezza. C'è un esempio di implementazione C ++ qui .


11

Misurare la lunghezza di una curva di Bezier è difficile. Se non ti dispiace una leggera inesattezza, una soluzione semplice sarebbe quella di approssimare le curve di Bezier con linee rette e calcolare la somma delle lunghezze delle linee. Più segmenti crei, migliore sarà l'approssimazione.


Potrei considerarlo, ma come posso determinare quanti segmenti dovrei avere e come posso mappare i segmenti in modo che abbiano il loro punto iniziale e finale sul mio percorso? Questa tecnica ha un nome? (quindi cerco su Google)
Valentin Radu,

Un approccio semplice sarebbe quello di usare solo una distribuzione lineare di punti da B (0) a B (1) ... molto simile a qualcosa che useresti per tracciare la curva. Guarda il codice sorgente nella risposta di Dan.
Bummzack,

Gradirei una spiegazione del voto
negativo

7

La parametrizzazione della lunghezza della spline di ordine superiore (cioè maggiore del 1 ° ordine) deve essere approssimata; non può essere rappresentato direttamente, quindi il fatto che non è facile trovare soluzioni dirette a questo.

Alcune implementazioni esistenti (codice copia-incolla):

Utilizzando le approssimazioni di Chebyshev , secondo gli autori, la precisione aumenta all'aumentare della dimensione della curva. Guarda pseudocodice 7-8, il resto è una descrizione di altri algoritmi su cui hanno basato il loro approccio che puoi ignorare. Numerosi riferimenti online si riferiscono a questo metodo come valido.

Vedi anche questi approcci concisi.


5

Questo è iniziato come un commento al commento sulla risposta di @ bummzack, ma è cresciuto troppo a lungo.

come posso determinare quanti segmenti dovrei avere

Esistono due approcci. Il primo è solo l'algoritmo standard per il rendering di una curva di Bézier: i punti di controllo formano un riquadro di delimitazione della curva, quindi se tutti i punti di controllo si trovano all'interno di epsilon del segmento di linea dal punto iniziale al punto finale, si approssimano come una linea; altrimenti si suddivide usando l'algoritmo di de Casteljau. Epsilon è scelto in base all'errore desiderato nel risultato finale. (Per il rendering è di solito 0,5 pixel).

L'altro approccio è un perfezionamento di quello usando l'aritmetica di intervallo. Prendi la lunghezza della linea dall'inizio alla fine come limite inferiore e la somma delle lunghezze delle linee attraverso i punti di controllo come limite superiore. Ancora una volta, suddividere come richiesto dai requisiti di errore finali.

Uno si divide normalmente in t = 0,5, ma l'algoritmo di de Casteljau consente di dividere in qualsiasi punto, quindi se si dispone di un Bézier cubo con punti di controllo da C_0 a C_3 e C_2 è molto più vicino al segmento di linea tra gli endpoint rispetto a C_1 si potrebbe trovare che la divisione in uno di 1/3 o 2/3 dà limiti più stretti. Non ho lavorato sull'algebra per giustificare quale sarebbe meglio, ma puoi provare e riferire se vuoi. Se non altro, volevo sottolineare che l'opzione è lì.


3

Il calcolo della lunghezza di una curva parametrizzata può essere effettuato prendendo l'integrale di sqrt ((dx / dt) ² + (dy / dt) ²), dove dx / dt è la derivata del componente x della curva e dy / dt è la derivata del componente y della curva. Nel caso di una spline di Bézier, questi due sono gli stessi, poiché l'equazione può essere estesa a qualsiasi dimensione.

La formula per una spline cubica di Bézier è la seguente: B (t) = (1 - t³) * P0 + 3 (1 - t) ²t * P1 + 3 (1 - t) t² * P2 + t³ P3 dove P0 attraverso P3 sono i punti di controllo.

Secondo Wolfram | Alpha, la derivata di questa formula è: d (B (t)) / dt = 3 (t (t (P3 - P0) + P2 (2 - 3t) + P1 (3t² - 4t + 1))

Ora puoi rimetterlo nell'equazione per la lunghezza di una curva e calcolare l'integrale da t = 0 a t = 1. Sfortunatamente, Wolfram | Alpha scade quando provo a farlo. È possibile eseguire l'integrazione numerica, tuttavia.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.