Python 获取旋转直线的坐标
我有两条线(A和B)由P1和P2(xyz)坐标定义Python 获取旋转直线的坐标,python,math,3d,rotation,linear-algebra,Python,Math,3d,Rotation,Linear Algebra,我有两条线(A和B)由P1和P2(xyz)坐标定义 p1_A = [5, 10, 3] p2_A = [15, 13, 3] p1_B = [6, 20, 3] p2_B = [9, 22, 5] 以及相应的旋转矩阵R,以将线A旋转到B: R = array([[ 0.8468851 , -0.29080408, -0.44521748], [ 0.22027131, 0.95385981, -0.20403924], [ 0.48401051, 0.0747
p1_A = [5, 10, 3]
p2_A = [15, 13, 3]
p1_B = [6, 20, 3]
p2_B = [9, 22, 5]
以及相应的旋转矩阵R,以将线A旋转到B:
R = array([[ 0.8468851 , -0.29080408, -0.44521748],
[ 0.22027131, 0.95385981, -0.20403924],
[ 0.48401051, 0.07472916, 0.87186546]])
然后,我计算点积来旋转向量R.dot(vecA)
。
我不知道如何从这里继续下去。我需要旋转线A的(xyz)坐标
编辑:
我尝试了hippozhipos的解决方案(红色虚线)来旋转线A。我希望虚线在中点(见绿点)旋转,并与蓝色(参考线)平行
直线A和旋转矩阵有两个点。因此,要获得旋转,只需将代表2个点的向量与旋转矩阵相乘。以下是执行此操作的函数:
def multVecMatrix(vec3, mat3):
x = vec3[0] * mat3[0][0] + vec3[1] * mat3[1][0] + vec3[2] * mat3[2][0]
y = vec3[0] * mat3[0][1] + vec3[1] * mat3[1][1] + vec3[2] * mat3[2][1]
z = vec3[0] * mat3[0][2] + vec3[1] * mat3[1][2] + vec3[2] * mat3[2][2]
因此,要获得直线A的旋转向量:
rotatedP1_A = multVecMatrix(P1_A, R)
rotatedP2_A = multVecMatrix(P2_A, R)
工作示例:
p1_A = [5, 10, 3]
p2_A = [15, 13, 3]
R = [[ 0.8468851 , -0.29080408, -0.44521748],
[ 0.22027131, 0.95385981, -0.20403924],
[ 0.48401051, 0.07472916, 0.87186546]]
def multVecMatrix(vec3, mat3):
x = vec3[0] * mat3[0][0] + vec3[1] * mat3[1][0] + vec3[2] * mat3[2][0]
y = vec3[0] * mat3[0][1] + vec3[1] * mat3[1][1] + vec3[2] * mat3[2][1]
z = vec3[0] * mat3[0][2] + vec3[1] * mat3[1][2] + vec3[2] * mat3[2][2]
return [x, y, z]
rotatedP1_A = multVecMatrix(p1_A, R)
rotatedP2_A = multVecMatrix(p2_A, R)
print(rotatedP1_A, rotatedP2_A)
要使直线平行于
B
,不需要旋转矩阵
计算
B
行的方向向量,并将其添加到A
的中间,谢谢您的回答!我画出了你的解决方案,我觉得不对劲。我用相应的图表编辑了我的文章。结果坐标用虚线表示。图表显示了一条2d线,但您提供的矢量是3d的,所以这些线不应该是3d的吗?无论哪种方式,它都应该工作,因为不管怎样,x和y的旋转都是相同的,除非我在某处打错了。但我什么也看不见。你问题中的向量是单位向量吗?线是3d的,但我用2d图来检查。然而,向量不是单位向量,即向量(例如,vecA=p2_A-p1_A)被归一化以获得旋转矩阵。这可能是错误的吗?尝试使用已知的旋转矩阵,例如将向量旋转90度。这应该告诉我们问题是旋转矩阵还是其他什么。
p1_A = [5, 10, 3]
p2_A = [15, 13, 3]
R = [[ 0.8468851 , -0.29080408, -0.44521748],
[ 0.22027131, 0.95385981, -0.20403924],
[ 0.48401051, 0.07472916, 0.87186546]]
def multVecMatrix(vec3, mat3):
x = vec3[0] * mat3[0][0] + vec3[1] * mat3[1][0] + vec3[2] * mat3[2][0]
y = vec3[0] * mat3[0][1] + vec3[1] * mat3[1][1] + vec3[2] * mat3[2][1]
z = vec3[0] * mat3[0][2] + vec3[1] * mat3[1][2] + vec3[2] * mat3[2][2]
return [x, y, z]
rotatedP1_A = multVecMatrix(p1_A, R)
rotatedP2_A = multVecMatrix(p2_A, R)
print(rotatedP1_A, rotatedP2_A)