木匣子

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

键盘快捷键

全局

?
快捷键帮助
/或⌘K
搜索
gh
首页
ga
归档
gt
标签
gc
分类
gg
回到顶部
G
跳到底部
h
较新一篇 / 上一页
l
较旧一篇 / 下一页
Esc
关闭弹窗

文章列表首页、归档、标签、分类

j
选中下一篇
k
选中上一篇
o或Enter
打开选中的文章

阅读文章和其他页面

j
向下滚动
k
向上滚动
yy
复制本页链接
c
跳到留言