Python 球体体积中点的规则分布

Python 球体体积中点的规则分布,python,numpy,multidimensional-array,computational-geometry,Python,Numpy,Multidimensional Array,Computational Geometry,我试图在一个球体的体积内,生成一个规则的n个点。我在球面上生成均匀规则的n个点时发现了类似的答案(),代码如下: import numpy as np n = 5000 r = 1 z = [] y = [] x = [] alpha = 4.0*np.pi*r*r/n d = np.sqrt(alpha) m_nu = int(np.round(np.pi/d)) d_nu = np.pi/m_nu d_phi = alpha/d_nu count = 0 for m in range

我试图在一个球体的体积内,生成一个规则的n个点。我在球面上生成均匀规则的n个点时发现了类似的答案(),代码如下:

import numpy as np 

n = 5000
r = 1
z = []
y = []
x = []
alpha = 4.0*np.pi*r*r/n 
d = np.sqrt(alpha) 
m_nu = int(np.round(np.pi/d))
d_nu = np.pi/m_nu
d_phi = alpha/d_nu
count = 0
for m in range (0,m_nu):
    nu = np.pi*(m+0.5)/m_nu
    m_phi = int(np.round(2*np.pi*np.sin(nu)/d_phi))
    for n in range (0,m_phi):
        phi = 2*np.pi*n/m_phi
        xp = r*np.sin(nu)*np.cos(phi)
        yp = r*np.sin(nu)*np.sin(phi)
        zp = r*np.cos(nu)
        x.append(xp)
        y.append(yp)
        z.append(zp)
        count = count +1
按预期工作:


如何修改此选项以在球体的体积中生成一组规则的n个点?

另一种方法可以做到这一点,产生体积均匀性:

import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np

dim_len = 30
spacing = 2 / dim_len
point_cloud = np.mgrid[-1:1:spacing, -1:1:spacing, -1:1:spacing].reshape(3, -1).T

point_radius = np.linalg.norm(point_cloud, axis=1)
sphere_radius = 0.5
in_points = point_radius < sphere_radius

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(point_cloud[in_points, 0], point_cloud[in_points, 1], point_cloud[in_points, 2], )
plt.show()
导入matplotlib.pyplot作为plt
从mpl_toolkits.mplot3d导入Axes3D
将numpy作为np导入
尺寸=30
间距=2/尺寸
point_cloud=np.mgrid[-1:1:间距,-1:1:间距,-1:1:间距]。重塑(3,-1).T
点半径=np.linalg.norm(点云,轴=1)
球体半径=0.5
in_点=点半径<球体半径
图=plt.图()
ax=图添加_子图(111,投影='3d')
散乱(点云[in_points,0],点云[in_points,1],点云[in_points,2],)
plt.show()
输出(matplotlib混合了视图,但它是一个均匀采样的球体(体积))


均匀采样,然后根据点的半径检查点是否在球体中

[请参阅此答案的编辑历史记录以获取NAIVE采样]


此方法的缺点是生成冗余点,然后丢弃这些冗余点。
它有矢量化的优点,这可能弥补了缺点。我没有检查


使用奇特的索引,可以生成与此方法相同的点,而不生成冗余点,但我怀疑它是否可以轻松(或根本无法)矢量化。

沿X均匀采样。对于X的每个值,从X²+Y²=1中绘制两个Y。在这两个Y之间均匀取样。然后对于每一(X,Y)对,从X²+Y²+Z²=1中画出两个Z。在这两个Z之间均匀采样。

您可以添加另一个循环,从0到1变化
r
,但需要多少步。你最终会得到同心球壳。我想,但是同心球壳应该相隔一定距离,这样球作为r的函数保持一致吗?好的,只有你才能决定一致对你来说意味着什么。每个壳都有相同数量的点,因此最内层壳中的点将更靠近。你可以通过调整
n
使其随着半径变小而变小来调整。我认为要正确地做到这一点,每个壳中的点数必须变化,以使总数为n。然而,我认为不可能精确地得到n,但足够接近它才是最重要的。平均47.6%的分数被拒绝,这几乎是图纸数量的两倍。但这必须与可能涉及昂贵的超越函数的更复杂技术相比较。