Python程序旋转一条线不起作用

时间:2014-04-16 00:35:47

标签: python math vector 3d trigonometry

我试图弄清楚箭头arrowheads的方向向量。基本上我给了一个标准化的方向向量(u,v,w),我需要它的两个箭头的标准化方向向量,它们成15度角。

我的计划是先从一个简单的规范化向量(0,0,1)开始。箭头的方向向量为(-sin(15), 0, -cos(15))(sin(15), 0, -cos(15)),然后旋转(0,0,1),使其与给定的(u,v,w)平行。我这样做是通过在其x轴上投影(u,v,w),并使其相对于(0,0,1)的角度,然后在y轴上投影,并获得相对于(0,0,1)的角度,然后我使用3d旋转矩阵来使用那些找到的角度来旋转箭头方向矢量。

我在下面有这个代码,但它无法正常工作。有谁看到什么错了?

由于

        ra = 15
        ca = math.cos(ra)
        sa = math.sin(ra)

        px = (0,v,w)
        if u!=1:
            px = [i/float(math.sqrt(v**2 + w**2)) for i in px]

        py = (u,0,w)
        if v!=1:
            py = [i/float(math.sqrt(u**2 + w**2)) for i in py]

        pxangle = math.acos(px[2])
        pyangle = math.acos(py[2])

        cpx = math.cos(pxangle)
        spx = math.sin(pxangle)
        cpy = math.cos(pyangle)
        spy = math.sin(pyangle)

        def rotatefunction(ah):
            xr = (ah[0], -spx*ah[2], cpx*ah[2])
            return (cpy*xr[0]+spy*xr[2], xr[1], -spy*xr[0]+cpy*xr[2]) 

        lah = rotatefunction((-sa, 0, -ca))
        rah = rotatefunction((sa, 0, -ca))

1 个答案:

答案 0 :(得分:0)

首先,你需要在传递到math.cos,math.sin等之前将度数转换为弧度(=度*(pi / 180))。

假设箭头的归一化方向向量由

给出

enter image description here

平行于z轴的单位矢量由

给出

enter image description here

垂直于两个单位矢量的标准正交矢量由叉积式给出

enter image description here

并且两个向量之间的角度由标量积

给出

enter image description here

基本上,旋转是关于这个u(uhat)轴的角度θ。

给出了相应的rotation matrix

enter image description here

所以这是你需要将箭头矢量乘以的矩阵。