Je cherche un algorithme ou une bibliothèque (mieux) pour décomposer un polygone en triangles. Je vais utiliser ces triangles dans une application Direct3D. Quelles sont les meilleures options disponibles?
Voici ce que j'ai trouvé jusqu'à présent:
J'apprécierais vraiment l'avis de personnes ayant une expérience préalable dans ce domaine.
Edit: Ceci est un polygone 2D.
La bibliothèque Triangle de Jonathan Shewchuk est phénoménale; Je l'ai utilisé pour automatiser la triangulation dans le passé. Vous pouvez lui demander d’essayer d’éviter les triangles petits/étroits, etc., de sorte que vous obteniez de «bonnes» triangulations au lieu de n’importe quelle triangulation.
Pour vous donner plus de choix de bibliothèques sur le marché:
Polybooléen. Je n'ai jamais essayé celui-ci, mais il semble prometteur: http://www.complex-a5.ru/polyboolean/index.html
Tondeuse polygonale générale. Celui-ci fonctionne très bien dans la pratique et fait la triangulation ainsi que le découpage et les trous: http://www.cs.man.ac.uk/~toby/alan/software/
Ma recommandation personnelle: Utilisez le tesselation de GLU (OpenGL Utility Library). Le code est solide, plus rapide que GPC et génère moins de triangles. Vous n'avez pas besoin d'un OpenGL-Handle initialisé ni de quoi que ce soit pour utiliser lib.
Si vous n'aimez pas l'idée d'inclure des bibliothèques système OpenGL dans une application DirectX, il existe également une solution: il vous suffit de télécharger le code d'implémentation de référence SGI OpenGL et de lever le triangulateur. Il utilise simplement les noms OpenGL-Typedef et une main pleine d’énums. C'est tout. Vous pouvez extraire le code et créer une bibliothèque autonome en une heure ou deux.
En général, je vous conseillerais d'utiliser quelque chose qui fonctionne déjà et de ne pas commencer à écrire votre propre triangulation.
Il est tentant de vous lancer vous-même si vous avez lu quelque chose à propos de l'algorithme d'écrêtage d'oreille ou de ligne de balayage, mais le fait est que les algorithmes de géométrie calculatoire sont incroyablement difficiles à écrire de manière à rester stables, à ne jamais planter et à toujours donner un résultat significatif. . Les erreurs d'arrondi numériques vont s'accumuler et vous tuer à la fin.
J'ai écrit un algorithme de triangulation en C pour la société avec laquelle je travaille. Faire fonctionner l'algorithme de base a pris deux jours. Le faire fonctionner avec toutes sortes d'entrées dégénérées prenait encore deux ans (je ne travaillais pas à plein temps dessus, mais croyez-moi, j'y ai passé plus de temps que je n'aurais dû).
CGAL a l'outil dont vous avez besoin: Triangulations contraintes
Vous pouvez simplement fournir des limites de votre polygone (y compris les limites des trous) en tant que contraintes (le mieux serait d'insérer tous les sommets, puis de spécifier les contraintes sous forme de paires de Vertex_handles).
Vous pouvez ensuite baliser les triangles de la triangulation avec n’importe quel algorithme de parcours: commencez par un triangle incident au sommet infini et marquez-le comme étant à l’extérieur, et à chaque fois que vous croiserez une contrainte, passez à la balise opposée les triangles comme outsider, en dehors si vous les marquiez comme initiés auparavant).
J'ai trouvé que la bibliothèque poly2tri était exactement ce dont j'avais besoin pour la triangulation. Il produit un maillage beaucoup plus net que les autres bibliothèques que j'ai essayées (y compris libtess) et supporte également les trous. Cela a été converti en un tas de langues. La licence est New BSD , vous pouvez donc l'utiliser dans n'importe quel projet.
Vous pouvez ajouter les trous relativement facilement vous-même. Fondamentalement, triangulez sur la coque convexe des points d’entrée, conformément à CGAL, puis supprimez tout triangle dont le centre est situé à l’intérieur de l’un des polygones de trous (ou de l’extérieur des limites extérieures). Lorsqu’il s’agit de traiter de nombreux trous dans un grand ensemble de données, des techniques de masquage peuvent être utilisées pour accélérer considérablement ce processus.
edit: Une extension courante de cette technique consiste à désherber des triangles faibles sur la coque, où le bord le plus long ou le plus petit angle interne dépasse une valeur donnée. Cela formera une meilleure coque concave.
C'est un problème courant dans l'analyse par éléments finis. C'est ce qu'on appelle "la génération automatique de maillage". Google a trouvé ce site avec des liens vers des logiciels commerciaux et open source. Ils supposent généralement une sorte de CAD représentation de la géométrie au début.
essayez libtess2
https://code.google.com/p/libtess2/downloads/list
basé sur le tesselator SGI GLU original (avec licence libérale). Résout certains problèmes de gestion de la mémoire liés à de nombreux petits mallocs.
Une autre option (avec une licence très flexible) consiste à porter l'algorithme de VTK:
Cet algorithme fonctionne assez bien. Son utilisation directe est possible, mais nécessite des liens vers VTK, ce qui peut engendrer plus de surcharge que vous ne le souhaitez (bien qu'il comporte également de nombreuses autres fonctionnalités de Nice).
Il supporte les contraintes (trous/limites/etc), ainsi que la triangulation d'une surface qui n'est pas nécessairement dans le plan XY. Il prend également en charge certaines fonctionnalités que je n’ai pas vues ailleurs (voir les notes sur les valeurs alpha).
J'ai implémenté un polygone 3D triangulator in C # en utilisant la méthode de découpage des oreilles. Il est facile à utiliser, supporte les trous, est numériquement robuste et prend en charge les polygones convexes/non convexes aribtrary (non auto-sécants).