生成具有定义的最小和最大距离的随机点

时间:2012-01-19 17:47:57

标签: algorithm

我需要算法思路来在2D空间中生成点,并在点之间定义最小和最大可能距离。

Bassicaly,我想找到一种在填充点的2D空间中插入一个点的好方法,使点具有随机位置,但也比MINIMUM_DISTANCE_NUM多,并且距离最近点小于MAXIMUM_DISTANCE_NUM。 / p>

我需要它用于游戏,所以它应该很快,而不是取决于随机概率。

4 个答案:

答案 0 :(得分:4)

将点集存储在Kd tree中。随机生成一个新点,然后检查可以在Kd树中快速查找的最近邻点。如果该点被接受(即MIN_DIST< nearest neighbor< MAX_DIST),则将其添加到树中。

我应该注意,这将在点不太紧密的条件下工作得最好,即MIN * N <&lt; L其中N是点数,L是你放入它的盒子的尺寸。如果不是这样,那么大多数新点将被拒绝。但是考虑一下,在这个限制中,你将弹珠打包成一个盒子,并且在一定密度以上的布置不能非常“随机”。

答案 1 :(得分:2)

当m为宽度且n为此网格的高度时,您可以使用点的二维规则网格(P0,P1,P2,P3,...,P(m * n))

每个点都与1)布尔说这个网格点是否被使用以及2)从该网格位置“移位”以避免过多的规律性相关联。 (或者你可以在你的网格中加上点+移位坐标)

然后当你需要一个新点时,只需选择未使用的网格的随机点,将此点说成“已使用”并使用游戏中的Point + shift。

根据您的2D空间的n,m,宽度/高度以及您将要使用的点数,这可能会很好。

答案 2 :(得分:1)

你在谈论多少分?如果您有点数的上限,则可以生成(预先计算)点数组并将它们存储在数组中。获取该数组并将它们存储在一个文件中。

你将在地图加载之前完成所有硬计算处理(这样你就可以使用任何随机点生成算法),然后你就可以很快地获得积分。

这样你就可以生成大量不同的地图,然后随机选择其中一张地图来生成你的点。

仅当您有上限并且可以在游戏加载前预先计算点数

时,此功能才有效

答案 3 :(得分:0)

对此的一个很好的选择是使用Poisson-Disc采样。该算法高效(O(n)),并且“产生紧密堆积的点,但彼此之间的距离不超过指定的最小距离,从而产生更自然的图案”。

https://www.jasondavies.com/poisson-disc/

相关问题