圆内均匀分布的点
在以前的日志里,我曾经记录了如何在一个单位圆里取随机数。使用了这样的公式:
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;
来看看效果吧:
此外选择不同的角,还可以得到不同的形状。