是否有一种有效的算法来生成平面中一般位置的随机点?

时间:2011-08-04 19:07:12

标签: algorithm random geometry computational-geometry

我需要在平面的一般位置生成 n 随机点,即没有三个点可以位于同一条线上。点的坐标应为整数,并且位于固定的平方m x m内。什么是解决这个问题的最佳算法?

更新:方形与轴对齐。

7 个答案:

答案 0 :(得分:4)

由于它们是正方形内的整数,因此将它们视为位图中的点。当您在第一个点之后添加一个点时,使用Bresenham的算法绘制通过新点和旧点之一的每条线上的所有像素。当你需要添加一个新点时,获取一个随机位置并检查它是否清晰;否则,再试一次。由于每对像素给出一条新线,因此排除了多达m-2个其他像素,随着点数的增加,您将在找到一个好的像素之前拒绝几个随机选择。我建议的方法的优点是,只有当你有一个好的选择时,你只需支付通过所有线路的成本,而拒绝一个不好的线路是一个非常快速的测试。

(如果你想使用不同的线条定义,只需用适当的算法替换Bresenham)

答案 1 :(得分:2)

在添加它时无法看到检查每个点的任何方法,或者通过(a)运行它可能在的所有可能的线,或者(b)消除冲突的点,以减少可能的下一点的位置。在这两者中,(b)似乎可以给你更好的表现。

答案 2 :(得分:2)

与@ LaC的答案类似。如果内存不是问题,你可以这样做:

Add all points on the plane to a list (L).
Shuffle the list.
For each point (P) in the list,
   For each point (Q) previously picked,
     Remove every point from L which are linear to P-Q.
   Add P to the picked list.

你可以继续外循环,直到你有足够的分数,或者用完它们。

答案 3 :(得分:1)

这可能会起作用(虽然可能会受到随机的限制)。找到你可以在广场内绘制的最大圆圈(这看起来非常可行)。选择圆圈上的任意n点,没有三个将是共线的:-)。

这在代码中应该是一个足够简单的任务。假设圆圈以原点为中心(因此某些形式为x ^ 2 + y ^ 2 = r ^ 2)。假设r是固定的并且x是随机生成的,您可以求解找到y坐标。这为每个x的圆圈提供了两个截面完全相反的点。希望这会有所帮助。

编辑:哦,整数点,只是注意到了。这真遗憾。我会继续保持这个解决方案 - 因为我喜欢这个想法

答案 4 :(得分:0)

@ LaC和@ MizardX的解决方案都非常有趣,但您可以将它们结合起来以获得更好的解决方案。

@ LaC的解决方案的问题在于您拒绝随机选择。你已经生成的点越多,生成新点就越难。如果只剩下一个可用位置,则您有可能随机选择它(1 /(n * m))。

在@ MizardX的解决方案中,你永远不会被拒绝选择,但是如果你直接实现“从L中删除与P-Q线性相关的每个点”。步骤你会变得更复杂(O(n ^ 5))。

相反,最好使用位图来查找要删除L中的哪些点。位图将包含一个值,该值指示点是否可以自由使用,它在L列表中的位置是什么,或者是指示该点已被划掉的值。通过这种方式,您可以得到O(n ^ 4)的最坏情况复杂度,这可能是最佳的。

编辑:

我刚刚发现了这个问题:Generate Non-Degenerate Point Set in 2D - C++ 它与这个非常相似。使用这个答案的解决方案Generate Non-Degenerate Point Set in 2D - C++会很好。稍微修改它以使用基数或桶排序并将所有n ^ 2个可能的点添加到P集最初并对其进行混淆,也可以使用更简单的代码获得O(n ^ 4)的最坏情况复杂度。此外,如果空间是一个问题,并且@ LaC的解决方案由于空间要求而不可行,那么这个算法将适用于没有修改并且提供相当复杂的。

答案 5 :(得分:0)

这篇论文可以解决你的问题:

“一般情况下的点位置 类似的模式“

BERNARDO M. ABREGO和SILVIA ​​FERNANDEZ-MERCHANT

答案 6 :(得分:-1)

嗯,你没有指定哪个平面..但只生成3个随机数并分配给x,y和z

如果'飞机'是任意的,那么每次都要设置z = o ......

检查x和y,看看它们是否在你的m边界,

比较第三个x,y对,看它是否与前两个在同一行......如果是,则重新生成随机值。