用于创建球体坐标不起作用的Python程序

时间:2014-04-17 21:39:05

标签: python geometry coordinates

我正在尝试生成位于python中以(0,0)为中心的球体表面上的点。

# r - the radius of the sphere
def createSphere(r):
    lst = []
    for z in range(-r, r+1):

        r_ = r - abs(z)
        if r_ == 0:
            lst.append((0,0,r*np.sign(z)))
        else:
            for d in range(r_):
                lst.append((r_ * cos(d * (360/float(r_))), r_ * sin(d * 360/float(r_))), z)            )
    return lst

它将返回一个列表[(x1,y1,z1),...]。

结果如下: enter image description here

表面不光滑,看起来有点像有尖角的立方体。

有谁知道什么是错的?

由于

1 个答案:

答案 0 :(得分:4)

使用standard spherical to cartesian coordinate transformation

import math
pi = math.pi
sin = math.sin
cos = math.cos

def createSphere(r, N=10):
    lst = []
    thetas = [(2*pi*i)/N for i in range(N)]
    phis = [(pi*i)/N for i in range(N)]
    for theta in thetas:
        for phi in phis:
            x = r * sin(phi) * cos(theta)
            y = r * sin(phi) * sin(theta)
            z = r * cos(phi)
            lst.append((x, y, z))
    return lst

根据以下评论:如果您希望根据身高(或phi)更改分数,可以让thetas依赖phi

def createSphere(r, N=10):
    lst = []
    for phi in [(pi*i)/(N-1) for i in range(N)]:
        M = int(sin(phi)*(N-1))+1
        for theta in [(2*pi*i)/M for i in range(M)]:
            x = r * sin(phi) * cos(theta)
            y = r * sin(phi) * sin(theta)
            z = r * cos(phi)
            lst.append((x, y, z))
    return lst

以上,关键线是

M = int(sin(phi)*(N-1))+1

phi为0或pi时,M等于1,当phi等于pi/2时(等于“赤道”),它将等于N.请注意,这只是定义M的一种可能方式。您可以改为使用相同的边界值定义分段线性函数,而不是使用sin,例如...