将球面坐标转换为笛卡尔坐标然后再转换回笛卡尔坐标并没有给出所需的输出

Converting spherical coordinates into Cartesian and then converting back into Cartesian isn't giving the desired output

我正在尝试编写两个函数,用于将笛卡尔坐标转换为球坐标,反之亦然。以下是我用于转换的方程式(也可以在 Wikipedia page 上找到):

这是我的 spherical_to_cartesian 函数:

def spherical_to_cartesian(theta, phi):
    x = math.cos(phi) * math.sin(theta)
    y = math.sin(phi) * math.sin(theta)
    z = math.cos(theta)
    return x, y, z

这是我的 cartesian_to_spherical 函数:

def cartesian_to_spherical(x, y, z):
    theta = math.atan2(math.sqrt(x ** 2 + y ** 2), z)
    phi = math.atan2(y, x) if x >= 0 else math.atan2(y, x) + math.pi
    return theta, phi

而且,这是驱动程序代码:

>>> t, p = 27.500, 7.500
>>> x, y, z = spherical_to_cartesian(t, p)
>>> print(f"Cartesian coordinates:\tx={x}\ty={y}\tz={z}")
Cartesian coordinates:  x=0.24238129061573832   y=0.6558871334524494    z=-0.7148869687796651
>>> theta, phi = cartesian_to_spherical(x, y, z)
>>> print(f"Spherical coordinates:\ttheta={theta}\tphi={phi}")
Spherical coordinates:  theta=2.367258771281654 phi=1.2168146928204135

我不明白为什么 theta[=36= 的值不同]phi 比我的初始值(输出值甚至不接近输入值)。我是不是在我的代码中犯了一个我看不到的错误?

您似乎以度为单位给出角度,而所有三角函数都需要弧度。 math.pi/180 乘以度数得到弧度,180/math.pi 乘以弧度得到度数。

结果正确,但您应该使用模 pi 运算检查它们的值。

math 包中的三角函数需要以弧度为单位的输入角度。这意味着您的角度大于 2*pi 并且等于通过添加或减去 2*pi 获得的任何其他值(这也代表以弧度表示的完整旋转)。

特别是你有:

>>> 27.5 % (2*math.pi)
2.367258771281655

>>> 7.500 % (2*math.pi)
1.2168146928204138