it-swarm.com.de

Robustes, schnelles komplexes Polygon (mit Löchern), Triangulations-C/C++ - Bibliothek mit Lizenz

Ich bin ein Entwickler des Open-Source-Spiels, Bitfighter . Im folgenden SO post haben wir die exzellente "Triangle" -Bibliothek für die Erstellung von Maschenzonen für die Verwendung mit unserer In-Game-KI (Roboter) verwendet:

Polygon-Triangulation mit Löchern

Wir hatten jedoch einen kleinen Haken, als wir unser Spiel für Debian packen wollten - durch die Verwendung der 'Triangle'-Bibliothek wird unser Spiel als' nicht frei 'betrachtet.

Wir sind sehr zufrieden mit der Leistung der 'Triangle'-Bibliothek und möchten sie nicht wirklich aufgeben. Wir beschäftigen uns aber auch nicht gern mit Lizenzfragen. Deshalb haben wir uns auf die Suche nach einem geeigneten, lizenzierten Ersatz gemacht, der "Triangle" in seiner Robustheit und Geschwindigkeit aufnehmen kann.

Wir suchen nach einer C- oder C++ - Bibliothek, um große, komplexe Bereiche in Dreiecke zu unterteilen, die alle Arten von unregelmäßigen Polygonen, die auf beliebige Weise zusammengefügt werden können, sowie Löcher behandeln können. Robustheit ist unser Hauptbedürfnis, wobei Geschwindigkeit fast genauso wichtig ist.

Ich habe poly2tri gefunden, aber es hat einen Fehler, bei dem es nicht mit Polygonen mit übereinstimmenden Kanten umgehen kann.

Wir haben mehrere Bibliotheken gefunden, aber alle scheinen unter dem einen oder anderen zu leiden: Entweder zu langsam, oder behandeln Sie keine Löcher oder leiden Sie unter einem Fehler. Derzeit testen wir polypartition und haben große Hoffnungen.

Was sind die besten Alternativen zur großen "Triangle" -Bibliothek, die jedoch eine Lizenz besitzen?

15
raptor

Ich habe eine Lösung gefunden. Es war poly2tri immerhin mit der exzellenten Clipper - Bibliothek und einigen geringfügigen algorithmischen Ergänzungen an den Eingängen.

Unser Prozess ist wie folgt:

  1. Führen Sie alle unsere Löcher mit einer Verschraubung mit NonZero-Wicklung durch den Clipper (dh, dass die inneren Löcher in die entgegengesetzte Richtung gewickelt sind als die äußeren). Der Clipper garantiert außerdem schöne, saubere Eingabepunkte ohne Wiederholungen innerhalb von epsilon.
  2. Filtern Sie unsere Löcher in Löcher, die gegen den Uhrzeigersinn und im Uhrzeigersinn gewickelt sind. Löcher im Uhrzeigersinn bedeuteten, dass das Loch umschlossen war und dass es einen weiteren konzentrischen Bereich im Inneren gab, der trianguliert werden musste
  3. Mit poly2tri triangulieren Sie die äußeren Begrenzungen und jedes gefundene Polygon im Uhrzeigersinn und verwenden Sie den Rest der Löcher als Eingaben für poly2tri, wenn sie innerhalb einer der Grenzen gefunden wurden.

Ergebnis: poly2tri scheint fast genauso schnell wie Triangle zu triangulieren und war bisher mit allem, was wir darauf gerichtet haben, sehr robust.

Für Interessierte hier sind unsere Code-Änderungen

Update

Ich habe versucht, unseren Clipper-to-Poly2tri-Code mit unseren Robustheitsergänzungen in eine separate Bibliothek zu ziehen, die ich hier angefangen habe: clip2tri

16
raptor

Als kleine Randbemerkung:

Ich musste vor kurzem einen komplexen Polygonschneider und Triangulator implementieren, um Fensterrahmen in Hauswände zu schneiden. 

Während ich mit den Ergebnissen des Vatti-Clippers zufrieden war, war die in poly2tri verwendete Delaunay-Triangulation zu schwer, um ein sanftes Ziehen des Fensterrahmens entlang der Schwerpunktskoordinaten der Wandfläche zu ermöglichen. Nachdem ich mir ein wenig den Kopf gekratzt hatte, brachte ich dieses viel einfachere Dreieck dazu, mit Löchern zu arbeiten:

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

Was ich tat, war die Wandfläche horizontal durch die Höhe des kürzesten Beschneidungs-Poly zu unterteilen. In meinem Fall sind das immer Rechtecke, aber das muss nicht sein. Auf jeden Fall zwingt der Haarschneider nur mit regulären oder konkaven Polys, und somit können Sie mit einer günstigeren Triangulationsmethode davonkommen. 

Hier sind einige Screenshots, die zeigen, wie es funktioniert:

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

Hoffe das hilft.

1
Rob Bantin

Sie können sich das 2D Triangulations-Paket von CGAL ansehen. Ein Beispiel zum Triangulieren eines Polygons mit Löchern ist hier . Die Lizenz des Pakets ist GPLv3 +.

Beachten Sie, dass es nicht zu schwer sein sollte, bei Bedarf nur dieses Paket zu extrahieren.

1
sloriot