【发布时间】:2011-11-15 14:08:08
【问题描述】:
我正在尝试提出一种在给定区域(在我的情况下为正方形)中生成 X 个随机点的方法。造成这样一个问题的一件事是,每个点都必须与所有其他点相距至少 Y 个单位。
首先想到的是(在 c# 中)检查新点与所有现有点之间的距离:
while(points.Count < pointsToGenerate)
{
Point newPoint = NewPoint();
bool addPoint = true;
foreach(Point p in points)
{
if((p - newPoint).Length() < minDistance)
{
addPoint = false;
break;
}
}
if(addPoint)
{
points.Add(newPoint);
}
}
现在这肯定会起作用,但是如果没有找到有效点,这将成为一个永无止境的循环。那么在此处输入一个神奇的数字 Z 作为尝试次数的限制?
if(loopCount > 100)
{
break;
}
现在这有一些明显的问题。如果这些点是随机生成的,那么即使还有位置可以放置该点,loopCount 也可以超过 Z。它不仅可以,而且会发生!
我可以做的是为每次通过创建一个可用点列表,然后选择其中一个随机点。除了一件事外,这将完美无缺:性能。我的应用程序不需要超级性能,但面积是 1000^2。即使我将自己限制为整数,每次通过也要检查很多点!
所以,我能想出的可能还不够,因此我希望得到一些帮助。有没有更好的方法在区域 A 中生成点 Y 之间距离最小的 X 点?
谢谢!
编辑: 更好,我的意思是在性能与完美之间取得平衡的情况下通常更好。有点模糊,我知道。我还不确定生成这些点需要多少开销,所以我基本上追求比我自己的方法更优雅的方法。
~罗伯特
【问题讨论】:
-
如果不能以 Y 间距分布 X 点,您希望发生什么?那些只有一种排列方式的情况呢?您是在生成点列表还是一组点?
-
@Eric - 如果距离不为零,那么集合/列表的区别有什么关系?
-
计算几何方面的专家可能会使用 Voronoi 图为您提供一些巧妙的算法。我不是这样的专家,所以我将在此评论中喃喃自语。
-
我也会咕哝着使用circle packing 来“规范化”你的问题。您可以缩小圆圈,使它们以最小距离分开,并且在每个圆圈中最多创建一个随机点。不过,我还没有仔细考虑过这个……
-
@Mr.TAMER 一个非常好的建议!我将创建一组最佳放置的点,然后选择其中的一个随机子集,但如果使用了太多点,那将创建一种人工外观的模式。在处理大量点时,使用概率会创建更好(看起来更随机)的模式,但也会产生更多开销。我不确定我的申请是否需要您的方式,但我确实喜欢它! :)
标签: algorithm computational-geometry