Wie kann ich feststellen, ob zwei Polygone schneiden?
Vorstellen, ich habe die Koordinaten der 4 Punkte, die form eines Polygons. Diese Punkte werden dargestellt PointF in C#. Wenn ich 2 Polygone (8 Punkte), wie kann ich feststellen, ob Sie sich schneiden?
Rechteck-Klasse hat eine Methode namens IntersectsWith, aber ich konnte nicht finden, etwas ähnliches für GraphicsPath oder Region.
Jede Beratung würde sehr geschätzt werden.
Mosh
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als Charlie schon darauf hingewiesen, Sie können die Trennung von Achse-theorem.
Check-out dieser Artikel für eine C# - Implementierung und Beispiel-polygon collision detection.
Habe ich auch diese Frage beantwortet hier die sich mit 2D-Kollision in C#.
Streng genommen, die anderen Antworten, die auf eine Algorithmus sind wahrscheinlich Ihre beste Wette. Aber die Leistung beiseite, du hast erwähnt, konnte nichts finden wie IntersectsWith für GraphicsPath oder Region. Es gibt jedoch eine Intersect-Methode, die updates, um die region zu sein, die Kreuzung selbst und andere region oder einen anderen Pfad. Man konnte zwei Regionen, Schneiden() eine mit dem anderen, dann testen Sie für Region.IsEmpty().
Aber ich denke, das ist wohl ein ziemlich langsam Weg, es zu tun und würde wahrscheinlich Ergebnis in eine Menge von Zuordnungen, wenn in einer Schleife.
Wenn Ihr die Polygone konvex sind, dann sollten Sie in der Lage sein zu verwenden separating axis theorem. Eine demo ist verfügbar hier (in actionscript-Code, aber der code sollte einfache Portierung auf c#)
Dies ist wirklich nicht mein Gebiet, aber ich hoffe es hilft trotzdem.
Dies ist eine alte Frage, aber ich dachte, ich würde teilen meine Lösung auch. Region.IsEmpty() erfordert einen Grafik-Kontext und aus meinem Verständnis ist nur konzipiert, um pixelgenau auf Treffer testen. Dies ist nicht ideal für viele Situationen. Eine viel bessere Lösung ist die Verwendung des Clipper-Bibliothek, die von Angus Johnson. Meiner Erfahrung nach ist das ein schnell-gut getestet-Bibliothek. Sie können Ihre eigene Präzision und verarbeitet sehr komplexe Polygone.
http://www.angusj.com/delphi/clipper.php
Es ist eine C# - Implementierung. Was Sie würden tun müssen, ist, führen Sie eine Kreuzung Bedienung genau wie das System.Zeichnung.Region-Methode. Dann überprüfen Sie das Ergebnis der operation. Wenn es leer ist, gab es keinen Schnittpunkt. Wenn es Daten enthält, dann werden die Daten die sich überschneidenden Punkte.
http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Types/ClipType.htm
Einige Methoden, die Sie finden würde nützlich für diese.
Durchführen und eine Kreuzung