Frage

Ich wollte den Winkel zwischen zwei Dreiecken im 3D -Raum berechnen. Die beiden Dreiecke teilen immer genau zwei Punkte. z.B

Dreieck 1:

Point1 (x1, y1, z1),  
Point2 (x2, y2, z2),   
Point3 (x3, y3, z3).  

Dreieck 2:

Point1 (x1, y1, z1),  
Point2 (x2, y2, z2),  
Point4 (x4, y4, z4).

Gibt es eine Möglichkeit, den Winkel zwischen ihnen in CUDA effizient zu berechnen?

War es hilfreich?

Lösung

Für jede Ebene müssen Sie seinen normalen Vektor konstruieren (senkrecht zu allen Linien in dieser Ebene). Der einfache Weg, dies zu tun, besteht darin, das Querprodukt zweier nichtparalleler Linien im Dreieck zu übernehmen. (Ex (p3-p1) X (P2-p1) und (p4-p1) X (P2-p1).

Normalisieren Sie diese.

Das Punktprodukt dieser beiden Richtungsvektoren gibt Ihnen den Cosinus des Winkels.

Das schwierige Stück ist es, auf degenerierte Dreiecke zu achten! Wenn alle 3 Punkte, die eines der eines Dreiecks definieren, kolinear sind (dieses Dreieck ist nur eine Linie), dann ist das, was Sie verlangen, undefiniert, und das Querprodukt wird sich durch Null teilen. Sie müssen entscheiden, was Sie in diesem Fall tun werden.

Da Sie versuchen, dies auf einer GPU zu tun, möchten Sie diese Funktion idealerweise ohne Zweige schreiben, wenn Sie sich um die Effizienz befassen. Das würde bedeuten, anstatt auf degenerierte Dreiecke mit einem zu testen if Klausel, Sie sollten versuchen, dies mit einem ternären Ternary zu tun A ? B : C

Andere Tipps

Der Winkel zwischen den Dreiecken entspricht dem Winkel zwischen den Flugzeugen, die durch die drei Punkte jedes Dreiecks definiert sind.

Da sowohl Punkt 1 als auch Punkt 2 in beiden Ebenen liegen, finden Sie die Richtungs -Cosine von einem dieser Punkte zu Punkt 3 und dann zu Punkt 4, dann ist der Cosinus des Winkels zwischen diesen beiden Linien nur die Summe der Produkte der entsprechenden Richtungs -Cosinus.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top