Wie kann ich feststellen, ob sich zwei Polygone schneiden?

8

Stellen Sie sich vor, ich habe die Koordinate von 4 Punkten, die ein Polygon bilden. Diese Punkte werden mit PointF in C # dargestellt. Wenn ich 2 Polygone (mit 8 Punkten) habe, wie kann ich feststellen, ob sie sich schneiden?

Rectangle-Klasse hat eine Methode namens IntersectsWith, aber ich konnte etwas ähnliches für GraphicsPath oder Region nicht finden.

Jeder Rat würde sehr geschätzt werden.

Mosh

    
Mosh 01.09.2010, 05:45
quelle

4 Antworten

5

Wie Charlie bereits darauf hingewiesen hat, können Sie das Trennachsen-Theorem verwenden. Sehen Sie sich diesen Artikel für eine C # -Implementierung und ein Beispiel für die Polygon-Kollisionserkennung an.

Ich beantworte auch diese Frage hier , die sich mit 2D-Kollisionen in C # beschäftigt.

    
Patrick Klug 01.09.2010, 06:00
quelle
4

Genau genommen sind die anderen Antworten, die einen Algorithmus vorschlagen, wahrscheinlich die beste Wahl. Abgesehen von der Leistung haben Sie erwähnt, dass Sie IntersectsWith für GraphicsPath oder Region nicht finden können. Es gibt jedoch eine Intersect-Methode, bei der eine Region als Schnittpunkt zwischen sich selbst und einer anderen Region oder einem anderen Pfad aktualisiert wird. Sie könnten zwei Regionen erstellen, Intersect () mit dem anderen, Testen Sie dann für Region.IsEmpty ().

Aber ich stelle mir vor, dass dies wahrscheinlich ein ziemlich langsamer Weg ist, um es zu tun und würde wahrscheinlich eine Menge Zuweisungen ergeben, wenn es in einer Schleife gemacht wird.

    
Josh 01.09.2010 06:05
quelle
1

Wenn Ihre Polygone konvex sind, sollten Sie das Achsensatz getrennt anwenden . Eine Demo ist verfügbar hier (Es ist in ActionScript, aber der Code sollte einfach nach c # portiert werden)

Das ist wirklich nicht mein Bereich, aber ich hoffe, es hilft trotzdem.

    
Karl Johan 01.09.2010 05:57
quelle
1

Das ist eine alte Frage, aber ich dachte, ich würde meine Lösung auch teilen. Region.IsEmpty () benötigt einen Grafikkontext und ist meines Wissens nur dazu gedacht, Pixel-Präzisionstests durchzuführen. Dies ist für viele Situationen nicht ideal. Eine viel bessere Lösung ist die Verwendung der Clipper-Bibliothek von Angus Johnson. Nach meiner Erfahrung ist dies eine schnelle, gut getestete Bibliothek. Sie können Ihre eigene Präzision bereitstellen und extrem komplexe Polygone verarbeiten.

Ссылка

Es gibt eine C # -Implementierung. Was Sie tun müssten, ist eine Schnittoperation genau wie die System.Drawing.Region-Methode durchzuführen. Untersuchen Sie dann das Ergebnis der Operation. Wenn es leer ist, gab es keine Kreuzung. Wenn es Daten enthält, sind die Daten die Schnittpunkte.

Ссылка

Einige Methoden, die Sie dafür nützlich finden könnten.

%Vor%

Und um eine Kreuzung durchzuführen

%Vor%     
Particleman 27.11.2015 17:50
quelle