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
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.
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.
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.
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%Tags und Links c# system.drawing polygon intersection