为什么这段python代码在笛卡尔坐标和球坐标之间转换时会给出错误的答案?

qpgpyjmq  于 2022-12-28  发布在  Python
关注(0)|答案(1)|浏览(93)

因此我在python3.4中设置了两个函数Cartesian2SphericalSpherical2Cartesian,以帮助我在笛卡尔坐标系和球坐标系之间转换一个点,这是需要大量坐标转换的应用程序的一部分。下面是函数的代码。我使用this Wikipedia article作为转换的源代码。

def Cartesian2Spherical(p):
    # p = (x,y,z)
    # theta  in (0,pi) and phi in (0,2pi)
    x,y,z = p
    r = np.sqrt(x*x+y*y+z*z)
    theta = arctan2(y,x)  # Inclination
    phi = arccos(z/r)  # Azimuth
    q = np.array([r,theta,phi])
    return q

def Spherical2Cartesian(q):
    # q = (r,theta,phi)
    # theta  in (0,pi) and phi in (0,2pi)
    r,theta,phi = q
    SinTheta = sin(theta)
    CosTheta = cos(theta)
    SinPhi = sin(phi)
    CosPhi = cos(phi)
    rSinTheta = r*SinTheta
    x = rSinTheta*CosPhi
    y = rSinTheta*SinPhi
    z = r*CosTheta
    p  = np.array([x,y,z])
    return p

正如你所看到的,它们非常简单。尽管代码如此简单,但是,在几次测试运行中,我仍然从它们那里得到了奇怪的结果。最终,当我决定对这些函数做一个简单的测试时,我的bug搜索停止了。我让python打印某个点p,后面跟着Spherical2Cartesian(Cartesian2Spherical(p)),结果如下:

[1.11022302e-16 1.47224319e+00 2.22044605e-16]
  [9.01488953e-17 1.47224319e+00 9.01488953e-17]

首先,我很高兴找到了这个错误,但是现在我很困惑,因为我不知道在这么简单的一段代码中可能有什么错误。2有人能好心地给我解释一下吗?

ggazkfy8

ggazkfy81#

看起来你翻转了θ和φ的变换。试试这个。

def Cartesian2Spherical(p):
    # p = (x,y,z)
    # theta  in (0,pi) and phi in (0,2pi)
    x,y,z = p
    r = np.sqrt(x*x+y*y+z*z)
    phi = np.arctan2(y,x)  # Inclination
    theta = np.arccos(z/r)  # Azimuth
    q = np.array([r,theta,phi])
    return q

def Spherical2Cartesian(q):
    # q = (r,theta,phi)
    # theta  in (0,pi) and phi in (0,2pi)
    r,theta,phi = q
    SinTheta = np.sin(theta)
    CosTheta = np.cos(theta)
    SinPhi = np.sin(phi)
    CosPhi = np.cos(phi)
    rSinTheta = r*SinTheta
    x = rSinTheta*CosPhi
    y = rSinTheta*SinPhi
    z = r*CosTheta
    p  = np.array([x,y,z])
    return p

p = (1,1,1) 

print(Spherical2Cartesian(Cartesian2Spherical(p)))

输出:

[1. 1. 1.]

相关问题