Unterzeichnet Winkel zwischen zwei Vektoren, ohne eine Referenz-Ebene
(In drei Dimensionen) ich bin auf der Suche nach einem Weg, um zu berechnen, unterzeichnet Winkel zwischen zwei Vektoren, da keine anderen Informationen als die Vektoren. Wie beantwortet diese Frage, es ist einfach genug, um zu berechnen, unterzeichnet angegebene Winkel der normalen der Ebene, auf die die Vektoren senkrecht zueinander stehen. Aber ich finde keinen Weg, dies zu tun, ohne dass Wert. Es ist offensichtlich, dass das Kreuzprodukt zweier Vektoren erzeugt so eine normale, aber ich habe in der folgenden Widerspruch mit der Antwort oben:
signed_angle(x_dir, y_dir) == 90
signed_angle(y_dir, x_dir) == 90
wo ich erwarten würde, dass das zweite Ergebnis negativ. Dies ist aufgrund der Tatsache, dass das Kreuzprodukt cross(x_dir, y_dir)
ist in die entgegengesetzte Richtung cross(y_dir, x_dir)
die folgenden psuedocode mit normalisierter input:
signed_angle(Va, Vb)
magnitude = acos(dot(Va, Vb))
axis = cross(Va, Vb)
dir = dot(Vb, cross(axis, Va))
if dir < 0 then
magnitude = -magnitude
endif
return magnitude
Ich glaube nicht, dass dir jemals negativ über.
Ich gesehen habe das gleiche problem mit den vorgeschlagenen atan2 Lösung.
Ich bin auf der Suche nach einem Weg zu machen:
signed_angle(a, b) == -signed_angle(b, a)
- ist das nicht: jtaylor1142001.net/calcjat/Solutions/VDotProduct/VDPTheta3D.htm das, was du suchst?
- Der link im obigen Kommentar funktioniert nicht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Bereich der relevanten mathematischen Formeln:
Einen robusten Winkel zwischen 3-D Vektoren, Ihre eigentliche Berechnung sollte sein:
Wenn Sie
acos(c)
allein, Sie bekommen schwere Präzisions-Probleme für die Fälle, wenn der Winkel klein ist. Computings
und mitatan2()
gibt Ihnen ein robustes Ergebnis für alle möglichen Fälle.Seit
s
immer nicht negativer, der resultierende Winkel im Bereich von 0 bis pi. Es wird immer eine gleichwertige negative Winkel(angle - 2*pi)
, aber es gibt keinen geometrischen Grund, es lieber.f(x, y) == f(y, x)
. Es können nicht sagen, der Unterschied, das
ist nicht-negativ, und das Kreuz-Produkt ist die einzige Sache, die gesagt hätten, Sie über die Richtung zwischen den beiden.Ich denke, das ist unmöglich, ohne irgendeine Art von Referenz Vektor.
a cross b
oder inb cross a
- swap-Vektoren, und du bekommst Achse gerichtet in die entgegengesetzte Richtung. Als ein Ergebnis ist es unmöglich zu bestimmen, wenn der Drehwinkel 0..pi-Bereich oder wenn es in pi..pi*2-Bereich.Danke an alle. Nach Durchsicht der Kommentare hier und im Rückblick auf das, was ich versuche zu tun, merkte ich, dass ich erreichen kann, was ich tun müssen, um mit den gegebenen standard-Formel für eine signierte Winkel. Ich habe gerade hing in der unit-test für meine signierte angle-Funktion.
Als Referenz, ich bin Fütterung der resultierende Winkel wieder in eine drehen-Funktion. Ich hatte nicht berücksichtigt, für die Tatsache, dass dies natürlich die Verwendung der gleichen Achse wie in signed_angle (das Kreuzprodukt von input-Vektoren) und die richtige Drehrichtung Folgen, von denen je Richtung, in die Achse stellen.
Mehr einfach gesagt, beide sollten nur "do the right thing", und drehen Sie in verschiedene Richtungen:
Wo das erste argument ist die Achse der rotation und der zweite ist der Betrag, zu drehen.
Wenn alle Sie wollen, ist ein konsistentes Ergebnis, dann ist jede beliebige Art und Weise der Auswahl zwischen eine × b und b × eine für Ihre normalen tun wird. Vielleicht nehmen die, die lexikographisch kleiner?
(Aber möchten Sie vielleicht, um zu erklären, welches problem du eigentlich zu lösen versuchen: vielleicht gibt es eine Lösung, die nicht beinhaltet die Berechnung einer konsistenten unterzeichnet Winkel zwischen beliebigen 3-Vektoren.)