我正在尝试生成位于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),...]。
结果如下:
表面不光滑,看起来有点像有尖角的立方体。
有谁知道什么是错的?
由于
答案 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
,例如...