在球体内均匀分布的点

时间:2019-01-24 01:52:43

标签: math

我正在寻找一种算法来在一个球体内分布一堆点(可能在几百个到几百万个之间)。在这种情况下,球体的中心为(0,0,0)。

对于随机点,一种简单的方法是

repeat
    x:=random*diameter-radius;
    y:=random*diameter-radius;
    z:=random*diameter-radius;
until ((x*x+y*y+z*z)<(radius*radius));

但是我想使球体中的点均匀分布,而不会在两极聚集。

是否有任何好的技巧/算法/公式/代码段来实现这一目标?

2 个答案:

答案 0 :(得分:2)

您可以执行以下操作:

  • 将球体的中心放在无限量均匀分布的点(例如四面体或立方晶格)内的任意位置。

  • 按距离中心的距离递增的顺序枚举点,直到获得正确的数字为止。

  • 重新缩放围绕中心的选定点,以使到最远点的距离等于所需的半径。

答案 1 :(得分:0)

如果您需要均匀分布的点-只需将它们放置在网格节点中即可。

半径为R的球的体积为

 V=4/3*Pi*R^3

因此要放置N个点,每个立方网格(也许您可能希望使用六角密堆积)都应具有体积

v=4/3*Pi*R^3/N

和边长

l = R * (4*Pi/(3*N))^1/3

然后在坐标(a*l, b*l, c*l)中生成点,其中a,b,c是受-R..+R限制的整数(具有适当的平方和)。


提议的方法是相当粗略的估计,也许来自N个需要的点中的某些点可能超出了范围。在这种情况下,必须减小像元大小或使用更精确的值-可以使用Gauss circle formula()的3D模拟来计算它。