2016-04-04 16 views
1

Guten Abend,Erstellen Sie eine Rotationsmatrix von 2 Normalen

Ich möchte einen Weg finden, wie ich eine Rotationsmatrix mit nur 2 normalen Vektoren erstellen könnte. Einer ist der Ursprungsvektor (0,1,0) und einer ist die Normale, in die ich die Punkte verschieben möchte.

Also in der Theorie muss ich dann meine r-Matrix um jeden Punkt multiplizieren.

So stellt dieses Bild mein Problem: enter image description here

Ich habe auch gegoogelt, ich habe auch etwas gefunden, aber ich denke, das ist nicht, was ich wirklich will.

EDIT: Dies ist auch für 3D-Raum, das Bild ist nur zum besseren Verständnis.

+0

ist '(0,0,0)' ein fester Punkt für die Rotation? –

+0

Ja, erst nach der Drehung möchte ich diese gedrehten Punkte übersetzen. – Sens4

Antwort

0

Guten Morgen.

Angenommen, Sie möchten die Drehung der Karte einen Vektor U auf einen Vektor V schreiben. Dann ist W=U^V (Kreuzprodukt) die Axt der Rotation und ist eine Invariante. Sei M die zugehörige Matrix. schließlich

Wir haben:

       (V,W,V^W) = M.(U,W,U^W) 

Nun lassen Sie den Code schreiben:

from pylab import cross,dot,inv 

def rot(U,V): 
    W=cross(U,V) 
    A=np.array([U,W,cross(U,W)]).T 
    B=np.array([V,W,cross(V,W)]).T 
    return dot(B,inv(A)) 

Ein Beispiel:

In [2]: U = np.array([4, 3, 8]) 
Out[3]: V = np.array([1, 3, 4]) 

In [6]: M=rot(U,V) 
In [7]: dot(M,U) 
Out[7]: array([ 1., 3., 4.]) 

In [9]: W=cross(U,V) 

In [10]: allclose(W,dot(M,W)) 
Out[10]: True  

Beachten Sie, dass U und V muss nicht Einheitsvektoren sein, einfach nicht parallel. Die Transformation ist eine Rotation, wenn die Normen gleich sind.

Verwandte Themen