Ich arbeite an einigen Klassenbeispielen in Python, die in ArcMap implementiert sind, um den antipodalen Abstand innerhalb eines Polygons zu berechnen. Dies ist für konvexe Polygone ziemlich routinemäßig. Für konkave Polygone möchte ich jedoch Lösungen ausschließen (die durch einen Strahl gebildet werden, der die Grenzpunkte verbindet), die nicht vollständig innerhalb des Polygons und nicht an der Polygongrenze liegen oder diese schneiden. Habe ich die Definition falsch interpretiert oder hat dieses Biest einen anderen Namen?
Betrachten Sie diese beiden Polygone
pnts = [[0,0], [0,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # eine geschlossene Schleife konvex
pnts = [[0,0], [2,1], [1,4], [3,5], [5,4], [4,1], [0,0]] # eine geschlossene Schleife konkaves Polygon
In meiner Interpretation sollte dem Punkt 0,0 kein antipodaler Abstand zugeordnet sein, da der Vektor, der ihn mit den anderen Punkten verbindet, das Polygon entweder selbst schneidet oder sich an der Polygongrenze befindet.
Wenn jemand Klarheit über die Definition oder mögliche Lösungen hat, würde ich es begrüßen.
Eine visuelle Darstellung des konvexen Polygons und der gewünschten Linien (rot dargestellt) ist beigefügt (Beispielvektoren von Punkt 0 werden nur angezeigt).
Im konvexen Beispiel hat der erste Punkt keine antipodalen Vektoren, der zweite Punkt jedoch.
BEARBEITEN Ich hatte einige Erfolge bei der Suche mit "Polygonabruf" oder "Polygondurchmesser" im Web. Ich vermute, dass dies das ist, wonach ich suche.
quelle
Antworten:
Wenn ich einen Algorithmus schreiben würde, würde ich einfach prüfen, ob eine Linie zwischen zwei Eckpunkten des Polygons eine Linie schneidet, die eine der Kanten bildet. Hier ist mein Pseudocode:
Speichern Sie alle Validabstände in Bezug auf die Eckpunkte in 1.
Machen Sie mit den Ergebnissen, was immer Sie wollen, schreiben Sie neue Zeilen aus, speichern Sie die längste für jedes Polygon ...
Ich bin mir nicht sicher, ob Sie danach suchen, aber Sie können die oben genannten Schritte in ArcPy ausführen.
EDIT: Code für Schritt 2.2:
Wenn h zwischen 0 und 1 liegt, schneiden sich die Linien, andernfalls nicht. Wenn F * P Null ist, können Sie die Berechnung natürlich nicht durchführen, aber in diesem Fall sind die Linien parallel und schneiden sich daher nur in den offensichtlichen Fällen. Wenn h 1 ist, enden die Linien am selben Punkt. Behandle das so wie du willst! (Ich würde sagen, sie kreuzen sich, es macht mich einfacher.)
Ein weiteres Beispiel für Schritt 2.2 von hier: http://en.wikipedia.org/wiki/Line-line_intersection
Überprüfen Sie zunächst, ob der Nenner nicht gleich 0 ist, was bedeutet, dass die Linien parallel sind.
Stellen Sie dann sicher, dass die oben angegebenen Koordinaten nicht außerhalb des Begrenzungsrahmens der beiden Linien liegen.
Weitere Informationen: http://compgeom.cs.uiuc.edu/~jeffe/teaching/373/notes/x06-sweepline.pdf
quelle
Ich wäre versucht, dies mit Engeln zu tun, fast wie eine Sichtlinie. Wenn beim Iterieren der Scheitelpunkte in der Form die Winkel zwischen dem Ursprungsscheitelpunkt und dem Zielscheitelpunkt in einer konsistenten Richtung fortgesetzt werden, sind alle Punkte Kandidaten für das Antipodal. Wenn ein Winkel die Richtung wechselt, wird dieser Punkt durch den vorherigen Punkt ausgeblendet oder ausgeblendet. Wenn es durch den vorherigen Punkt ausgeblendet wird, muss der Punkt übersprungen werden. Wenn der vorherige Punkt ausgeblendet wird, müssen die vorherigen Punkte aus der Kandidatenliste entfernt werden.
Ich bin mir nicht sicher, was ich mit Fällen tun soll, in denen der Ursprung und zwei andere Eckpunkte alle entlang derselben Linie liegen. In diesem Fall wäre der Winkel der gleiche. Wenn Sie ein Polygon mit Löchern hatten, konnten Sie den minimalen / maximalen Winkel jedes Lochs ermitteln und alle Kandidatenpunkte entfernen, die innerhalb dieses Bereichs liegen.
Der Hauptvorteil dieses Ansatzes besteht darin, dass Sie nicht auf den Linienschnittpunkt zwischen dem aktuellen Liniensegment und allen Polygonkanten testen müssen.
Das funktioniert ... denke ich. Ich habe den obigen Pseudocode und die Python aktualisiert, um das Lesen zu erleichtern.
Dies sollte die letzte Bearbeitung sein. Im folgenden Beispiel sollte der größte Anitpole für eine bestimmte Geometrie gefunden werden. Ich habe den Scrip so geändert, dass Punkte und Vektoren verwendet werden, um das Lesen zu erleichtern.
quelle
Ziehen Sie möglicherweise in Betracht, den Datensatz zu triangulieren. Welche Linien, die Polygonkanten gemeinsam haben, lassen sich leicht feststellen, und die übrigen können verglichen werden, um die längsten zu finden? Die Frage ist dann, welchen Triangulationsalgorithmus Sie benötigen.
Es ist nur eine Vermutung, aber ich vermute (ironischerweise), dass die Triangulation "niedrigster Qualität", die man erstellen kann, die gesuchte Linie enthalten muss, z. B. Abb. 1 in https://www.google.co.uk/url?sa=t&rct= j & q = & ESCR = s & source = web & cd = 6 & ved = 0CEoQFjAF & url = http% 3A% 2F% 2Fhrcak.srce.hr% 2Ffile% 2F69457 & ei = alIcUsb6HsLnswbfnYHoDw & USG = AFQjCNHIaykVRBAvv9hlaFJIBlfPLGHKtQ
quelle