Phi*_*lip 2 random algorithm position game-development
我想在矩形中随机放置一些点。
生成随机的 x, y 坐标不是一个好主意,因为很多时候这些点主要分布在同一区域而不是覆盖整个矩形。
我不需要非常快的算法或最佳覆盖位置,只需要可以在简单游戏中运行的算法,该游戏生成几乎覆盖整个矩形的随机 (x, y)。
在我的特殊情况下,我试图生成一个简单的天空,所以我的想法是在天空矩形中放置近 40/50 颗星星。
有人可以指出我一些常见的算法来做到这一点吗?
小智 5
只是一些可能使您的封面显得“更统一”的想法。这些方法不一定提供有效的方法来生成真正统一的封面,但它们可能足够好并且值得在您的情况下考虑。
首先,您可以将原始矩形分成 4 个(或 10 个或 100 个 - 只要性能允许)子矩形,并用随机点分别覆盖这些子矩形。通过这样做,您将确保没有子矩形被覆盖。您可以为每个子矩形生成相同数量的点数,但也可以改变一个子矩形与另一个子矩形之间的点数。例如,对于每个子矩形,您可以首先生成一个随机数num_points_in_subrectangle(可以来自某个间隔上的均匀随机分布[lower, upper]),然后用这么多点随机填充子矩形。因此,所有子矩形都将包含随机数量的点,并且可能看起来不太“以编程方式生成”。
您可以尝试的另一件事是在原始矩形内生成随机点,并为每个生成的点检查某个半径内是否已存在一个点R。如果存在这样的点,您将拒绝该候选人并生成新的候选人。R同样,在这里您可以通过创建随机变量来改变从一点到另一点的半径。
最后,您可以结合多种方法。生成一些n您想要的随机点数。n / 3首先,将原始矩形划分为子矩形,并以总共有点的方式覆盖这些子矩形。然后n / 3通过选择原始矩形内的随机点来生成下一个点,没有任何限制。之后,n / 3随机生成最后的点,并检查半径内的邻居。
有许多算法可以伪随机地填充二维平面。其中之一是Poisson Disk Sampling,它随机放置样本,然后检查任何两个都不太接近。结果如下所示:

但问题是这种分布看起来与天空中的实际星星完全不同。虽然它提供了一个很好的开始工具 - 通过控制半径,我们可以创建更好的图案。例如在这篇文章中,他们使用柏林噪声来控制泊松盘采样的半径:

您还需要使用类似的方法调整星星的亮度。
我曾经使用过另一种方法 - 在笛卡尔系统中获取真实的恒星位置,例如David Nash 的 HYG 数据库。我曾经向我想约会的女孩展示了这个文件,说“看这些是星星......在笛卡尔坐标系中”。
更新。现在已经五年多了,我们还住在一起。