随机均匀点分布算法

时间:2018-07-22 08:20:58

标签: algorithm random position game-development

我想在矩形中随机放置一些点。 生成随机的x,y坐标不是一个好主意,因为经常发生点主要分布在同一区域而不是覆盖整个矩形的情况。 我并不需要一个令人难以置信的快速算法或最佳掩体位置,只需一种可以在简单游戏中运行的算法即可生成几乎覆盖整个矩形的随机(x,y)。

在我的特殊情况下,我试图生成一个简单的天空,所以这个想法是在天空矩形中放置近40/50颗恒星。

有人可以给我指出一些常用的算法吗?

3 个答案:

答案 0 :(得分:4)

有些想法可能会使您的封面显得“更加统一”。这些方法不一定提供生成真正统一封面的有效方法,但它们可能足够好,值得您研究。

首先,您可以将原始矩形划分为4个(或10个或100个,如果性能允许,则为100个)子矩形,并用随机点分别覆盖这些子矩形。这样,您将确保没有发现任何子矩形。您可以为每个子矩形生成相同数量的点,但是也可以从一个子矩形到另一个子矩形改变点的数量。例如,对于每个子矩形,您可以首先生成一个随机数num_points_in_subrectangle(可以来自某个间隔[lower, upper]上的均匀随机分布),然后用这么多点随机填充子矩形。因此,所有子矩形都将包含随机数量的点,并且看起来看起来不太像“以编程方式生成”。

您可以尝试的另一种方法是在原始矩形内生成随机点,并针对每个生成的点检查在半径R内是否已存在一个点。如果有这种情况,则拒绝候选人并生成新的候选人。同样,在这里您可以通过将R设为随机变量来改变一个点到另一个点的半径。

最后,您可以组合几种方法。生成总共想要的点的随机数n。首先,将原始矩形划分为子矩形,并以总共n / 3个点的方式覆盖子矩形。然后,通过选择原始矩形内的任意点而没有任何限制,生成下一个n / 3点。之后,随机生成最后n / 3个点,并检查半径内的邻居。

答案 1 :(得分:2)

有很多算法可以伪随机地填充2d平面。其中之一是Poisson Disk Sampling,它会随机放置样本,然后检查是否有两个样本不太接近。结果将如下所示:
enter image description here

关于此算法,number中有articles,甚至还有some implementations

但这不是起点在天空上排列的方式。尽管它提供了一个很好的工具-通过控制半径,我们可以获得一些不错的图案。例如,在this中,文章Perlin Noise用于控制通过Poisson Disk Sampling生成的点的半径:
enter image description here

很可能您还需要使用另一个随机变量来调整星星的亮度。


我曾经用来在天空中生成恒星的另一种方法是获取笛卡尔系统中真实恒星位置的数据库,例如HYG database by David Nash。我什至把这个文件给我约会的那个女孩说“看这些都是笛卡尔坐标系中的星星”。

答案 2 :(得分:0)

使用X,Y的统一图形,如果您绘制40个点,则所有点在同一半中的概率约为一万亿分之一(〜0.0000000000009)。

相关问题