2012-10-30 2 views
1

3D a, b, c에 세 개의 벡터가 있습니다. 이제 a에 적용될 때 b와 평행 한 결과를 산출하는 회전 r을 계산하려고합니다. 그런 다음 회전 r을 c에 적용해야합니다.3D에서 회전

어떻게 이것을 파이썬으로 할 수 있습니까? numpy/scipy로이 작업을 수행 할 수 있습니까?

+0

에 대한 질문이 있습니다 더 일반적인 범위 :
http://stackoverflow.com/questions/1076778/good-geometry-library-in-python –

+0

답으로 다른 SO 질문을 쓰는 대신이 질문을 다음과 같이 표시하는 것이 좋습니다. 다른 질문의 사본. ;) – erikbwork

+0

@ erikb85 다른 질문은 범위가 훨씬 넓습니다. 내 질문에 Stefano Borinis 질문에 적용되지 않는 대답이있을 수 있습니다. –

답변

0

"파이썬에 대한 기하 도형 라이브러리"는 이미 질문에 대한 주석으로 대답 할 것으로 가정합니다. 그러므로 'a'를 'b'와 평행하게 변환하면, 'c'에만 적용됩니다.

벡터 'a'와 'b'는 평면을 고유하게 정의합니다. 각 벡터는 원점과의 점 차이로 정규 표현식을 가지므로 'a'의 머리, 'b'의 머리, 원점이라는 세 가지 점이 있습니다. 먼저이 비행기를 계산하십시오.

이 평면의 법선 벡터는 회전 축과 회전 방향에 대한 부호 규칙을 모두 정의합니다. 모두 공선이므로 비행기에 대한 하나의 법선 벡터 만 있으면됩니다. 평면에서 두 개의 비 공선 벡터를 선택하고 법선 벡터로 내적을 취함으로써 이러한 벡터를 풀 수 있습니다. 이렇게하면 Cramer의 규칙과 같은 표준 방법으로 해결할 수있는 두 가지 변수로 된 선형 방정식 쌍이 제공됩니다. 이러한 모든 조작에서 A, B 또는 C 중 하나가 0이면 처리 할 특별한 경우가 있습니다.

회전 각도는 내적 'a'와 'b'의 코사인 관계와 그 길이로 주어집니다. 각도의 부호는 'a', 'b'및 법선 벡터의 3 개 곱으로 결정됩니다. 이제 조회 할 수있는 많은 정식 형식 중 하나에서 회전 행렬을 구성하기위한 모든 데이터를 얻었습니다. numpy 사용

1

: "파이썬에서 좋은 형상 라이브러리"

import numpy as np 
from numpy import linalg as LA 
from math import pi,cos,sin,acos 

def rotate(v,angle=0,ref=np.array([0,0,1]),deg=False): 
    '''Rotates a vector a given angle respect the 
     given reference. Option: deg=False (default)''' 
    if(abs(angle) < 1e-5): 
     return v 
    if(deg): 
     angle = angle*pi/180 
    # Define rotation reference system 
    ref = versor(ref) # rotation axis 
    # n1 & n2 are perpendicular to ref, and to themselves 
    n1 = versor(np.cross(ref,np.array([-ref[1],ref[2],ref[0]]))) 
    n2 = np.cross(ref,n1) 
    vp = np.inner(v,ref)*ref # parallel to ref vector 
    vn = v-vp # perpendicular to ref vector 
    vn_abs = LA.norm(vn) 
    if(vn_abs < 1e-5): 
     return v 
    alp = acos(np.inner(vn,n1)/vn_abs) # angle between vn & n1 
    if(triprod(ref,n1,vn) < 0): 
     alp = -alp # correct if necesary 
    return vp+vn_abs*(n1*cos(alp+angle)+n2*sin(alp+angle)) 

def triprod(a,b,c): 
    '''Triple product of vectors: a·(b x c)''' 
    return np.inner(a,np.cross(b,c)) 

def versor(v): 
    '''Unitary vector in the direction of the one given as input''' 
    v = np.array(v) 
    return v/LA.norm(v) 

###### Test ################################################ 
a = np.array([3,4,1]) 
b = np.array([0,-1,2]) 
c = np.array([1,1,5]) 
r = acos(np.inner(a,b)/(LA.norm(a)*LA.norm(b))) 
ref = versor(np.cross(a,b)) 
print rotate(c,angle=r,ref=ref) 
print r 
print ref 

관련 문제