Python中的三维旋转数学

Python中的三维旋转数学,python,3d,coordinates,trigonometry,Python,3d,Coordinates,Trigonometry,我在写代码,让机器以给定向量的角度来定位刀具。我需要绕Y轴旋转3D矢量坐标,我已经算出了方程,但是当我使用它时代码就中断了。让我给你看看 class Vector: def __init__(self, i, j, k): self.i = i self.j = j self.k = k v0 = Vector(0.7844645405527362, 0.19611613513818404, 0.5883484054145521) def findB():

我在写代码,让机器以给定向量的角度来定位刀具。我需要绕Y轴旋转3D矢量坐标,我已经算出了方程,但是当我使用它时代码就中断了。让我给你看看

class Vector:
    def __init__(self, i, j, k):
    self.i = i
    self.j = j
    self.k = k

v0 = Vector(0.7844645405527362, 0.19611613513818404, 0.5883484054145521)

def findB():
    if v0.i != 0:
        angle = atan(v0.i/v0.k)
    else:
        angle = 0
    print(angle, degrees(angle))  --> 0.92729... 53.13010...

    v1 = Vector(v0.i, v0.j, v0.k)
# this formula rotates the vector about the j axis (comparable to y axis rotation)
    v1.i = v0.i * cos(angle) - v0.k * sin(angle)
    v1.k = v0.k * cos(angle) + v0.i * sin(angle)
    return angle, v1

machine.b, v1 = findB()

print(v1.i, v1.j, v1.k) --> 1.1102230246251565e-16 0.19611613513818404 0.9805806756909203
我已经在计算器上测试了这个公式,它正确地旋转坐标,我甚至硬编码了这些值:

v1.i = 0.784 * cos(0.927) - 0.588 * sin(0.927)
v1.k = 0.588 * cos(0.927) + 0.784 * sin(0.927)

硬编码的值产生正确的结果,但一旦我使用“角度”,v0.I和v0.k作为变量,它得到的v1.I就不正确。我应该是零(或者四舍五入接近零)。我在一台计算器上测试过同样的公式,结果很好。有人知道发生了什么吗?

它几乎是零,没有?你知道1.1102230246251565e-16是0.0000000000000001102230246251565,非常接近零?这是用科学记数法写的,可能会混淆。哦,天哪,我很抱歉,伙计们,我是多么无知。感谢您指出这一点。我将在
findB
中使用
atan2
,并对当前的0测试提出质疑,该测试看起来应该测试v0。kIndeed,我将把它更改为atan2。我只是需要先进行概念验证,碰巧使用了atan。谢谢你的建议。