Ini lebih merupakan pertanyaan matematika. Jadi kurva bezier memiliki rumus berikut , baik dalam komponen x
dan y
.
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
Panjang perjalanan t
sepanjang kurva gamma
diberikan oleh:
length_gamma(t) = integration( sqrt( derivative( gamma_x(s) ) ^2 + derivative( gamma_y(s) ) ^2 ) )
Tidak ada solusi yang dapat ditulis manusia untuk integral, jadi Anda harus memperkirakan.
Ganti gamma(t)
dengan ekspresi B(t)
untuk mendapatkan panjang yang length_B
ditempuh t
sepanjang segmen bezier. Katakanlah itu bergerak dari 0
ke L
.
Sekarang pilih n
nilai antara 0
dan L
yang sesuai dengan poin yang berjarak sama. Misalnya, panjang formulir k*L/n
untuk k
dari 0
hingga n
.
Sekarang Anda perlu membalik fungsi length_B
, sehingga Anda dapat menghitung t
kembali dari panjangnya l
. Ini matematika yang cukup banyak dan saya malas sekali, coba lakukan sendiri. Jika tidak bisa, Anda bisa pergi ke pertukaran stack matematika . Untuk jawaban yang lebih lengkap, Anda bisa tetap pergi ke sana.
Setelah Anda memiliki length_B
fungsi terbalik (atau perkiraan yang masuk akal), proses Anda cukup sederhana.
- Buat panjang
l[k]
jarak jalur yang diberikan jauh dari titik asal (P0_x,P1_x)
.
- Hitung
t[k]
penggunaannya sesuai length_B_inverse
.
- Positing poin menggunakan
(B_x(t[k]),B_y(t[k]))
.
t
, katakanlah, 100 langkah, dan mengukur jarak antara titik yang dihasilkan. Kemudian, interpolasi sepanjang polyline ini seperti yang diinginkan.