Я б сказав, що ви на правильному шляху, але придумати оптимальний та / або ефективний алгоритм - інша справа: це складна проблема. Однак, якщо ваш інтерес не є академічним, достатньо хорошого рішення може бути достатньо.
По-перше, якщо вам не цікаво розробити власне рішення, CGAL містить вже алгоритм розкладання опуклих багатогранників: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Тепер про метод; як і багато проблем у 3D, часто корисно розглянути 2D-проблему, яку легше зрозуміти. Для 2D завдання полягає в тому, щоб визначити рефлекторні вершини та розділити багатокутник на дві частини, створивши з цього рефлекторної вершини новий край (і, можливо, нові вершини), і продовжуючи, поки у вас не залишиться рефлекторних вершин (а отже, і всевипуклі багатокутники ).
Розкладання багатокутника Дж. Марка Кіля містить такий алгоритм (у неоптимізованому вигляді):
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
По суті, він вичерпно порівнює всі можливі розділи і повертає той, що має найменші діагоналі. І в цьому сенсі це трохи жорстоко і оптимально.
Якщо ви хочете "приємніше виглядати" декомпозиції, тобто ті, що створюють більш компактні форми, а не подовжені, ви можете також вважати цю, вироблену Марком Баязітом , яка жадібна (отже, набагато швидше) і виглядає красивіше, але має кілька недоліків. В основному це працює, намагаючись підключити рефлекторні вершини до найкращої, протилежної йому, як правило, до іншої рефлекторної вершини:
Одним із недоліків є те, що він ігнорує "кращі" декомпозиції, створюючи точки Штейнера (точки, які не існують на існуючому краю):
Проблема в 3D може бути подібною; замість рефлекторних вершин ви ідентифікуєте "краї висічки". Наївною реалізацією було б визначити краї висівок і виконувати плоскі надрізи на багатогранні кілька разів, поки всі багатогранники не опуклі. Перегляньте "Опуклі перегородки багатогранників: нижній межі та найгірший оптимальний алгоритм" Бернарда Шазел для більш детальної інформації.
Зауважимо, що цей підхід може спричинити в гіршому випадку експоненціальну кількість підполіградів. Це тому, що у вас можуть виникнути подібні випадки:
Але якщо у вас є нетривіальна сітка (подумайте, куляста поверхня), все одно ви отримаєте погані результати. Цілком ймовірно, що вам потрібно буде заздалегідь зробити багато спрощень, якщо вам коли-небудь доведеться використовувати це для складних сіток.