Kurva melingkar urutan ke-2

Seperti yang Anda ketahui , kurva Bezier tidak dapat membentuk busur lingkaran atau elips. Artikel ini membahas kurva yang tidak memiliki kerugian ini.







Kurva Bezier



Logika di balik konstruksi kurva Bezier dipahami dengan baik dari animasi berikut:







Untuk mendapatkan rumus langsung dari representasi grafis, cukup dengan mendefinisikan fungsi tambahan untuk interpolasi linier antara dua titik, di mana, ketika parameter t berubah dari 0 ke 1, ia mengembalikan nilai antara dari a ke b :



msayax(Sebuah,b,t)=Sebuah(1-t)+bt

Catatan
- lerp, blend, mix - . .




Dengan bantuannya, Anda dapat secara konsisten menemukan poin yang diperlukan - penemuan pertama

Sebuahc=msayax(Sebuah,c,t)

dan

cb=msayax(dari,b,t)



dan kemudian melalui mereka temukan

d=msayax(Sebuahc,cb,t)



Jika diinginkan, Anda dapat mengganti fungsi satu sama lain dan mengurangi - meskipun ini tidak terlalu menyederhanakan penghitungan, ini akan memungkinkan Anda untuk menggeneralisasi kurva ke sejumlah titik kontrol yang berubah-ubah (melalui polinomial Bernstein). Dalam kasus kami, kami mendapatkan



d=Sebuah(1-t)2+bt2+2ct(1-t)



Meningkatkan urutan kurva dicapai dengan mudah - titik awal tidak ditetapkan konstan, tetapi sebagai hasil interpolasi antara n + 1 titik kontrol lainnya:





Catatan
, . .


Kurva melingkar





Busur lingkaran



Untuk membangun busur lingkaran dengan cara yang sama, perlu untuk menentukan logika konstruksi yang sesuai - dengan analogi menggambar lingkaran dengan kompas.





Awalnya, kita tidak mengetahui pusat lingkaran d - itu ditemukan melalui perpotongan tegak lurus dengan garis singgung pada titik a dan b (selanjutnya disebut nodal); garis singgung itu sendiri ditentukan menggunakan butir c (selanjutnya disebut pedoman). Untuk membuat busur lingkaran acak (kurang dari 180 Β°), jarak dari titik arah ke titik nodal cukup sama.





Busur elips



Membuat busur elips sudah lebih sulit - Anda memerlukan dua vektor yang berputar ke arah yang berbeda ( detail selengkapnya di sini )





Dengan menggunakan metode di atas untuk menemukan titik d , kita tidak dapat lagi membangun busur elips yang berubah-ubah - hanya dari 0 Β° hingga 90 Β° (termasuk diputar dengan sudut tertentu).



Busur hipotrokoid



Menetapkan kondisi bahwa pada awal dan akhir gambar vektor harus berada pada satu garis lurus, kita mendapatkan busur hipotrokoid di semua kasus lainnya. Kondisi ini tidak disengaja dan (selain definisi unik dari kurva) menjamin kebetulan dari garis singgung di titik-titik nodal. Akibatnya, jalur sudut yang dilalui kedua vektor akan berbeda, tetapi tetap berjumlah 180 Β°.





Bagaimana bentuk kurva berubah tergantung posisi titik panduan dapat dilihat pada animasi berikut:







Algoritma



Karena di sini kita memiliki rotasi pada bidang dua dimensi, akan lebih mudah untuk mendeskripsikan matematika konstruksi kurva ini dalam bentuk bilangan kompleks.



1) temukan titik perpotongan dari garis-garis normal garis singgung yang ditarik dari titik arah ke titik-titik nodal:



d=(2Sebuah-c)(c-b)Sebuahβˆ—+(2b-c)(Sebuah-c)bβˆ—-c(Sebuah-b)cβˆ—(c-b)Sebuahβˆ—+(Sebuah-c)bβˆ—-(Sebuah-b)cβˆ—

(di sini tanda bintang berarti konjugasi kompleks).



2) mengetahui d , kami menemukan panjang normals



riklan=|Sebuah-d|

rbd=|b-d|





dan jumlah serta perbedaannya



rm=12(riklan+rbd)

rs=12(riklan-rbd)





3) Tentukan vektor satuan dari mana konstruksi dimulai



v=Sebuah-d|Sebuah-d|



Catatan
sign(x).





4) temukan jalur sudut yang harus dilewati masing-masing vektor



Ο•m=arg⁑(Sebuah-db-d)

Ο•s=arg⁑(-Sebuah-db-d)



Catatan
, β€” . β€” , . . .



, β€” , - ; .



. ,

arg⁑(Sebuah-d)-arg⁑(b-d)



β€” - .


5) secara berurutan mengubah t dari 0 ke 1 dengan beberapa langkah, kita menemukan titik yang termasuk dalam kurva dengan rumus



d+v(rme-sayatΟ•m+rse-sayatΟ•s)





Splines melingkar



Sama seperti kurva BΓ©zier, kurva ini dapat digabungkan untuk membuat splines yang kontinu sedikit demi sedikit. Untuk memastikan kelancaran pada titik jangkar (docking), titik jangkar harus sejajar dengan dua titik arah yang berdekatan. Untuk melakukan ini, Anda dapat menentukan titik jangkar tidak secara eksplisit, tetapi melalui interpolasi titik panduan. Mereka juga tidak dapat ditentukan sama sekali, menghitung sepenuhnya secara otomatis - misalnya, sebagai rata-rata antara titik panduan:







Di sebelah kanan, untuk perbandingan, pendekatan yang sama digunakan dengan kurva Bezier urutan ke-2.



Catatan dan nuansa



Tidak seperti kurva Bezier, di sini kurva tidak selalu berada dalam bentuk garis yang menghubungkan titik kontrol, misalnya





Selain itu, ada kasus kemunduran yang perlu ditangani secara terpisah - ketika titik arah terletak pada garis yang sama dengan titik jangkar. Dalam hal ini, kurva merosot menjadi garis lurus, dan ketika mencoba menghitung titik d , terjadi pembagian dengan nol.



Kurva ini juga memiliki batasan pada kelengkungan garis, karena algoritme memilih jalur terkecil untuk diikuti dan kurva tidak dapat berputar lebih dari 180 Β°. Hal ini mengarah pada fakta bahwa dengan interpolasi terus menerus sedikit demi sedikit, sudut tajam dapat terjadi pada posisi tertentu dari titik arah (di sebelah kanan - titik yang sama untuk Bezier):







Kesimpulan



Pengembangan lebih lanjut dari metode yang dipertimbangkan untuk membuat kurva adalah peningkatan jumlah vektor yang terlibat dalam konstruksi kurva dan, karenanya, peningkatan jumlah titik arah. Namun, tidak seperti kurva Bezier, meningkatkan urutan di sini tidaklah jelas dan memerlukan refleksi bijaksana yang terpisah. Berbagai metode untuk menggabungkannya dengan kurva Bezier juga dimungkinkan - khususnya, interpolasi dari pusat lingkaran vektor gambar.



Metode yang dipertimbangkan untuk membangun kurva juga bukan satu-satunya, kasus tertentu di antaranya adalah busur lingkaran dan elips - setidaknya elips dapat dibangun melalui persimpangan garis lurus dalam jajaran genjang(namun, penulis gagal dalam versi ini). Ada kemungkinan bahwa ada solusi lain, termasuk opsi yang dijelaskan dalam artikel - tulis di komentar jika Anda mengetahui sesuatu tentang topik ini.



Kode sumber untuk artikel tersebut dapat diunduh dari GitHub .



All Articles