Dimungkinkan untuk memperkirakan solusi untuk masalah ini untuk sebagian besar lintasan parametrik. Idenya adalah sebagai berikut: jika Anda memperbesar cukup dalam pada kurva, Anda tidak bisa membedakan kurva itu sendiri dari garis singgung pada titik itu.
Dengan membuat asumsi ini, tidak perlu untuk melakukan perhitungan lebih dari dua vektor (tiga untuk kurva Bezier kubik, dll .).
Jadi untuk kurva kita menghitung vektor singgung pada titik . Norma dari vektor ini adalah dan karenanya jarak yang ditempuh untuk durasi dapat diperkirakan sebagai . Oleh karena itu jarak ditempuh untuk durasi .M.( t )dM.dtt∥ dM.dT∥Δ t∥ dM.dT∥ Δ tL.L ÷ ∥ dM.dT∥
Aplikasi: kurva Bezier kuadratik
Jika titik kontrol dari kurva Bezier adalah , dan , lintasan dapat dinyatakan sebagai:SEBUAHBC
M.(t )= ( 1 - t )2A + 2 t ( 1 - t ) B + t2C= t2( A - 2 B + C) + t ( - 2 A + 2 B ) + A
Jadi turunannya adalah:
dM.dt= t ( 2 A - 4 B + 2 C) + ( - 2 A + 2 B )
Anda hanya perlu menyimpan vektor dan suatu tempat. Kemudian, untuk diberikan , jika Anda ingin memajukan panjang , Anda lakukan: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)
Kurva Bezier Kubik
Alasan yang sama berlaku untuk kurva dengan empat titik kontrol , , dan :SEBUAHBCD
M.( t )= ( 1 - t )3A + 3 t ( 1 - t )2B + 3 t2(1−t)C+t3D=t3( - A + 3 B−3C+ D ) +t2( 3 A - 6 B +3C) + t ( - 3 A + 3 B ) + A
Derivatifnya adalah:
dM.dt= t2(−3A+9B−9C+3D)+t(6A−12B+6C)+(−3A+3B)
Kami precompute tiga vektor:
v⃗ 1v⃗ 2v⃗ 3= - 3 A + 9 B - 9C+ 3 D= 6 A - 12 B + 6 C= - 3 A + 3 B
dan formula terakhirnya adalah:
t = t + Ll e ngt h ( t2⋅ v⃗ 1+ t ⋅ v⃗ 2+ v⃗ 3)
Masalah akurasi
Jika Anda menjalankan framerate yang masuk akal, (yang harus dihitung sesuai dengan durasi frame) akan cukup kecil agar aproksimasi bekerja.L.
Namun, Anda mungkin mengalami ketidakakuratan dalam kasus-kasus ekstrem. Jika terlalu besar, Anda dapat melakukan perhitungan sedikit demi sedikit, misalnya menggunakan 10 bagian:L.
for (int i = 0; i < 10; i++)
t = t + (L / 10) / length(t * v1 + v2);