Je dirais que vous êtes sur la bonne voie, mais trouver un algorithme optimal et / ou efficace est une autre affaire: c'est un problème difficile. Cependant, à moins que votre intérêt ne soit académique, une solution suffisamment bonne peut suffire.
Premièrement, si vous n'êtes pas intéressé à trouver votre propre solution, CGAL contient déjà un algorithme pour la décomposition des polyèdres convexes: http://doc.cgal.org/latest/Convex_decomposition_3/index.html
Maintenant pour la méthode; comme de nombreux problèmes en 3D, il est souvent utile de considérer le problème 2D qui est plus facile à comprendre. Pour la 2D, la tâche consiste à identifier les sommets réflexes et à diviser le polygone en deux en créant une nouvelle arête (et éventuellement de nouveaux sommets) à partir de ce sommet réflexe, et en continuant jusqu'à ce que vous ne soyez pas confronté à des sommets réflexes (et donc des polygones entièrement convexes). ).
Polygon Decomposition de J. Mark Keil contient l'algorithme suivant (sous une forme non optimisée):
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
Fondamentalement, il compare de manière exhaustive toutes les partitions possibles et renvoie celle avec le moins de diagonales produites. En ce sens, il est quelque peu brutal et optimal également.
Si vous voulez des décompositions "plus belles", c'est-à-dire celles qui produisent des formes plus compactes plutôt que des formes allongées, vous pouvez également envisager celle produite par Mark Bayazit , qui est gourmande (donc beaucoup plus rapide) et semble plus belle mais a quelques défauts. Il fonctionne essentiellement en essayant de connecter les sommets réflexes au meilleur opposé, généralement à un autre sommet réflexe:
L'un des inconvénients est qu'il ignore les «meilleures» décompositions en créant des points de Steiner (points qui n'existent pas sur un bord existant):
Le problème en 3D peut être similaire; au lieu de sommets réflexes, vous identifiez des "bords d'entaille". Une implémentation naïve consisterait à identifier les bords d'entaille et à effectuer des coupes planes sur le polyèdre à plusieurs reprises jusqu'à ce que tous les polyèdres soient convexes. Consultez "Partitions convexes des polyèdres: un algorithme optimal à borne inférieure et au pire des cas" par Bernard Chazelle pour plus de détails.
Notez que cette approche pourrait produire dans le pire des cas un nombre exponentiel de sous-polyèdres. C'est parce que vous pourriez avoir des cas dégénérés comme celui-ci:
Mais si vous avez un maillage non trivial (pensez à une surface cahoteuse), vous obtiendrez quand même de mauvais résultats. Il est très probable que vous souhaitiez faire beaucoup de simplification à l'avance, si vous avez besoin de l'utiliser pour des maillages complexes.