Lihat juga: pertanyaan yang sama di Math.SE
Bagaimana saya bisa menemukan arclength dari kurva Bezier? Misalnya, kurva Bezier linier memiliki panjang:
length = sqrt(pow(x[1] - x[0], 2) + pow(y[1] - y[0], 2));
Tapi bagaimana dengan kurva Bezier kuadratik, kubik, atau n-derajat?
(Tujuan saya adalah memperkirakan resolusi pengambilan sampel sebelumnya, jadi saya tidak perlu membuang waktu memeriksa jika titik berikutnya menyentuh titik sebelumnya.)
mathematics
graphics
beziers
heuristics
Mateen Ulhaq
sumber
sumber
Jawaban:
Cara sederhana untuk Beziers kubik adalah dengan membagi kurva menjadi segmen N dan menjumlahkan panjang segmen.
Namun, segera setelah Anda membutuhkan panjang hanya bagian dari kurva (misalnya hingga 30% dari panjang sepanjang), parameterisasi panjang busur akan ikut berperan. Saya memposting jawaban yang cukup panjang pada salah satu pertanyaan saya sendiri tentang Béziers, dengan kode contoh sederhana.
sumber
1.0/t
(disebutresolution
), jadi itu untuk "realtime" (yang terbaik 10fps pada NXT lambat). Setiap iterasi,,t += resolution
dan titik / garis baru ditarik. Bagaimanapun, terima kasih untuk idenya.Walaupun saya sudah setuju dengan jawaban yang sudah Anda dapatkan, saya ingin menambahkan mekanisme perkiraan sederhana namun kuat yang dapat Anda gunakan untuk kurva Bézier derajat apa pun: Anda terus membagi kurva menggunakan subdivisi de Casteljau hingga jarak maksimum dari titik kontrol dari sub-kurva ke baseline sub-kurva di bawah beberapa epsilon konstan . Dalam hal itu, sub-kurva dapat diperkirakan dengan garis dasarnya.
Sebenarnya, saya percaya ini adalah pendekatan yang biasanya diambil ketika subsistem grafis harus menggambar kurva Bézier. Tetapi jangan mengutip saya tentang hal ini, saya tidak memiliki referensi saat ini.
Dalam praktiknya akan terlihat seperti ini: (kecuali bahasanya tidak relevan)
sumber
Panjang busur untuk kurva Bezier hanya bentuk tertutup untuk yang linier dan kuadratik. Untuk kubik, itu tidak dijamin memiliki solusi tertutup. Alasannya adalah panjang busur didefinisikan oleh integral radikal, yang memiliki tertutup hanya untuk polinomial tingkat 2.
Hanya untuk referensi: Panjang Bezier kuadratik untuk poin (a, p) (b, q) dan (c, r) adalah
Di mana LN adalah logaritma natural, dan ^ menunjukkan kekuatan dan root akar kuadrat.
Oleh karena itu, seharusnya lebih mudah dan lebih murah memperkirakan busur dengan aturan lain, seperti poligon atau skema integrasi seperti aturan Simpson, karena akar kuadrat LN adalah operasi yang mahal.
sumber
Saya mengerjakan bentuk ekspresi tertutup panjang untuk Bezier 3 poin (di bawah). Saya belum mencoba mencari formulir tertutup untuk 4+ poin. Ini kemungkinan besar akan sulit atau rumit untuk diwakili dan ditangani. Namun, teknik pendekatan numerik seperti algoritma integrasi Runge-Kutta akan bekerja cukup baik dengan mengintegrasikan menggunakan rumus panjang busur . T&J saya tentang RK45 tentang MSE dapat membantu implementasi RK45.
Berikut adalah beberapa kode Java untuk panjang busur dari 3 titik Bezier, dengan poin
a
,b
danc
.sumber