Kurz gesagt, Hassans Antwort ist am schnellsten.
Ссылка
Dies ist der schnellste Code in Javascript:
%Vor%
Ich habe die obige Geige geschrieben, um ein paar verschiedene Techniken zu testen und die Geschwindigkeit zu vergleichen. Alle Techniken basieren auf einer Kombination von drei verschiedenen Werkzeugen:
-
Baryzentrischer Punkt-in-Dreieck-Test : Konvertiere einen Punkt von einem x, y-Raum in einen u, v-Raum, wobei u, v zwei Seiten des Dreiecks sind. Dann teste, ob der Punkt innerhalb des Dreiecks (0,0) (0,1) (1,0) liegt, was einfach ist.
-
Punkt-in-Dreieck-Test auf derselben Seite : Dieser Test sagt Ihnen, ob ein Winkel mehr oder weniger als 180 Grad beträgt. Wenn das Dreieck a, b, c ist und Ihr Punkt p ist, prüfen Sie, ob die Winkel pab und bac beide mehr oder beide kleiner als 180 sind. Sie müssen dies für ab, bc und ca. Wenn etwas wahr ist, ist der Punkt draußen. Dieser Test ist langsamer als baryzentrisch für einen Punkt.
-
Liniensegmentschnittpunkt : Überprüfen Sie, ob das Liniensegment a, b das Liniensegment c, d schneidet. Um dies zu tun, finden Sie den Punkt, wo sich die zwei Linien kreuzen und dann überprüfen, dass diese Linien in der Bounding Box von a, b und b, c sind. Das ist ungefähr so schnell wie Barycentric.
Das sind die Werkzeuge. Um herauszufinden, ob sich Dreiecke überschneiden, gibt es 3 Möglichkeiten, die ich getestet habe:
-
8-Linien-Schnittpunkt und 2 Punkt-in-Dreieck-Dreieck : Sie benötigen nur 8 Schnittpunkte und nicht alle 9, da es nicht nur 1 Schnittpunkt geben kann. Danach brauchen Sie 2 Punkt-in-Dreieck, falls ein Dreieck vollständig innerhalb des anderen liegt.
-
6-Linien-Schnittpunkt und 4-Punkt-in-Dreieck : Wenn Sie es herausziehen, können Sie sehen, dass Sie eine Seite eines der Dreiecke für einen Linienschnitt vollständig ignorieren können und dann einfach alle anderen Dreiecke ausführen Punkte für Punkt-in-Dreieck. Da Linienkreuzung und Baryzentrik ungefähr gleich schnell sind, ist dies nicht viel besser als # 1. Aber wenn Sie die gleiche Seite verwenden, wird es schneller sein, da der gleiche Punkt in Dreiecksrichtung langsamer ist.
-
9 Punkt-in-Dreieck-Tests auf derselben Seite : Sie können entweder baryzentrisch oder auf derselben Seite verwenden. Für beides modifizieren Sie den Punkt-in-Dreieck, um 3 Punkte gleichzeitig zu testen, und Sie möchten nicht nur testen, dass alle drei außerhalb des Dreiecks liegen. Sie müssen testen, dass sie alle 3 außerhalb von sind auf der gleichen Seite . Da wir viele Informationen erneut verwenden, können wir bei den Berechnungen Zeit sparen. Auch hier wirkt Baryzentrik etwas schneller als die gleiche Seite.