Direi che sei sulla buona strada, ma trovare un algoritmo ottimale e / o efficiente è un'altra questione: è un problema difficile. Tuttavia, a meno che il tuo interesse non sia accademico, potrebbe essere sufficiente una soluzione sufficientemente valida.
Innanzitutto, se non sei interessato a trovare la tua soluzione, CGAL contiene già un algoritmo per la decomposizione dei poliedri convessi: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Ora per il metodo; come molti problemi in 3D, è spesso utile considerare il problema 2D che è più facile da capire. Per il 2D, il compito è quello di identificare i vertici riflessi e dividere il poligono in due creando un nuovo bordo (e possibilmente nuovi vertici) da quel vertice riflesso, e continuando fino a quando non si rimane senza vertici riflessi (e quindi poligoni tutto convessi ).
La decomposizione poligonale di J. Mark Keil contiene il seguente algoritmo (in forma non ottimizzata):
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
Fondamentalmente confronta in modo esaustivo tutte le possibili partizioni e restituisce quella con le diagonali minime prodotte. In questo senso è un po 'bruta e anche ottimale.
Se vuoi scomposizioni "più belle", ovvero quelle che producono forme più compatte piuttosto che allungate, potresti anche considerare questa prodotta da Mark Bayazit , che è avida (quindi molto più veloce) e sembra più bella ma ha alcune carenze. Funziona fondamentalmente cercando di collegare i vertici riflessi al migliore opposto ad esso, in genere a un altro vertice riflesso:
Una delle carenze è che ignora "migliori" decomposizioni creando punti Steiner (punti che non esistono su un bordo esistente):
Il problema in 3D può essere simile; invece dei vertici riflessi, si identificano i "bordi di intaglio". Un'implementazione ingenua sarebbe quella di identificare i bordi della tacca ed eseguire ripetutamente tagli piani sul poliedro fino a quando tutti i poliedri sono convessi. Dai un'occhiata a "Partizioni convesse di poliedri: un algoritmo ottimale legato inferiore e caso peggiore" di Bernard Chazelle per maggiori dettagli.
Si noti che questo approccio potrebbe produrre nel caso peggiore un numero esponenziale di sub-poliedri. Questo perché potresti avere casi degeneri come questo:
Ma se hai una mesh non banale (pensa a una superficie irregolare), otterrai comunque scarsi risultati. È molto probabile che tu voglia fare molta semplificazione in anticipo, se mai dovessi usarlo per mesh complesse.