Ich habe 2 Polygone. Ich kenne die Scheitelpunktkoordinaten beider Polygone. Was ist der beste Weg, um zu überprüfen, ob sich einer vollständig im anderen befindet? Zum Beispiel sollte der Algorithmus nur das schwarze Trapez unten als enthalten erkennen:
collision-detection
vector
geometry
user960567
quelle
quelle
Antworten:
Es gibt Unmengen von Quellausschnitten für eine Methode, die einen Test für " Punkt innerhalb des Polygons " durchführt. Das Prinzip stammt aus dem jordanischen Kurvensatz für Polygone ( http://www-cgrl.cs.mcgill.ca/~godfried/teaching/cg-projects/97/Octavian/compgeom.html ).
Der naive Weg wäre: Wenn Sie diese Methode haben, nennen Sie sie
PointInsidePolygon(Point p, Polygon poly)
:Theoretisch sollte kein Szenario für Ihre Polygone fehlen, aber es ist nicht die optimale Lösung.
Bemerkungen zum Fall "Edge"
PointInsidePolygon(..)
muss true zurückgeben, wenn sich der Punkt am Rand des Polygons befindet (entweder auf einer Kante liegt oder ein Scheitelpunkt ist)EdgesIntersect(..)
muss false zurückgeben, wenn dasinnerEdge
eine Teilmenge (geometrisch) der istouterEdge
. In diesem Fall schneiden sich die Kanten offensichtlich, aber für den Zweck des Algorithmus müssen wir angeben, dass der Schnittpunkt die Semantik hinter derisInside
Variablen nicht brichtGeneral Remakrs :
Ohne Kanten-Kanten-Schnittpunktprüfungen, wie in den Kommentaren ausgeführt, kann der Ansatz für einige konkave Polygone (z. B. ein V-förmiges Quad und ein Rechteck) falsch positive Ergebnisse zurückgeben - das Rechteck hat möglicherweise alle seine Eckpunkte innerhalb der V-Form, schneidet sie jedoch , also zumindest einige Bereiche außerhalb).
Nachdem überprüft wurde, ob mindestens einer der Eckpunkte des inneren Polygons innerhalb des äußeren liegt, und wenn sich keine Schnittkanten befinden, bedeutet dies, dass die gesuchte Bedingung erfüllt ist.
quelle
Versuchen Sie, mit jeder roten Linie einen Linienschnitt zu machen. Im Pseudocode:
Wie Sie sehen, wird diese Lösung jedoch langsamer, wenn Sie weitere zu überprüfende Polygone hinzufügen. Eine andere Lösung könnte sein:
Diese Lösung ist sehr schnell, hängt jedoch von Ihrer Implementierung ab (und davon, was Sie mit dem Ergebnis Ihrer Prüfung tun möchten), welche Lösung für Sie am besten geeignet ist.
quelle