我正在寻找一种算法来在一个球体内分布一堆点(可能在几百个到几百万个之间)。在这种情况下,球体的中心为(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));
但是我想使球体中的点均匀分布,而不会在两极聚集。
是否有任何好的技巧/算法/公式/代码段来实现这一目标?
答案 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模拟来计算它。