C++ - 2D-tessellation-Bibliothek?
Habe ich eine konvexe Polygone gespeichert, die ein STL-Vektor, der die Punkte (mehr oder weniger). Ich möchte parkettiert Sie wirklich schnell, vorzugsweise in gleichmäßig große Stücke, und es keine "Splitter".
Werde ich es verwenden, um zu explodieren einige Objekte in kleine Stücke. Kennt jemand eine nette Sammlung an Polygonen parkettiert (partition in ein Netz aus kleineren konvexen Polygonen oder Dreiecken)?
Ist, habe ich mich an ein paar, die ich gefunden habe, schon online, aber ich kann auch nicht diese zu kompilieren. Diese Akademische Art nicht geben viel Rücksicht auf Benutzerfreundlichkeit.
Ist das 3D oder 2D?
2D - - - - - -
2D - - - - - -
InformationsquelleAutor mpen | 2009-09-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
CGAL Pakete um dieses problem zu lösen. Am besten wäre wohl die Verwendung der 2D-Polygon-Partitionierung Paket. Zum Beispiel könnten Sie generieren y-monotone-partition von einem polygon (funktioniert für nicht-konvexen Polygonen), und Sie bekommen würde, so etwas wie dieses:
y-monoyone-Partitionierung http://www.cgal.org/Manual/3.4/doc_html/cgal_manual/Partition_2/Trier_opt_cvx.gif
y-monoyone-Partitionierung http://www.cgal.org/Manual/3.4/doc_html/cgal_manual/Partition_2/Idar-Oberstein_appx_cvx.gif
Den runnning Zeit O(n log n).
In Bezug auf die Benutzerfreundlichkeit dies ist ein kleiner Beispiel code-Generierung eine zufällige polygon und Partitionierung (basierend auf dieses Handbuch Beispiel):
Installieren cgal, wenn Sie in windows Sie können den installer verwenden, um die vorkompilierte Bibliothek, und es sind Installations-Anleitungen für jede Plattform auf auf dieser Seite. Es ist vielleicht nicht die am einfachsten zu installieren, aber Sie bekommen die die meisten verwendet und robuste computational geometry-Bibliothek dort gibt, und die cgal-mailing-Liste ist sehr hilfreich um Fragen zu beantworten...
Sie haben geschrieben: "Sie sind nicht besorgt über die Qualität des Netzes", so dachte ich, diese Aufteilung wäre das, was du suchst. Wollen Sie ein polygon triangulieren, so dass Sie haben die Kontrolle über die Qualität und die Größe der Dreiecke? Wenn dies Ihre Frage, die Sie könnten Blick in das cgal-Paket: cgal.org/Manual/3.3/doc_html/cgal_manual/Mesh_2/...
Err...sorry, die Qualität, die ich meinte, dass ich nicht zu wählerisch, Sie alle Winkel zumindest einen gewissen Grad oder vollständig konsistente Größen über alle Teilgebiete... es ist jedoch produzieren müssen irgendeine Art von mesh. Sollte ich gemacht haben, dass mehr klar. , Der Letzte link sieht viel mehr wie das, was ich will. Danke!
Wenn Sie möchten vermeiden, dass Splitter (wie Sie geschrieben haben in Ihrem ersten Kommentar) , bedeutet implizit, dass Sie lieber eine Schranke für minimale Winkel. Möchten Sie so etwas? www-sop.inria.fr/members/Jane.Tournois/images/seattle_big.png Dieses Bild und die CGAL 2d-meshing-Paket basiert auf einer Methode namens " Delaunay Verfeinerung. Und es ist ein weiteres opensource-Delaunay-Netz-generator hier: cs.cmu.edu/~quake/triangle.html , als auch.
InformationsquelleAutor balint.miklos
poly2tri sieht wie eine wirklich schöne leichte der C++ - Bibliothek für 2D-Delaunay-triangulation.
InformationsquelleAutor prideout
Als balint.miklos erwähnt in einem Kommentar oben, der Shewchuk ' s Dreieck - Paket ist ziemlich gut. Ich habe es selbst viele Male; es integriert sich schön in die Projekte und es wird die Dreieck++ C++ - Schnittstelle. Wenn Sie vermeiden möchten, Splitter, ermöglichen dann die Dreieck (innen) Steiner-Punkte, so dass Sie erzeugen eine hochwertige mesh (in der Regel eine eingeschränkte konforme delaunay-triangulation).
InformationsquelleAutor Victor Liu
Wenn Sie nicht bauen wollen, das ganze von GCAL in Ihre app, das ist vermutlich einfacher zu implementieren.
http://www.flipcode.com/archives/Efficient_Polygon_Triangulation.shtml
InformationsquelleAutor Martin Beckett
Ich habe gerade begonnen, einen Blick in dieses gleiche problem und ich überlege mir, voronoi-tessellation. Das original polygon erhalten eine Streuung von halb-zufälligen Punkten, die die Zentren der voronoi-Zellen, die mehr gleichmäßig verteilt werden Sie regelmäßig die Größe der Zellen, aber Sie sollte nicht in einem perfekten Gitter sonst die inneren Polygone werden alle gleich Aussehen. So die erste Sache ist, um in der Lage zu erzeugen, die Zell-Mittelpunkte - Generierung über die bounding-box des Quell-polygon und ein Interieur/Exterieur-test sollte nicht allzu schwer sein.
Die voronoi-Kanten sind die gestrichelten Linien in diesem Bild, und sind sozusagen die Ergänzung der delaunay-triangulation. Alle scharfen Dreieck stumpf:
Boost hat einige voronoi-Funktionalität:
http://www.boost.org/doc/libs/1_55_0/libs/polygon/doc/voronoi_basic_tutorial.htm
Der nächste Schritt ist die Erstellung der voronoi-Polygone. Voro++ http://math.lbl.gov/voro++/ ist 3D-orientiert, aber es wird vorgeschlagen, die anderswo, etwa 2d-Struktur funktionieren wird, aber viel langsamer als die software-orientiert, 2D-voronoi. Das andere Paket, das sieht um einiges besser sein als eine zufällige akademischen homepage Waisen-Projekt ist https://github.com/aewallin/openvoronoi.
Sieht es aus wie OpenCV verwendet, um den support etwas tun in diese Richtung, aber es ist veraltet (aber das c-api noch funktioniert?). cv::distTransform ist noch erhalten, aber funktioniert auf Pixel und generiert für die pixel-Ausgabe, keine Ecken und Kante, polygon-Daten-Strukturen, aber kann ausreichend sein, für meine Bedürfnisse, wenn nicht deins.
Ich werde diese zu aktualisieren, sobald ich habe mehr gelernt.
InformationsquelleAutor Lucas W
Ein bisschen mehr detail auf Ihre gewünschten input-und output-könnte hilfreich sein.
Zum Beispiel, wenn Sie nur versuchen, um die Polygone in Dreiecke, Dreieck-fan würde wahrscheinlich funktionieren. Wenn Sie versuchen, schneiden Sie ein polygon in kleine Stücke, die Sie implementieren können einige Art von marching squares.
Okay, ich habe eine schlechte Annahme bin ich davon ausgegangen, dass marching squares würde mehr wie marching cubes. Stellt sich heraus, es ist ganz anders, und nicht das, was ich meinte.. 😐
In jedem Fall, um direkt Ihre Frage zu beantworten, ich kenne keine einfache Bibliothek, die das tut, was Sie suchen. Ich bin über die usability von CGAL.
Den Algorithmus, den ich dachte, der war im Grunde der Spaltung von Polygonen mit Linien, wo die Linien sind in einem raster, so dass Sie meistens kommen quads. Wenn Sie ein polygon-Linien-Kreuzung, die Umsetzung wäre einfach. Ein anderer Weg zu stellen, das problem ist die Behandlung der 2d-polygon wie eine Funktion, und die überlagerung ein raster von Punkten. Dann tun Sie nur etwas ähnliches wie marching cubes.. wenn alle 4 Punkte in das polygon, machen Sie eine quad, wenn 3 sind, lassen Sie ein Dreieck, 2 sind in stellen Sie ein Rechteck, etc. Wahrscheinlich overkill. Wenn Sie wollte, leicht unregelmäßig aussehende Polygone könnten Sie, mischen Sie die Standorte der grid-Punkte.
Auf der anderen Seite konnten Sie eine catmull-clark-Stil-Unterteilung, aber das weglassen der Glättung. Der Algorithmus ist im Grunde fügen Sie einen Punkt am Schwerpunkt und in der Mitte jeder Kante. Dann für jede Ecke des ursprünglichen Polygons, die Sie machen, ein neues, kleineres polygon verbindet, die Kante Mittelpunkt zurück, um die Ecke, die Ecke, die nächste edge-Mittelpunkt und den Schwerpunkt. Diese Fliesen den Raum, und die haben Winkel ähnlich zu Ihrem Eingang polygon.
So, eine Menge von Optionen, und ich mag, brainstorming für Lösungen, aber ich habe immer noch keine Ahnung, was Sie planen, über die Verwendung dieser für. Ist dies zu schaffen zerstörbare Maschen? Machst du irgendeine Art von mesh-Verarbeitung, die erfordert, dass kleinere Elemente? Versuche zu vermeiden, Gouraud-shading-Artefakte? Ist das etwas, das als pre-Prozess-oder Echtzeit? Wie wichtig ist Genauigkeit? Mehr Informationen führen würde, bessere Vorschläge.
Zerstörbare Maschen, ja. Dachte, ich erwähnte das. Geschieht in Echtzeit, aber hoffentlich nicht jeder frame 🙂 Es ist für ein Spiel... nur, wenn zwei Objekte kollidieren hart, ich möchte Sie zu explodieren. Ich nehme Ihre Vorschläge in Betracht ziehen, danke!
InformationsquelleAutor tfinniga
Wenn Sie konvexe Polygone, und Sie sind nicht zu aufgehängt auf Qualität, dann ist das wirklich einfach - einfach tun ear clipping. Keine Sorge, es ist nicht O(n^2) für konvexe Polygone. Wenn Sie dies tun, naiv (d.h., Sie clip die Ohren, als Sie Sie finden), dann wirst du ein Dreieck-fan, das ist ein bisschen ein ziehen, wenn Sie versuchen zu vermeiden Splittern. Zwei triviale Heuristiken, die zur Verbesserung der triangulation sind
Wenn Sie möchten, eine robustere triangulator basierend auf ear clipping, check-out FAUST.
InformationsquelleAutor IV.