如何制作三维球体簇?

2024-09-28 19:06:57 发布

您现在位置:Python中文网/ 问答频道 /正文

#我想生成三维球体簇,其中包含许多点。 我正在使用此代码,但无法生成

import math
N = 50
thetavec = np.linspace(0,pi,N)
phivec = np.linspace(0,2*pi,2*N)
[th, ph] = np.meshgrid(thetavec,phivec)
R = np.ones(th.shape)

x = R*numpy.sin(th)*numpy.cos(ph)
y = R*numpy.sin(th)*numpy.sin(ph)
z = R*numpy.cos(th)
ax = plt.axes(projection='3d')
ax.plot_surface(x, y, z, cmap='viridis', edgecolor='none')
ax.set_title('sphere')

我已经从matlab生成了这些球形簇,但现在我想从python生成:

image

在这段代码之后,我得到了球体上的点,但我希望这些点位于球体内部,如第1幅图所示,这意味着构建球形集群的点的数量

image 2 帮帮我


Tags: 代码importnumpynppisincosax
1条回答
网友
1楼 · 发布于 2024-09-28 19:06:57

问题1:您正在使用math.sinmath.cos,它们期望数字,但您正在给它们数组(thph)。使用numpy.sinnumpy.cos

问题2:我认为你误解了spherical coordinates的工作原理。在球坐标中,我们有Rthetaphi,其中R是点到原点的距离。 使用R = 1时,可以在半径为1的球体上获得点。要在球体内获取点,必须使用小于1的半径。例如,如果要在半径为1的球体内创建10个同心球体,请使用linspace定义一个rvec并将其添加到meshgrid中,如下所示:

N = 50
thetavec = np.linspace(0,pi,N)
phivec = np.linspace(0,2*pi,2*N)
rvec = np.linspace(0, 1, 10)
[th, ph, R] = np.meshgrid(thetavec,phivec, rvec)

ax = plt.axes(projection='3d')
ax.plot(x.flatten(), y.flatten(), z.flatten(), '.')

enter image description here

或者,如果不需要同心圆,而只需要球体内部的随机点,可以使用numpy.random.rand使用随机数。与numpy.ones不同,numpy.random.rand需要数组的形状作为单独的参数,而不是单个元组,因此我们使用*th.shape解压th.shape元组

N = 50
max_rad = 1
thetavec = np.linspace(0,pi,N)
phivec = np.linspace(0,2*pi,2*N)
[th, ph] = np.meshgrid(thetavec,phivec)
R = np.random.rand(*th.shape) * max_rad

x = R*np.sin(th)*np.cos(ph)
y = R*np.sin(th)*np.sin(ph)
z = R*np.cos(th)

ax = plt.axes(projection='3d')
ax.plot(x.flatten(), y.flatten(), z.flatten(), '*')

enter image description here

相关问题 更多 >