Wie kann man feststellen, ob eine Liste von Polygonpunkten im Uhrzeigersinn angeordnet ist?
Mit einer Liste der Punkte, wie ich finde, ist, wenn Sie im Uhrzeigersinn?
Beispiel:
point[0] = (5,0)
point[1] = (6,4)
point[2] = (4,5)
point[3] = (1,5)
point[4] = (1,0)
würde sagen, es ist anti-im Uhrzeigersinn (oder gegen den Uhrzeigersinn, für einige Leute).
InformationsquelleAutor der Frage Stécy | 2009-07-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige der vorgeschlagenen Methoden werden fehlschlagen, in dem Fall einer nicht-konvexen polygon, wie ein Halbmond. Hier ist eine einfache, nicht-konvexe Polygone (es werden auch arbeiten mit einer sich selbst schneidenden polygon, wie eine Abbildung-acht, sagen Sie, ob es meistens im Uhrzeigersinn).
Summe über die Kanten (x2 − x1)(y2 + y1). Wenn das Ergebnis positiv ist die Kurve wird im Uhrzeigersinn, wenn es negativ wird die Kurve gegen den Uhrzeigersinn. (Das Ergebnis ist das doppelte der geschlossenen Fläche, mit einer +/- übereinkommens.)
InformationsquelleAutor der Antwort Beta
Den cross-Produkt misst den Grad von senkrecht-sein von zwei Vektoren. Sich vorstellen, dass jede Kante von polygon ist ein Vektor in der x-y-Ebene eines dreidimensionalen (3-D) xyz-Raum. Dann das Kreuzprodukt von zwei aufeinander folgenden Kanten ist ein Vektor in z-Richtung (positive z-Richtung, wenn das zweite segment ist im Uhrzeigersinn, minus z-Richtung, wenn es gegen den Uhrzeigersinn). Die Größe dieses Vektors ist proportional zum Sinus des Winkels zwischen den beiden ursprünglichen Kanten, so dass es ein maximum erreicht, wenn Sie senkrecht zueinander stehen, und verjüngt zu verschwinden, wenn die Kanten sind kollinear (parallel).
Also für jeden vertex (Punkt) des Polygons, Berechnung des Kreuz-Produkt der Größe der beiden anliegenden Seiten:
So Beschriften Sie die Kanten nacheinander als
edgeA
ist das segment vonpoint0
zupoint1
undedgeB
zwischenpoint1
zupoint2
...
edgeE
ist zwischenpoint4
undpoint0
.Dann Vertex A (
point0
) wird zwischenedgeE
[Auspoint4
zupoint0
]edgeA
[Auspoint0
`Punkt1'Diese beiden Kanten sind selbst Vektoren, deren x-und y-Koordinaten können ermittelt werden, indem die Koordinaten Ihres start-und end-Punkte:
edgeE
=point0
-point4
=(1, 0) - (5, 0)
=(-4, 0)
undedgeA
=point1
-point0
=(6, 4) - (1, 0)
=(5, 4)
undUnd das Kreuzprodukt dieser beiden angrenzenden Kanten wird berechnet, indem die Determinante der folgenden matrix, die aufgebaut ist, indem Sie die Koordinaten der beiden Vektoren unten die Symbole der drei Koordinatenachsen (
i
j
&k
). Die Dritte (null)-Werten zu koordinieren ist, weil es das Kreuz-Produkt-Konzept ist eine 3-D konstruieren, und so erweitern wir diese 2-D-Vektoren in 3-D in Hinblick auf die Anwendung der cross-Produkt:Gegeben, dass alle cross-Produkte produzieren einen Vektor senkrecht zu der Ebene der beiden Vektoren multipliziert wird, die Determinante der matrix oben hat nur eine
k
(oder z-Achse) Komponente.Die Formel für die Berechnung der Größenordnung der
k
- oder z-Achsen-Komponentea1*b2 - a2*b1 = -4* 4 - 0* 1
=-16
Die Größenordnung dieses Wertes (
-16
), ist ein Maß für den Sinus des Winkels zwischen die 2 original-Vektoren, multipliziert mit dem Produkt der Größen der 2-Vektoren.Tatsächlich, eine andere Formel für Ihren Wert ist
A X B (Cross Product) = |A| * |B| * sin(AB)
.So, um wieder auf nur ein Maß für den Winkel, den Sie benötigen, teilen Sie diesen Wert, (
-16
), durch das Produkt der Größen der beiden Vektoren.|A| * |B|
=4 * Sqrt(17)
=16.4924...
Damit das Maß der Sünde(AB) =
-16 /16.4924
=-.97014...
Dies ist ein Maß dafür, ob das nächste segment nach dem vertex hat sich gebeugt nach Links oder rechts, und um wie viel. Es gibt keine Notwendigkeit, nehmen Sie die arc-Sinus. Alle wir Sorge über, ist seine Größe, und natürlich auch dessen Vorzeichen (positiv oder negativ)!
Tun Sie dies für jeden der anderen 4 Punkte rund um den geschlossenen Pfad, und fügen Sie die Werte aus dieser Berechnung an jedem Scheitelpunkt..
Wenn die endgültige Summe ist positiv, Sie gingen im Uhrzeigersinn, negative gegen den Uhrzeigersinn.
InformationsquelleAutor der Antwort Charles Bretana
Ich denke, das ist eine ziemlich alte Frage, aber ich werde werfen eine andere Lösung trotzdem zu, weil es unkompliziert und mathematisch nicht intensiv - es werden einfache algebra. Die Berechnung der signierten Fläche des Polygons. Wenn es negativ ist, werden die Punkte im Uhrzeigersinn angeordnet, wenn Sie positiv sind Sie gegen den Uhrzeigersinn. (Dies ist sehr ähnlich zur Beta-Lösung.)
Berechnung der signierten Fläche:
A = 1/2 * (x1*y2 - x2*y1 + x2*y3 - x3*y2 + ... + xn*y1 - x1*yn)
Oder in pseudo-code:
Beachten Sie, dass wenn Sie nur die überprüfung der Bestellung, Sie brauchen nicht zu stören, geteilt durch 2.
Quellen: http://mathworld.wolfram.com/PolygonArea.html
InformationsquelleAutor der Antwort Sean the Bean
Hier ist eine einfache C# - Implementierung des Algorithmus basiert auf diese Antwort.
Nehmen wir an, wir haben eine
Vector
Typ mitX
undY
Eigenschaften von Typdouble
.InformationsquelleAutor der Antwort Olivier Jacot-Descombes
Finden, der vertex mit der kleinsten y (und größten x, wenn es Unentschieden). Lassen Sie den Scheitelpunkt sein
A
und die nächsten vertices in der Liste werdenB
undC
. Nun berechnen Sie die Unterschreiben der das Kreuzprodukt vonAB
undAC
.Referenzen:
Wie finde ich die Ausrichtung eines einfachen Polygons? in
Häufig Gestellte Fragen: comp.Grafik.algorithmen.
Kurvenausrichtung bei Wikipedia.
InformationsquelleAutor der Antwort lhf
Beginnen Sie an einem der Eckpunkte, und berechnen Sie den Winkel, unter dem jede Seite.
Die erste und die Letzte null (also überspringen); für den rest, der Sinus des Winkels wird durch das Kreuzprodukt der Normalisierungen der Einheit der Länge (point[n]-point[0]) und ([n-1]-point[0]).
Wenn die Summe der Werte, die positiv ist, dann wird das polygon gezeichnet wird, in der anti-im Uhrzeigersinn Sinn.
InformationsquelleAutor der Antwort Steve Gilham
Für was es Wert ist, habe ich dieses mixin zu berechnen, die Wicklung um für die Google Maps API v3-apps.
Den code nutzt die Nebenwirkung von polygon-Flächen: eine im Uhrzeigersinn gewundene Reihenfolge der Eckpunkte ergibt einen positiven Bereich, während eine Zähler-im Uhrzeigersinn-Wicklung, um die gleichen Ecken produziert auf der gleichen Fläche wie einen negativen Wert. Der code verwendet auch eine Art private-API in der Google-Maps-geometrie-Bibliothek. Ich fühlte mich bequem, es zu benutzen - Verwendung auf eigene Gefahr.
Beispiel für die Nutzung:
Vollständiges Beispiel mit unit-tests @ http://jsfiddle.net/stevejansen/bq2ec/
InformationsquelleAutor der Antwort Steve Jansen
Wenn Sie mit Hilfe von Matlab die Funktion
ispolycw
gibt true zurück, wenn die polygon-Kanten sind im Uhrzeigersinn angeordnet.InformationsquelleAutor der Antwort Frederick
Als auch erläutert in diesem Wikipedia-Artikel Kurvenausrichtungdie 3 Punkte
p
q
undr
auf der Ebene (also mit x-und y-Koordinaten), können Sie berechnen Sie das Vorzeichen der folgenden DeterminanteWenn die Determinante negativ ist (d.h.
Orient(p, q, r) < 0
), dann das polygon orientiert sich im Uhrzeigersinn (CW). Wenn die Determinante positiv ist (d.h.Orient(p, q, r) > 0
), die polygon-orientiert gegen den Uhrzeigersinn (CCW). Die Determinante ist null (D. H.Orient(p, q, r) == 0
) wenn die Punktep
q
undr
sind kollinear.In der Formel oben, wir stellen diejenigen vor, die die Koordinaten der
p
q
undr
weil wir mit homogene Koordinaten.InformationsquelleAutor der Antwort Ian
Dies ist die implementierte Funktion für OpenLayers 2. Die Bedingung dafür, dass ein polygon im Uhrzeigersinn ist
area < 0
es bestätigt diese Referenz.InformationsquelleAutor der Antwort MSS
Denke ich in Ordnung für ein paar Punkte, die gegeben werden, im Uhrzeigersinn alle Kanten müssen positiv sein, nicht nur die Summe der Kanten. Wenn eine Kante ist negativ als mindestens 3 Punkte werden gegen den Uhrzeigersinn.
InformationsquelleAutor der Antwort daniel
Mein C# /LINQ-Lösung basiert auf der cross-Produkt-Ratschläge von @charlesbretana ist unten. Sie können eine Referenz für den normalen Wicklung. Es sollte funktionieren, solange die Kurve wird meist in der Ebene definiert durch den Vektor nach oben.
mit einem unit-test
InformationsquelleAutor der Antwort bradgonesurfing
Dies ist meine Lösung mit den Erklärungen in den anderen Antworten:
InformationsquelleAutor der Antwort Gianni Spear
Rechnerisch eine viel einfachere Methode, wenn Sie bereits wissen, ein Punkt innerhalb des Polygons:
Wählen Sie eine beliebige Zeile segment aus dem ursprünglichen polygon, Punkte und Ihre Koordinaten in dieser Reihenfolge.
Hinzufügen einer bekannten "Insider" - Punkt und ein Dreieck bilden.
Berechnen Sie den CW-oder CCW-wie vorgeschlagen hier mit denen sich die drei Punkte.
InformationsquelleAutor der Antwort Venkata Goli
Nach der Prüfung mehrere unzuverlässig Implementierungen des Algorithmus zufriedenstellende Ergebnisse in Bezug auf das CW - /CCW-Orientierung aus der box war das eine, geschrieben von OP in diese thread (
shoelace_formula_3
).Wie immer, eine positive Zahl steht für einen CW-Orientierung, in der Erwägung, dass eine negative Zahl nach Links.
InformationsquelleAutor der Antwort Marjan Moderc
Hier ist swift 3.0-Lösung, basierend auf den Antworten oben:
InformationsquelleAutor der Antwort Toby Evetts
Andere Lösung für dieses;
Nehmen alle Eckpunkte als ein array wie dieses;
InformationsquelleAutor der Antwort Ind
Lösung für R zu bestimmen, die Richtung und die umgekehrte, wenn im Uhrzeigersinn (fand es notwendig für owin-Objekte):
InformationsquelleAutor der Antwort dez
finden Sie die Mitte der Masse diese Punkte.
nehme an, es sind die Linien von diesem Punkt um Ihre Punkte.
finden Sie den Winkel zwischen zwei Linien, die für line0 line1
als es für line1 und line2
...
...
wenn dieser Winkel ist streng monoton Steigend, als es gegen den Uhrzeigersinn ,
else if monoton abnehmend, es ist im Uhrzeigersinn
anderen (es ist nicht monotonical)
you cant entscheiden, so ist es nicht klug,
InformationsquelleAutor der Antwort ufukgun