Il est possible d'approcher une solution à ce problème pour la plupart des trajectoires paramétriques. L'idée est la suivante: si vous zoomez assez profondément sur une courbe, vous ne pouvez pas distinguer la courbe elle-même de sa tangente à ce point.
En faisant cette hypothèse, il n'est pas nécessaire de précalculer plus de deux vecteurs (trois pour les courbes de Bézier cubiques, etc. ).
Donc pour une courbe M(t) on calcule son vecteur tangent dMdtt∥ dMréT∥Δ t∥ dMréT∥ Δ tLL ÷ ∥ dMréT∥
Application: courbe de Bézier quadratique
Si les points de contrôle de la courbe de Bézier sont , et , la trajectoire peut être exprimée comme:UNEBC
M( t )= ( 1 - t )2A + 2 t ( 1 - t ) B + t2C= t2( A - 2 B + C) + t ( - 2 A + 2 B ) + A
La dérivée est donc:
réMrét= t ( 2 A - 4 B + 2 C) + ( - 2 A + 2 B )
Il vous suffit de stocker les vecteurs et quelque part. Alors, pour un donné , si vous voulez avancer d'une longueur , vous faites:v⃗ 1= 2 A - 4 B + 2 Cv⃗ 2= - 2 A + 2 BtL
t = t + Ll e n gt h ( t ⋅ v⃗ 1+ v⃗ 2)
Courbes cubiques de Bézier
Le même raisonnement s'applique à une courbe avec quatre points de contrôle , , et :UNEBCré
M( t )= ( 1 - t )3A + 3 t ( 1 - t )2B + 3 t2( 1 - t ) C+ t3ré= t3( - A + 3 B - 3 C+ D ) + t2( 3 A - 6 B + 3 C) + t ( - 3 A + 3 B ) + A
Le dérivé est:
réMrét= t2( - 3 A + 9 B - 9 C+ 3 D ) + t ( 6 A - 12 B + 6 C) + ( - 3 A + 3 B )
Nous précalculons les trois vecteurs:
v⃗ 1v⃗ 2v⃗ 3= - 3 A + 9 B - 9 C+ 3 D=6A−12B+6C=−3A+3B
et la formule finale est:
t=t+Llength(t2⋅v⃗ 1+t⋅v⃗ 2+v⃗ 3)
Problèmes de précision
Si vous utilisez une fréquence d'images raisonnable, (qui doit être calculé en fonction de la durée de la trame) sera suffisamment petit pour que l'approximation fonctionne.L
Cependant, vous pouvez rencontrer des inexactitudes dans des cas extrêmes. Si est trop grand, vous pouvez faire le calcul par morceaux, par exemple en utilisant 10 parties:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);