木匣子

Web/Game/Programming/Life etc.

圆内均匀分布的点

在以前的日志里,我曾经记录了如何在一个单位圆里取随机数。使用了这样的公式:

float rad = random(TWO_PI);
float dist = sqrt(random(1))*radius;
point(cos(rad)*dist, sin(rad)*dist);

用到了神奇的开平方。但是如果你有100个点,想要均匀的分布到一个圆里,有什么简单的办法呢?

在网上闲逛的时候,在 Marmakoide’s Blog 看到了一个很有创意的解法:Spreading points on a disc and on a sphere

采用螺旋的方式,每次递增一个步长,放下一个点。

这个方法的神奇之处在于如何选择这个步长。

显然越靠近圆心的地方,能放的点越少,所以可以把圆细分为一个个面积相同的圆环,落在每个圆环内的点的数量应该是相近的。由此我们可以用上面 在单位圆里取随机数 一样的方法取得放置点的半径dist_i = sqrt(i/N)来计算第i个点应该离圆心多远。

接来来还要考虑每个圆环上的点应该相隔多少角度,这里 Marmakoide 提到了一个神奇的数字:黄金角theta = PI*(3-sqrt(5));,则第i个点的角度就是float rad = i*theta;

来看看效果吧:

此外选择不同的角,还可以得到不同的形状。

Spreading points on a disc and on a sphere