Saya akan mengatakan Anda berada di jalur yang benar, tetapi menghasilkan algoritma yang optimal dan / atau efisien adalah masalah lain: ini masalah yang sulit. Namun, kecuali minat Anda bersifat akademis, solusi yang cukup baik mungkin sudah cukup.
Pertama, jika Anda tidak tertarik untuk membuat solusi Anda sendiri, CGAL sudah memiliki algoritma untuk dekomposisi cembung polyhedra: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Sekarang untuk metodenya; seperti banyak masalah dalam 3D, sering kali membantu untuk mempertimbangkan masalah 2D yang lebih mudah dipahami. Untuk 2D, tugasnya adalah mengidentifikasi simpul refleks, dan membagi poligon menjadi dua dengan menciptakan tepi baru (dan mungkin simpul baru) dari simpul refleks, dan melanjutkan sampai Anda dibiarkan tanpa simpul refleks (dan karenanya semua poligon cembung) ).
Dekomposisi Polygon oleh J. Mark Keil berisi algoritma berikut (dalam bentuk yang tidak dioptimalkan):
diags = decomp(poly)
min, tmp : EdgeList
ndiags : Integer
for each reflex vertex i
for every other vertex j
if i can see j
left = the polygon given by vertices i to j
right = the polygon given by vertices j to i
tmp = decomp(left) + decomp(right)
if(tmp.size < ndiags)
min = tmp
ndiags = tmp.size
min += the diagonal i to j
return min
Pada dasarnya ini secara ekstensif membandingkan semua partisi yang mungkin, dan mengembalikan yang memiliki diagonal paling sedikit. Dalam hal ini agak kasar dan optimal juga.
Jika Anda menginginkan dekomposisi yang “lebih bagus”, yaitu yang menghasilkan bentuk yang lebih padat daripada yang memanjang, Anda juga dapat mempertimbangkan yang ini dibuat oleh Mark Bayazit , yang serakah (karenanya jauh lebih cepat) dan terlihat lebih bagus tetapi memiliki beberapa kekurangan. Ini pada dasarnya bekerja dengan mencoba menghubungkan simpul refleks ke yang terbaik yang berlawanan dengannya, biasanya ke simpul refleks lain:
Salah satu kekurangannya adalah ia mengabaikan dekomposisi "lebih baik" dengan membuat poin Steiner (poin yang tidak ada pada edge yang ada):
Masalah dalam 3D bisa serupa; alih-alih simpul refleks, Anda mengidentifikasi "takik tepi". Implementasi yang naif adalah mengidentifikasi takik tepi, dan melakukan pemotongan bidang pada polyhedron berulang kali sampai semua polyhedra cembung. Lihat "Partisi Cembung Polyhedra: Algoritma Optimal Terikat Bawah dan Terburuk" oleh Bernard Chazelle untuk detail lebih lanjut.
Perhatikan bahwa pendekatan ini dapat menghasilkan kasus terburuk sejumlah sub-polyhedra yang eksponensial. Ini karena Anda dapat memiliki kasus degenerasi seperti ini:
Tetapi jika Anda memiliki mesh non-sepele (pikirkan permukaan bergelombang), Anda akan mendapatkan hasil yang buruk. Sangat mungkin Anda ingin melakukan banyak penyederhanaan sebelumnya, jika Anda perlu menggunakan ini untuk jerat yang rumit.