TL; DR Anda harus mengimplementasikan operasi boolean menggunakan pohon BSP.
Nah, sepertinya kita berbicara tentang Geometri Padat Konstruktif di sini. Saya telah mengimplementasikan CSG di tingkat komersial jadi saya tahu satu atau dua hal tentang itu.
Makalah klasik tentang CSG disebut Menggabungkan BSP Pohon Menghasilkan Operasi Set Polyhedral , sejujurnya itu terlalu banyak untuk dijelaskan di sini, tetapi secara singkat algoritma membahas tentang poligon yang terletak pada bidang yang sama dengan partisi ruang biner, pada dasarnya membangun pohon BSP dari setiap mesh poligonal. Langkah kedua adalah menggabungkan pohon-pohon BSP; Anda cukup mengambil satu pohon dan memasukkannya ke yang lain. Algoritme kemudian mulai menjelaskan bagaimana menangani setiap node daun untuk membagi dan mengurangi node, node yang tidak diperlukan dalam bentuk akhir akan dihapus, yang lain akan diberikan induk yang sesuai.
Tapi tunggu! Makalah itu pada dasarnya berbicara tentang jerat poligonal dan bidang 3D, TIDAK?
Algoritme dapat digeneralisasi ke dimensi apa pun, jadi dalam kasus 2D Anda, mudah untuk menggunakan segmen garis daripada bidang sebagai partisi biner. Jadi setiap poligon akan dikonversi menjadi pohon BSP daripada keduanya akan digabungkan. Akhirnya Anda melintasi pohon yang dihasilkan untuk menghasilkan poligon akhir,
Perhatikan bahwa algoritma dan CSG ini secara umum tidak berurusan dengan rendering dan mesh wajah secara langsung dan tidak benar-benar rendering siap, jadi Anda perlu mengekstraksi wajah pohon BSP akhir. Saya juga menemukan ray menelusuri pendekatan yang lebih mudah untuk memberikan hasil CSG, Anda hanya perlu sinar untuk melintasi pohon alih-alih mengekstraksi dan benar-benar membelah wajah (ingat kita hanya berurusan dengan partisi biner).
Mengenai ketahanan numerik. Baik untuk dicatat bahwa ada dua jenis perhitungan geometris,
- Yang didasarkan pada konstruksi, Anda membangun bentuk berdasarkan hasil dari operasi sebelumnya. Misalnya
y = sqrt(x)
dan kemudian digunakan y
dalam operasi baru. Ini disebut konstruksi; masalahnya adalah bahwa kesalahan numerik akan terakumulasi dengan cepat.
- Atau ada operasi yang menggunakan predikat sebagai gantinya, pada dasarnya alih-alih menggunakan konstruksi Anda hanya bertanya apakah suatu kondisi benar / salah dan menggunakan nilai yang sama dalam operasi yang berbeda. Tes klasik meliputi incircle dan tes orientasi; ini juga diduga kesalahan numerik terutama jika Anda menggunakan presisi tunggal atau ganda tetapi biasanya akan memberikan hasil yang jauh lebih baik. solusi lain yang bervariasi pada kecepatan dan akurasi yang ada. Berikut adalah salah satu makalah terbaru yang menghindari konstruksi dengan menggunakan geometri berbasis bidang untuk memberikan hasil yang akurat. Saya juga akan mengutip dari makalah:
Konsep representasi berbasis bidang dari jerat poligonal pertama kali dijelaskan oleh Sugihara dan Iri [SI89]. Representasi semacam ini memberikan satu keuntungan penting ketika datang ke tugas-tugas yang melibatkan mengubah topologi padatan yang diwakili oleh jerat seperti evaluasi ekspresi Boolean: tidak ada informasi geometri primer baru yang harus dibangun untuk mendapatkan polyhedron yang dihasilkan
Dan akhirnya saya ingin menambahkan, jika Anda ingin memulai implementasi CSP BSP Anda, saya akan merekomendasikan memulai pada BSP Faqs .