Wie berechnet man den Reflex Winkel zwei Vektoren im 3D-Raum Stack-Überlauf gegeben

Ich möchte, den Winkel zwischen zwei Vektoren a und b berechnen. Nehmen wir an, diese im Ursprung sind. Dies kann getan werden, mit

EDIT: Ich wollte die Frage allgemein halten, aber hier gehen wir. Ich programmiere dies in c und der Code, den ich um den Winkel zu bekommen verwenden ist Theta = acos (Punkt (a, b) / mag (a) * mag (b)), so wie würden Sie programmatisch die Ausrichtung bestimmen?

I kam mit der folgenden Lösung, die die Vorteile der Richtungsänderung des Kreuzprodukt der beiden Vektoren erfolgt:

Stellen eines Vektors n = a X b und normalisieren sie. Dieser Vektor ist senkrecht zu der Ebene durch A und B überspannt.

Jedes Mal, wenn ein neuer Winkel berechnet wird, vergleichen Sie es mit der alten normal. Im Vergleich zu behandeln, die alte und die aktuellen Normalen als Punkte und der Abstand zwischen ihnen berechnen. Wenn dieser Abstand 2 der normalen (d.h. das Kreuzprodukt a X b hat, umgedreht).

Sie können einen Schwellenwert für den Abstand als der Abstand nach einem Flip haben wollen könnte kürzer sein als 2, je nachdem, wie die Vektoren a und b ausgerichtet sind, und wie oft Sie den Winkel aktualisieren.

Eine Lösung, die Sie verwenden können:
Was Sie effektiv tun müssen, ist eine Ebene erstellen, die einer der Vektoren koplanar zu.

Erste das Kreuzprodukt der beiden Vektoren eine Ebene erstellen, dann ist Sie die normale dieser Ebene zu erhalten, können Sie den Winkel zwischen diesen erhalten und den Vektor Sie müssen für den unterschriebenen Winkel zu bekommen, und Sie können den Winkel verwenden, um festzustellen, die Schild.
Wenn der Winkel größer als 90 Grad ist, dann ist es unter der Ebene erstellt; weniger als 90 Grad, und es ist oben.
Je nach Kosten der Berechnungen kann das Punktprodukt in diesem Stadium verwendet wird anstelle des Winkels.

So stellen Sie sicher, dass Sie immer die Normalen von der gleichen Reihenfolge von Vektoren berechnen.

Dies ist verwendbar leichter, wenn Sie die XYZ-Achsen verwenden, und das ist, was Sie vergleichen gegen, da Sie bereits die Vektoren für die Ebene benötigt.

Es gibt possbly effizientere Lösungen, aber das ist eine kam ich mit.

Edit: Klärung erstellt Vektoren a X b = p. Dies ist senkrecht sowohl a und b. Dann tut entweder: a X b oder p X p einem anderen Vektor zu schaffen, die senkrecht zu der Ebene, die durch die 2-Vektoren erzeugt wird. Wahl des Vektors hängt von dem Sie versuchen, für den Winkel zu finden.

Streng genommen, zwei 3D-Vektoren haben immer zwei Winkel zwischen ihnen - eine unterhalb oder gleich 180, die andere über oder gleich 180 Arccos Sie einer von ihnen gibt, können Sie die anderen durch Subtraktion von 360. Betrachten Sie es bekommen kann auf diese Weise : stellen Sie sich zwei Linien kreuzen. Sie haben 4 Winkel dort - 2 von einem Wert, 2 eines anderen. Was ist der Winkel zwischen den Linien? Keine allgemeingültige Antwort. Hier gilt das gleiche. Ohne irgendeine Art von zusätzlichen Kriterien, kann man nicht in der Theorie, sagen, welche der beiden Winkelwerte sollten berücksichtigt werden.

EDIT: Also, was Sie wirklich brauchen, ist ein beliebiges Beispiel für eine Orientierung zu fixieren. Hier ist eine: wir von der positiven Z-Richtung aus. Wenn die Ebene zwischen den beiden Vektoren, die die Z-Achse enthält, sehen wir von der positiven Y-Richtung. Wenn die Ebene YZ ist, sehen wir von der positiven X-Richtung. Ich werde denken, wie diese in Koordinatenform auszudrücken, dann wieder bearbeiten.