Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 获取旋转直线的坐标_Python_Math_3d_Rotation_Linear Algebra - Fatal编程技术网

Python 获取旋转直线的坐标

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

我有两条线(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.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)