Ein Algorithmus zum Aufblasen / Entleeren (Versetzen, Puffern) von Polygonen
Wie würde ich das "aufblasen" eines Polygons? Das heißt, ich will etwas tun, ähnlich wie diese:
Voraussetzung ist, dass die neue (aufgeblasen) polygon-Kanten/Punkte sind alle mit der gleichen Konstanten Abstand von der alten (original -) polygon (auf dem Beispiel-Bild sind Sie nicht, denn dann müsste es arcs für überhöhten Ecken, aber vergessen wir das für jetzt 😉 ).
Der mathematische Begriff für das, was ich Suche, ist eigentlich nach innen/nach außen polygon offseting. +1 balint für den Hinweis. Die alternative Benennung ist polygon Pufferung.
Ergebnisse meiner Suche:
Hier sind einige links:
InformationsquelleAutor der Frage Igor Brejc | 2009-07-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dachte ich, ich könnte kurz erwähnen, meine eigene polygon-clipping und Verrechnung Bibliothek - Clipper.
Während Clipper ist in Erster Linie für polygon-clipping-Operationen, es tut polygon Aufrechnung zu. Die Bibliothek ist open-source-freeware geschrieben Delphi, C++ und C#. Es hat eine sehr unbelastet Steigern Lizenz ermöglicht es, verwendet werden, in beiden freeware-und kommerzielle Anwendungen ohne Gebühr.
Polygon Aufrechnung durchgeführt werden kann mit einem von drei offset-Stile - Quadrat -, rund-und Gehrung.
InformationsquelleAutor der Antwort Angus Johnson
Des Polygons, die Sie suchen, heißt inward/outward offset polygon in der "computational geometry" und es ist eng mit der straight-skeleton.
Diese werden mehrere offset-Polygone für eine komplizierte polygon:
- Und dies ist der gerade das Gerüst für ein weiteres polygon:
Wie bereits in anderen Kommentaren, als auch, je nachdem, wie weit Sie planen, "inflate/deflate" das polygon können Sie am Ende mit unterschiedlichen Anschlüssen für die Ausgabe.
Berechnung von point-of-view: hat man einmal den straight-skeleton-man sollte in der Lage sein zu konstruieren, die offset-Polygone relativ leicht. Die open-source und (kostenlos für nicht-kommerzielle) CGAL Bibliothek hat ein Paket der Umsetzung dieser Strukturen. Sehen dieses code-Beispiel zu berechnen offset-Polygone mit CGAL.
Den Paket Handbuch sollte Ihnen einen guten Ausgangspunkt für die Erstellung dieser Strukturen, auch wenn Sie nicht verwenden, CGAL, und enthält Verweise auf die Papiere mit den mathematischen Definitionen und Eigenschaften:
CGAL-Handbuch: 2D-Straight-Skeleton-und Polygon Offsetting
InformationsquelleAutor der Antwort balint.miklos
Klingt für mich wie das, was Sie wollen, ist:
d
auf die "Links" des alten.Das resultierende polygon liegt auf den erforderlichen Abstand von der alten polygon "weit genug" von den vertices. In der Nähe einer Ecke, die Menge aller Punkte im Abstand
d
von der alten polygon ist, wie Sie sagen, nicht ein polygon, also die Voraussetzung, wie gesagt, kann nicht erfüllt werden.Ich weiß nicht, ob dieser Algorithmus hat einen Namen, Beispiel-code auf dem web, oder eine teuflische Optimierung, aber ich denke, es beschreibt das, was Sie wollen.
InformationsquelleAutor der Antwort Steve Jessop
Ich nie benutzt Clipper (entwickelt von Angus Johnson), aber für diese Arten von Dinge, die ich in der Regel verwenden JTS. Zur demonstration habe ich diesen jsFiddle verwendet JSTS (JavaScript-port von JTS). Sie müssen nur konvertieren der Koordinaten, die Sie haben, um JSTS Koordinaten:
Das Ergebnis ist so etwas wie dieses:
Zusätzliche info: ich verwende in der Regel diese Art von aufblasen/ablassen der Luft (ein wenig modifiziert für meine Zwecke) für Grenzen setzen, mit radius auf Polygonen, die gezeichnet werden auf einer Karte (mit Leaflet oder Google maps). Sie einfach konvertieren (lat,lng) - Paare JSTS Koordinaten und alles andere ist gleich. Beispiel:
InformationsquelleAutor der Antwort Marko Letic
Jeder Zeile sollten, teilen Sie die Ebene "innen" und "Gliederung"; Sie finden diese unter Verwendung der üblichen inneren-Produkt-Methode.
Verschieben Sie alle Zeilen, die nach außen mit Abstand.
Berücksichtigen Sie alle paar von benachbarten Linien (die Linien, nicht die Linie, segment) finden Sie die Kreuzung. Das sind die neuen vertex.
Bereinigung der neue Eckpunkt entfernen Sie alle Schnitt-Teile. - wir haben ein paar hier
(a) Fall 1:
wenn Sie verbrauchen es durch, du hast diese:
7 und 4 überschneiden sich.. wenn Sie sehen, entfernen Sie diesen Punkt und alle Punkte zwischen.
(b) Fall 2
wenn Sie aufwenden, es von beiden, Sie haben diese:
diese zu lösen, für jedes segment der Linie, die Sie haben zu prüfen, ob es überschneidungen mit den letzteren Segmenten.
(c) Fall 3
aufwenden, um 1. dies ist ein allgemeiner Fall für Fall 1.
(d) Fall 4
gleiche wie case3, sondern verbrauchen durch zwei.
Eigentlich, wenn Sie behandeln können, Fall 4. Alle anderen Fälle sind nur spezielle Fall mit irgendeiner Linie oder einer Ecke überschneiden.
Tun Fall 4 halten Sie einen Stapel von vertex.. Sie schieben, wenn Sie finden, die Linien überschneiden sich mit letzterer Linie, pop es, wenn Sie die vorige Zeile. -- gerade wie, was Sie tun, convex-hull.
InformationsquelleAutor der Antwort J-16 SDiZ
Hier ist eine alternative Lösung finden Sie, wenn Sie dieses besser.
Tun triangulationes nicht zu delaunay-jede triangulation tun würde.
Aufblasen jedes Dreieck-das sollte trivial sein. wenn Sie speichern Sie das Dreieck in der anti-Uhrzeigersinn, bewegen Sie einfach die Linien auf der rechten Seite und tun Schnittpunkt.
Mischen Sie Sie mit einem modifizierten Weiler-Atherton-clipping-Algorithmus
InformationsquelleAutor der Antwort J-16 SDiZ
In der GIS-Welt verwendet man negative Pufferung für diese Aufgabe:
http://www-users.cs.umn.edu/~npramod/enc_pdf.pdf
Den JTS-Bibliothek sollte dies für Sie tun. Finden Sie in der Dokumentation für die Puffer-Betrieb: http://tsusiatsoftware.net/jts/javadoc/com/vividsolutions/jts/operation/buffer/package-summary.html
Für eine übersicht, siehe auch die Handbuch für Entwickler:
http://www.vividsolutions.com/jts/bin/JTS%20Developer%20Guide.pdf
InformationsquelleAutor der Antwort stryeko
Großen Dank an Angus Johnson für seine clipper-Bibliothek.
Es gibt gute code-Beispiele für das tun des clipping-Zeug auf die clipper-homepage http://www.angusj.com/delphi/clipper.php#code
aber ich wollte nicht sehen, ein Beispiel für die polygon offsetting. Also ich dachte, dass vielleicht es ist von nutzen für jemanden, wenn ich mein code:
InformationsquelleAutor der Antwort PainElemental
Basierend auf den Rat von @JoshO ' Brian, es erscheint die
rGeos
Paket in derR
Sprache implementiert diesen Algorithmus. SehenrGeos::gBuffer
.InformationsquelleAutor der Antwort Carl Witthoft
Eine weitere option ist die Verwendung boost::polygon - die Dokumentation ist etwas fehlt, aber Sie sollten feststellen, dass die Methoden
resize
undbloat
und auch die überladene+=
Betreiber, welche auch tatsächlich umzusetzen Pufferung. So zum Beispiel die Erhöhung der Größe der ein polygon (oder einen Satz von Polygonen), die von einigen Wert kann so einfach sein wie:InformationsquelleAutor der Antwort Paul R
Gibt es ein paar Bibliotheken, die man nutzen kann (Auch verwendbar für 3D-Datensätze).
Findet man auch entsprechende Publikationen für die Bibliotheken zu verstehen, die algorithmen im detail.
Den letzten hat man die wenigsten Abhängigkeiten und ist in sich abgeschlossen und kann Lesen .obj-Dateien.
Die besten Wünsche,
Stephan
InformationsquelleAutor der Antwort Stephan M. G.