Pek çok parametrik yörünge için bu soruna bir çözüm bulmak mümkündür. Buradaki fikir şudur: Bir eğri üzerinde yeterince derin zoom yaparsanız, eğrinin kendisini o noktadaki teğetinden söyleyemezsiniz.
Bu varsayımı yaparak, precompute şey (kübik Bezier eğrileri için üç, ikiden fazla vektör gerek yoktur vb ).
Bu yüzden M(t) eğrisi için teğet vektörünü d M hesaplıyoruz.dMdtt∥dMdT∥Δt∥dMdT∥ΔtLL÷∥dMdT∥
Uygulama: ikinci dereceden Bezier eğrisi
Bezier eğrisinin kontrol noktaları , ve ise, yörünge şöyle ifade edilebilir:ABC
M( t )= ( 1 - t )2A + 2 t ( 1 - t ) B + t2C= t2( A - 2 B + C) + t ( - 2 A + 2 B ) + A
Yani türev:
dMdt= t ( 2 A - 4 B + 2 C) + ( - 2 A + 2 B )
Yalnızca bir yerde ve vektörlerini saklamanız gerekir . Sonra, belirli bir , uzunluğunu ilerletmek istiyorsanız , şunları yapın: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)
Kübik Bezier eğrileri
Aynı akıl yürütme dört , , ve kontrol noktalarına sahip bir eğri için de geçerlidir :birBCD
M( t )= ( 1 - t )3A + 3 t ( 1 - t )2B + 3 t2( 1 - t ) C+ t3D= t3( - A + 3 B - 3 C+ D ) + t2( 3 A - 6 B + 3 C) + t ( - 3 A + 3 B ) + A
Türev:
dMdt= t2( - 3 A + 9 B - 9 C+ 3 D ) + t ( 6 A - 12 B + 6 C) + ( - 3 A + 3 B )
Üç vektörü önceden hesaplıyoruz:
v⃗ 1v⃗ 2v⃗ 3= - 3 A + 9 B - 9 C+ 3 D=6A−12B+6C=−3A+3B
ve son formül:
t=t+Llength(t2⋅v⃗ 1+t⋅v⃗ 2+v⃗ 3)
Doğruluk sorunları
Makul bir kare hızında çalışıyorsanız, (kare süresine göre hesaplanmalıdır), yaklaşık çalışmanın çalışması için yeterince küçük olacaktır.L
Ancak, aşırı durumlarda yanlışlıklar yaşayabilirsiniz. Eğer çok büyük, sen 10 parçalar kullanarak, örneğin hesaplama parçalı yapabilirsiniz:L
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);