Saya telah melihat sekeliling untuk sementara waktu dan saya tidak dapat menemukan solusi untuk masalah ini. Katakanlah saya memiliki kurva bezier kubik (didefinisikan oleh 4 poin) dan saya ingin mendapatkan satu set poin yang berjarak merata di sepanjang kurva. Pikirkan untuk menempatkan teks di sepanjang kurva sebagai contoh.
Sekarang masalahnya adalah bahwa jika saya input t
(nilai interpolasi dari 0-1) dengan kenaikan konstan titik-titiknya tidak merata spasi. Jarak di sepanjang kurva lebih kecil ketika kurva berbelok dan lebih panjang saat kurva lurus.
Jadi bagaimana cara menempatkan titik secara merata di sepanjang kurva bezier?
interpolation
curves
beziers
Foaly
sumber
sumber
t
, katakanlah, 100 langkah, dan mengukur jarak antara titik yang dihasilkan. Kemudian, interpolasi sepanjang polyline ini seperti yang diinginkan.Jawaban:
Ini lebih merupakan pertanyaan matematika. Jadi kurva bezier memiliki rumus berikut , baik dalam komponen
x
dany
.Panjang perjalanan
t
sepanjang kurvagamma
diberikan oleh:Tidak ada solusi yang dapat ditulis manusia untuk integral, jadi Anda harus memperkirakan.
Ganti
gamma(t)
dengan ekspresiB(t)
untuk mendapatkan panjang yanglength_B
ditempuht
sepanjang segmen bezier. Katakanlah itu bergerak dari0
keL
.Sekarang pilih
n
nilai antara0
danL
yang sesuai dengan poin yang berjarak sama. Misalnya, panjang formulirk*L/n
untukk
dari0
hinggan
.Sekarang Anda perlu membalik fungsi
length_B
, sehingga Anda dapat menghitungt
kembali dari panjangnyal
. 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.l[k]
jarak jalur yang diberikan jauh dari titik asal(P0_x,P1_x)
.t[k]
penggunaannya sesuailength_B_inverse
.(B_x(t[k]),B_y(t[k]))
.sumber
Yah sudah beberapa waktu ...
Tapi akhirnya saya bisa menyelesaikan masalah ini!
Semua yang Anda butuhkan ada di pos ini: Memindahkan kapal di antara dua planet sepanjang bezier, kehilangan beberapa persamaan untuk akselerasi
sumber
Hanya untuk memperluas apa yang dikatakan Marco, teknik umum untuk melakukan ini adalah berjalan menyusuri kurva dengan kenaikan yang jauh lebih kecil daripada langkah-langkah panjang tetap yang ingin Anda ambil dan menyimpan titik output yang dihasilkan (dan mungkin jarak?) Dalam sebuah tabel.
Kemudian, Anda pergi melalui tabel dan membuang semua entri kecuali titik-titik yang paling dekat dengan kelipatan bilangan bulat dari jarak yang ingin Anda berjalan.
Maka Anda dibiarkan dengan tabel Anda dapat mengindeks langsung saat runtime dengan sangat cepat. Jika Anda ingin pergi ke tempat yang 5 kali ukuran jarak Anda, Anda melihat di tabel Anda di indeks [5].
Perhatikan bahwa Anda bisa melakukan dua langkah dalam satu dan tidak benar-benar menyimpan item tambahan dalam tabel untuk memulai, tetapi lebih mudah untuk memvisualisasikan dan memahami dalam dua langkah.
Saya pernah melihat teknik untuk benar-benar menghitung ini dengan cepat tanpa menghitung ulang tabel (tidak menggunakan iterasi / root juga!), Tapi sayangnya saya tidak dapat mengingat detailnya sama sekali):
Jika saya ingat atau menemukannya, saya akan memposting info!
sumber
Langkah 1 - Hasilkan poin N + 1 dengan menginterpolasikan kurva dengan kelipatan 1 / N. N harus cukup besar untuk hasil visual yang baik tetapi cukup kecil untuk mudah dihitung. Nilai 50 harus OK untuk sebagian besar situasi tetapi harus disesuaikan untuk kasus khusus Anda. Saya akan menyebutnya "titik interpolasi".
Atau Anda dapat membuat daftar pendek segmen dan secara rekursif memecah setiap segmen yang lebih panjang dari panjang segmen maksimum yang diinginkan (awalnya Anda harus menghasilkan setidaknya empat segmen untuk memperhitungkan kurva S di mana awal sangat dekat dengan akhir).
Langkah 2 - "Jalani garis" menggunakan titik-titik yang diinterpolasi dan jarak yang Anda inginkan di antara setiap titik.
Saya akan meninggalkannya di sini kode Persatuan saya:
sumber
Berikut ini beberapa algoritma yang memberikan hasil yang cukup baik:
sumber