Was ist der effizienteste Weg, um zu erkennen, Dreieck-Dreieck-Kreuzungen?
Wie kann ich feststellen, ob zwei Dreiecke schneiden sich im 2D euklidischen Raum? (d.h. klassische 2D-geometrie) angesichts der (X,Y) - Koordinaten jedes vertex in jedem Dreieck.
- Re das wirklich die meisten effizienten Algorithmus, hat es nicht viel Arbeit, die Frage - niemand hat sich entschlossen gezeigt, welche variation ist am schnellsten. Ein problem ist, dass ein Großteil der Diskussion bezieht tris im 3D-Raum. ZB realtimecollisiondetection.net/blog/?p=29 PS Solche Probleme sind Häufig gegossen in Bezug auf die Punkte auf der "richtigen Seite" eines Segments. ZB mochima.com/articles/cuj_geometry_article/..., Als Nick weist in seinem letzten Absatz, in der Praxis ist es alles darüber, wie gut Sie tun Keulen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Eine Möglichkeit ist, zu überprüfen, ob zwei Seiten von Dreieck A schneiden mit jeder Seite des Dreiecks B, und überprüfen Sie dann alle sechs Möglichkeiten, einen Punkt von A in B oder a Punkt B innerhalb A.
Für einen Punkt innerhalb eines Dreiecks siehe zum Beispiel: Punkt-in-Dreieck-test.
Wenn wir den test auf Kollisionen mit Polygonen, wir haben auch eine umschreibende Rechteck für unsere Polygone. Also haben wir den ersten test für Rechteck-Kollisionen und wenn es ein Treffer wir gehen mit polygon-Kollisionserkennung.
Python-Implementierung für line Kreuzung und Punkt-in-Dreieck-test, mit einer kleinen Modifikation.
Es ist eine vollständige interaktive demo.
t1 = [[0,0],[5,0],[0,5]]; t2 = [[-10,0],[-5,0],[-1,6]]; print (tri_intersect2(t1, t2), False)
line_intersect2
.Hier ist mein Versuch, das Dreieck-Dreieck-Kollisions-problem (implementiert in python):
Funktioniert es basiert auf der Grundlage der Tatsache, dass die Dreiecke nicht überlappen, wenn alle Punkte des Dreiecks 1 sind auf der Außenseite mindestens einer der Kanten des Dreiecks 2 (oder Umgekehrt, ist wahr). Natürlich, Dreiecke, nie konkav.
Ich weiß nicht, ob dieser Ansatz mehr oder weniger effizient ist als die anderen.
Bonus: ich portiert, es auf C++ https://gist.github.com/TimSC/5ba18ae21c4459275f90
Wie gesagt, müssen Sie überprüfen, ob ein Punkt in einem Dreieck. Der einfachste Weg, um zu überprüfen, ob ein Punkt in einem geschlossenen polygon zu zeichnen ist eine gerade Linie in jede Richtung von dem Punkt, und zählen, wie viele Male die Linie überquert einen Scheitelpunkt. Wenn die Antwort ist ungerade, dann ist der Punkt im polygon, selbst dann ist es draußen.
Einfachsten geraden Linie zu prüfen ist, die eine horizontal rechts neben dem Punkt (oder eine andere senkrechte Richtung). Dies macht die Prüfung für vertex Kreuzung fast trivial. Die folgenden Kontrollen sollten ausreichen:
Ist der Punkt die y-Koordinate zwischen
die y-Koordinaten der beiden end -
Punkte der Scheitelpunkt? Nein, dann
nicht cross.
Ist der Punkt die x-Koordinate größer als der am weitesten rechten Punkt aus Ende
die vertex? Ja, dann nicht kreuzen.
Ist der Punkt die x-Koordinate kleiner als der am weitesten linken Ende der vertex? Ja, dann kreuzen.
Wenn die oben genannten Fälle von scheitern, dann können Sie
verwenden Sie das Kreuzprodukt der Vektor
Vertreter der vertex und Vektor
gebildet, der aus dem Ende des vertex zu
der Punkt. Eine negative Antwort wird zeigen, liegt der Punkt auf einer Seite des vertex eine positive Antwort auf der anderen Seite des vertex, und eine null-Antwort auf den Scheitel. Dies funktioniert, weil ein Kreuzprodukt beinhaltet, dass der Sinus von zwei Vektoren.
Was Sie wirklich suchen ist eine "Point in Polygon" - Algorithmus. Wenn einer der Punkte eines Dreiecks sind in der anderen, Sie schneiden. Hier ist eine gute Frage, um heraus zu überprüfen.
Wie kann ich feststellen, ob ein 2D-Punkt innerhalb eines Polygons?