Ketika saya membutuhkan perkiraan kelengkungan jala untuk pelindung kulit, algoritme yang akhirnya saya gunakan adalah:
Pertama, saya menghitung kelengkungan skalar untuk masing-masing tepi di jala. Jika tepi memiliki posisi dan normals , maka saya memperkirakan kelengkungannya sebagai:n 1 , n 2hal1, hal2n1, n2
kelengkungan = ( n2- n1) ⋅ ( hlm2- hal1)| hal2- hal1|2
Ini menghitung perbedaan normals, diproyeksikan di sepanjang tepi, sebagai sebagian kecil dari panjang tepi. (Lihat di bawah untuk mengetahui bagaimana saya menghasilkan formula ini.)
Kemudian, untuk setiap titik saya melihat lekukan dari semua sisi yang menyentuhnya. Dalam kasus saya, saya hanya menginginkan perkiraan skalar dari "kelengkungan rata-rata", jadi saya akhirnya mengambil rata-rata geometrik dari nilai absolut dari semua kelengkungan tepi pada setiap titik. Untuk kasus Anda, Anda mungkin menemukan lengkungan minimum dan maksimum, dan menjadikan tepian tersebut sebagai arah lengkungan utama (mungkin orthonormalisasi dengan lengkungan normal). Itu agak kasar, tetapi mungkin memberi Anda hasil yang cukup baik untuk apa yang ingin Anda lakukan.
Motivasi untuk rumus ini adalah melihat apa yang terjadi dalam 2D ketika diterapkan pada lingkaran:
Misalkan Anda memiliki lingkaran jari-jari (jadi kelengkungannya adalah ), dan Anda memiliki dua titik pada lingkaran, dengan normalnya . Posisi titik-titik tersebut, relatif terhadap pusat lingkaran, akan menjadi dan , karena properti yang selalu oleh sebuah lingkaran atau bola normal langsung dari pusatnya.1 / r n 1 , n 2 p 1 = r n 1 p 2 = r n 2r1 / rn1, n2hal1= r n1hal2= r n2
Karenanya Anda dapat memulihkan jari-jari sepertiatau. Tetapi secara umum, posisi titik tidak akan relatif ke pusat lingkaran. Kita dapat mengatasinya dengan mengurangi keduanya:
| p 2 | / | n 2 | p 2 - p 1r = | hal1| / | n1|| hal2| / | n2|
hal2- hal1rkelengkungan = 1r= r n2- r n1= r ( n2- n1)= | hal2- hal1|| n2- n1|= | n2- n1|| hal2- hal1|
Hasilnya tepat hanya untuk lingkaran dan bola. Namun, kami dapat memperluasnya untuk membuatnya sedikit lebih "toleran", dan menggunakannya pada jerat 3D sewenang-wenang, dan tampaknya berfungsi dengan cukup baik. Kita dapat membuat rumus lebih "toleran" dengan terlebih dahulu memproyeksikan vektor ke arah tepi, . Hal ini memungkinkan kedua vektor ini tidak sejajar persis (seperti yang ada dalam case lingkaran); kami hanya akan memproyeksikan komponen yang tidak paralel. Kita dapat melakukan ini dengan memberi titik dengan vektor tepi yang dinormalisasi:
p 2 - p 1 kelengkungann2- n1hal2- hal1
lengkungan= ( n2- n1) ⋅ normalisasi ( hlm2- hal1)| hal2- hal1|= ( n2- n1) ⋅ ( hlm2- hal1) / | hal2- hal1|| hal2- hal1|= ( n2- n1) ⋅ ( hlm2- hal1)| hal2- hal1|2
Juga, ada rumus yang muncul di bagian atas jawaban ini. Ngomong-ngomong, manfaat samping yang bagus dari menggunakan proyeksi yang ditandatangani (produk titik) adalah bahwa formula kemudian memberikan kelengkungan yang ditandatangani: positif untuk cembung, dan negatif untuk permukaan cekung.
Pendekatan lain yang dapat saya bayangkan menggunakan, tetapi belum mencoba, adalah memperkirakan bentuk dasar kedua permukaan pada setiap titik. Ini dapat dilakukan dengan menyiapkan basis garis singgung pada titik, kemudian mengubah semua titik bertetangga menjadi ruang garis singgung itu, dan menggunakan kuadrat-terkecil untuk menemukan matriks 2FF yang paling cocok. Maka arah kelengkungan utama akan menjadi vektor eigen dari matriks itu. Ini tampaknya menarik karena ini bisa membiarkan Anda menemukan arah kelengkungan "tersirat" oleh simpul-simpul yang bertetangga tanpa ada ujung yang secara jelas menunjuk ke arah itu, tetapi di sisi lain ada lebih banyak kode, lebih banyak perhitungan, dan mungkin kurang kuat secara numerik.
Sebuah makalah yang mengambil pendekatan ini adalah Rusinkiewicz, "Estimasi Kelengkungan dan Derivatifnya pada Segitiga Jerat" . Ia bekerja dengan memperkirakan matriks 2FF paling cocok per segitiga, kemudian rata-rata matriks per-verteks (mirip dengan bagaimana normals halus dihitung).
Hanya dengan menambahkan cara lain ke jawaban @NathanReed yang luar biasa, Anda dapat menggunakan lekukan rata-rata dan gaussian yang dapat diperoleh dengan Laplace-Beltrami yang terpisah.
Jadi misalkan lingkungan 1-cincin di jala Anda terlihat seperti inivsaya
Sekarang mari kita panggil fungsi yang didefinisikan oleh mesh Anda (harus menjadi manifold terdiferensiasi) pada titik tertentu. Diskretisasi yang paling populer dari operator Laplace-Beltrami yang saya tahu adalah diskretisasi cotangent dan diberikan oleh:f( vsaya)
Lengkungan Gaussian adalah:
Setelah semua rasa sakit ini, lengkungan diskrit utama diberikan oleh:
Jika Anda tertarik pada subjek (dan untuk menambahkan beberapa referensi ke posting ini) bacaan yang sangat baik adalah: Operator Geometri Diferensial Diskrit untuk Manifold-Segitiga 2 [Meyer et al. 2003].
Untuk gambar-gambar itu saya berterima kasih kepada mantan profesor saya Niloy Mitra karena saya menemukannya dalam beberapa catatan yang saya ambil untuk kuliahnya.
sumber
@ Nathan-Reed: Hanya pertanyaan untuk jawaban Nathan-Reed: mengapa Anda menggunakan mean geometrik? Apakah itu karena "model" setelah kelengkungan Gaussian?
sumber