3D a, b, c에 세 개의 벡터가 있습니다. 이제 a에 적용될 때 b와 평행 한 결과를 산출하는 회전 r을 계산하려고합니다. 그런 다음 회전 r을 c에 적용해야합니다.3D에서 회전
어떻게 이것을 파이썬으로 할 수 있습니까? numpy/scipy로이 작업을 수행 할 수 있습니까?
3D a, b, c에 세 개의 벡터가 있습니다. 이제 a에 적용될 때 b와 평행 한 결과를 산출하는 회전 r을 계산하려고합니다. 그런 다음 회전 r을 c에 적용해야합니다.3D에서 회전
어떻게 이것을 파이썬으로 할 수 있습니까? numpy/scipy로이 작업을 수행 할 수 있습니까?
"파이썬에 대한 기하 도형 라이브러리"는 이미 질문에 대한 주석으로 대답 할 것으로 가정합니다. 그러므로 'a'를 'b'와 평행하게 변환하면, 'c'에만 적용됩니다.
벡터 'a'와 'b'는 평면을 고유하게 정의합니다. 각 벡터는 원점과의 점 차이로 정규 표현식을 가지므로 'a'의 머리, 'b'의 머리, 원점이라는 세 가지 점이 있습니다. 먼저이 비행기를 계산하십시오.
이 평면의 법선 벡터는 회전 축과 회전 방향에 대한 부호 규칙을 모두 정의합니다. 모두 공선이므로 비행기에 대한 하나의 법선 벡터 만 있으면됩니다. 평면에서 두 개의 비 공선 벡터를 선택하고 법선 벡터로 내적을 취함으로써 이러한 벡터를 풀 수 있습니다. 이렇게하면 Cramer의 규칙과 같은 표준 방법으로 해결할 수있는 두 가지 변수로 된 선형 방정식 쌍이 제공됩니다. 이러한 모든 조작에서 A, B 또는 C 중 하나가 0이면 처리 할 특별한 경우가 있습니다.
회전 각도는 내적 'a'와 'b'의 코사인 관계와 그 길이로 주어집니다. 각도의 부호는 'a', 'b'및 법선 벡터의 3 개 곱으로 결정됩니다. 이제 조회 할 수있는 많은 정식 형식 중 하나에서 회전 행렬을 구성하기위한 모든 데이터를 얻었습니다. numpy 사용
: "파이썬에서 좋은 형상 라이브러리"
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
에 대한 질문이 있습니다 더 일반적인 범위 :
http://stackoverflow.com/questions/1076778/good-geometry-library-in-python –
답으로 다른 SO 질문을 쓰는 대신이 질문을 다음과 같이 표시하는 것이 좋습니다. 다른 질문의 사본. ;) – erikbwork
@ erikb85 다른 질문은 범위가 훨씬 넓습니다. 내 질문에 Stefano Borinis 질문에 적용되지 않는 대답이있을 수 있습니다. –