Frage

Ich mag den Winkel zwischen zwei Vektoren a und b berechnen. Nehmen wir an, diese im Ursprung sind. Dies kann mit gemacht werden

theta = arccos(a . b / |a| * |b|)

Allerdings arccos gibt Ihnen den Winkel in [0, pi], das heißt, es wird nie einen Winkel von mehr als 180 Grad geben, das, was ich will. So wie finden Sie heraus, wenn die Vektoren über die 180-Grad-Marke gegangen sind? In 2D Ich würde das Vorzeichen der y-Komponente auf einem der Vektoren lassen Sie einfach bestimmen, welche Quadranten der Vektor ist in. Aber was ist der einfachste Weg, es in 3D zu tun?

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

War es hilfreich?

Lösung 2

kam ich auf die folgende Lösung, die die Vorteile der Richtungsänderung des Kreuzprodukt der beiden Vektoren nimmt:

  1. Machen Sie einen Vektor n = a X b und normalisieren. Dieser Vektor ist senkrecht zur Ebene überspannt von a und b.

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

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

Andere Tipps

Das funktioniert in 2D, weil Sie eine Ebene, in der definiert haben definieren Sie die Rotation.

Wenn Sie dies in 3D machen wollen, gibt es keine solche implizite 2D-Ebene. Sie können Ihre 3D-Koordinaten auf einer 2D-Ebene geht durch alle drei Punkte, und tun Sie Ihre Berechnung innerhalb dieser Ebene zu transformieren.

Aber es gibt natürlich zwei mögliche Orientierungen für die Ebene, und das beeinflusst die Winkel sein werden> 180 oder kleiner.

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

Erste das Kreuzprodukt der beiden Vektoren eine Ebene erstellen, dann ist Sie die normale dieser Ebene 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 das Zeichen zu bestimmen.
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.

Sie einfach 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 werden.

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

Edit: Klarstellung von erstellt Vektoren a X b = p. Dies ist senkrecht sowohl a und b. Dann tun entweder: a X p b X p oder einen 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.

Genau genommen zwei 3D-Vektoren haben immer zwei Winkel zwischen ihnen - ein unterhalb oder gleich 180, die andere über oder gleich 180 Arccos gibt Ihnen eine von ihnen, können Sie die anderen bekommen können von von 360. denken sie daran, Subtraktion 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, können Sie nicht in der Theorie, sagen, welche der beiden Winkelwerte sollten berücksichtigt werden.

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

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