web-dev-qa-db-fra.com

Bibliothèque de triangulation polygonale complexe (avec trous) robuste et rapide avec licence permissive

Je suis un développeur du jeu open-source, Bitfighter . Selon l'article SO suivant, nous avons utilisé l'excellente bibliothèque «Triangle» pour la génération de zones maillées à utiliser avec notre intelligence artificielle de jeu (robots):

Triangulation polygonale avec trous

Cependant, nous avons rencontré un petit problème lorsque nous avons voulu emballer notre jeu pour Debian: l'utilisation de la bibliothèque 'Triangle' fera en sorte que notre jeu soit considéré comme 'non-libre'.

Nous sommes extrêmement satisfaits des performances de la bibliothèque 'Triangle' et ne souhaitons pas vraiment y renoncer. Cependant, nous n'aimons pas non plus traiter des problèmes de licence. Par conséquent, nous nous sommes lancés dans une quête pour trouver un remplaçant approprié, licencié sous licence, qui puisse correspondre à 'Triangle' par sa robustesse et sa rapidité.

Nous recherchons une bibliothèque C ou C++ permettant de diviser des zones vastes et complexes en triangles pouvant gérer tout type de polygones irréguliers placés ensemble de quelque manière que ce soit, ainsi que des trous. La robustesse est notre principal besoin, avec une vitesse presque aussi importante.

J'ai trouvé poly2tri , mais il souffre d'un bogue dans lequel il ne peut pas gérer les polygones à bords coïncidents.

Nous avons trouvé plusieurs bibliothèques, mais toutes semblent souffrir d'une chose ou d'une autre: soit trop lent, soit ne gère pas les trous, soit souffre d'un bug. Nous testons actuellement polypartition et nous avons de grands espoirs.

Quelles sont les meilleures alternatives à la grande bibliothèque "Triangle", si vous avez une licence permissive?

15
raptor

J'ai trouvé une solution. C'était poly2tri après tout, avec l'utilisation de l'excellente bibliothèque Clipper , et quelques ajouts algorithmiques mineurs aux entrées.

Notre processus est le suivant:

  1. Exécuter tous nos trous à travers Clipper en utilisant une union avec un enroulement non nul (cela signifie que les trous intérieurs sont enroulés dans la direction opposée à celle des trous extérieurs). Clipper garantit également de jolis points d'entrée propres, sans répétition dans epsilon.
  2. Filtrer nos trous dans ceux qui sont enroulés dans le sens anti-horaire et dans le sens horaire. Les trous dans le sens des aiguilles d'une montre signifiaient que le trou était circulaire et qu'il y avait une autre zone concentrique à l'intérieur qui devait être triangulée
  3. À l’aide de poly2tri, triangulez les limites extérieures et chaque polygone dans le sens des aiguilles d’une montre, en utilisant le reste des trous comme entrées de poly2tri s’ils se trouvaient dans l’une des limites.

Résultat: poly2tri semble trianguler à peu près aussi vite que Triangle et a jusqu'à présent été très robuste avec tout ce que nous avons jeté.

Pour ceux que ça intéresse, voici nos modifications de code

Mise à jour

J'ai essayé d'extraire notre code clipper-to-poly2tri, avec nos ajouts de robustesse, dans une bibliothèque séparée que j'ai commencée ici: clip2tri

16
raptor

En petite note:

J'ai récemment eu à mettre en œuvre une tondeuse polygonale complexe et un triangulateur pour découper des cadres de fenêtres en murs de maisons. 

Bien que j'étais satisfait des résultats obtenus avec la tondeuse Vatti, la triangulation de Delaunay utilisée dans poly2tri était trop lourde pour permettre un glissement en douceur du cadre de la fenêtre le long des coordonnées barycentriques de la face du mur. Après me gratter un peu la tête, j'ai fini par tromper ce triangle beaucoup plus simple pour travailler avec des trous:

http://wiki.unity3d.com/index.php?title=Triangulator

Ce que j'ai fait était de subdiviser horizontalement la face du mur à la hauteur du poly de découpage le plus court. Dans mon cas, ce sont toujours des rectangles, mais ce n’est pas nécessairement le cas. Quoi qu'il en soit, il oblige la tondeuse à ne travailler qu'avec des polys réguliers ou concaves et vous permet donc de vous échapper avec une méthode de triangulation moins chère. 

Voici quelques captures d'écran montrant son fonctionnement:

https://www.dropbox.com/sh/zbzpvlkwj8b9gl3/sIBYCqa8ak

J'espère que cela t'aides.

1
Rob Bantin

Vous pouvez consulter le package 2D Triangulations de CGAL. Un exemple pour trianguler un polygone avec des trous est donné ici . La licence du paquet est GPLv3 +.

Notez qu'il ne devrait pas être trop difficile d'extraire seulement ce paquet si nécessaire.

1
sloriot