我需要在一个HTML5画布上放置1到100个节点(实际上是25像素的点)。我需要让它们看起来是随机分布的,所以使用某种网格方式排列就不可行了。我还需要确保这些点不相互接触或重叠。同时,我也不希望有太多空白区域。请问这种算法叫什么?如果能提供一个开源项目的参考,那就更好了。
谢谢大家
Guido
谢谢大家
Guido
Bridson的泊松盘采样算法(原始论文 pdf)具有线性可扩展性,并且易于实现。该算法从一个初始点开始生长,看起来非常有趣(可以参考Mike Bostock的文章)。集合中的所有点都是活动或非活动的。所有点都被添加为活动状态。从活动集合中选择一个点,并在环形区域(也称为圆环),该区域从内圆半径r
到外圆半径2r
扩展,生成一些候选点。距离FinalSet中任何点小于r的候选样本将被拒绝。一旦找到一个未被拒绝的样本,它就会被添加到FinalSet中。如果所有的候选样本都被拒绝,则假定原始点已经有了太多的邻居点,无法再添加更多点,因此将其标记为非活动状态。当所有样本都处于非活动状态时,算法终止。
r/√2
的网格可以用来极大地提高检查候选点的速度。每个网格方格中只能有一个点,只需检查有限数量的相邻方格即可。do N times
{
start:
x = rand(0, width)
y = rand(0, height)
for each other point, p
if distance(p.x, p.y, x, y) < radius * 2
goto start
add_point(x, y);
}
这是O(n^2),但如果n只会到100,那就没问题了。
node.x = node.number / width + (Math.random() - 0.5) * SOME_SCALE;
node.y = node.number % height + (Math.random() - 0.5) * SOME_SCALE;