在矩形中均匀但随机分布点的算法
Algorithm for distributing points evenly but randomly in a rectangle
我想在一个矩形中随机放置一些点。
生成随机x,y坐标不是一个好主意,因为很多时候点主要分布在同一区域而不是覆盖整个矩形。
我不需要非常快的算法或最佳掩护位置,只需要在简单游戏中 运行 生成几乎覆盖整个矩形的随机 (x, y) 的算法即可。
在我的特殊情况下,我试图生成一个简单的天空,所以我的想法是在天空矩形中放置近 40/50 颗星星。
有人能告诉我一些常用的算法吗?
只是一些可能会让你的封面出现的想法"more uniform"。这些方法不一定提供生成真正统一封面的有效方法,但它们可能足够好并且值得在您的案例中研究。
首先,您可以将原始矩形分成 4 个(或 10 个,或 100 个 - 只要性能允许)子矩形,并用随机点分别覆盖这些子矩形。通过这样做,您将确保没有子矩形会被覆盖。您可以为每个子矩形生成相同数量的点,但您也可以在一个子矩形与另一个子矩形之间改变点数。例如,对于每个子矩形,您可以首先生成一个随机数 num_points_in_subrectangle
(它可以来自某个区间 [lower, upper]
上的均匀随机分布),然后用这么多点随机填充子矩形。所以所有的子矩形都将包含随机数量的点,并且可能看起来更少 "programmatically generated".
您可以尝试的另一件事是在原始矩形内生成随机点,并为每个生成的点检查某个半径 R
内是否已经存在一个点。如果有这样的点,你拒绝候选人并生成新的候选人。同样,在这里您可以通过使 R
成为随机变量来改变从一个点到另一个点的半径。
最后,您可以结合几种方法。生成一些随机数 n
你想要的总点数。首先,将原始矩形划分为子矩形并以总共有 n / 3
个点的方式覆盖它们。然后通过选择原始矩形内的随机点来生成下一个 n / 3
个点,没有任何限制。在此之后,随机生成最后 n / 3
个点,并检查半径内的邻居。
有许多算法可以伪随机地填充二维平面。其中之一是 Poisson Disk Sampling,它随机放置样本,然后检查任意两个样本是否靠得太近。结果将如下所示:
您可以检查 some articles describing this algorithm. And even some implementations 可用。
问题是这个分布看起来一点也不像天空中的实际星星。虽然它提供了一个很好的开始工具 - 通过控制半径我们可以创建更好的图案。比如在this article they use Perlin Noise中控制Poisson Disk Sampling的半径:
您还需要用类似的方法调整星星的亮度。
我曾经使用过另一种方法——在笛卡尔系统中取真实的星位,例如HYG database by David Nash。我曾经把这个文件给我想约会的女孩看,说“看,这些是星星……在笛卡尔坐标系中”。
更新。现在已经五年多了,我们还住在一起
使用 X、Y 的统一绘图,如果绘制 40 个点,则所有点都在同一半部分的概率约为万亿分之一 (~0.0000000000009)。
我想在一个矩形中随机放置一些点。
生成随机x,y坐标不是一个好主意,因为很多时候点主要分布在同一区域而不是覆盖整个矩形。
我不需要非常快的算法或最佳掩护位置,只需要在简单游戏中 运行 生成几乎覆盖整个矩形的随机 (x, y) 的算法即可。
在我的特殊情况下,我试图生成一个简单的天空,所以我的想法是在天空矩形中放置近 40/50 颗星星。
有人能告诉我一些常用的算法吗?
只是一些可能会让你的封面出现的想法"more uniform"。这些方法不一定提供生成真正统一封面的有效方法,但它们可能足够好并且值得在您的案例中研究。
首先,您可以将原始矩形分成 4 个(或 10 个,或 100 个 - 只要性能允许)子矩形,并用随机点分别覆盖这些子矩形。通过这样做,您将确保没有子矩形会被覆盖。您可以为每个子矩形生成相同数量的点,但您也可以在一个子矩形与另一个子矩形之间改变点数。例如,对于每个子矩形,您可以首先生成一个随机数 num_points_in_subrectangle
(它可以来自某个区间 [lower, upper]
上的均匀随机分布),然后用这么多点随机填充子矩形。所以所有的子矩形都将包含随机数量的点,并且可能看起来更少 "programmatically generated".
您可以尝试的另一件事是在原始矩形内生成随机点,并为每个生成的点检查某个半径 R
内是否已经存在一个点。如果有这样的点,你拒绝候选人并生成新的候选人。同样,在这里您可以通过使 R
成为随机变量来改变从一个点到另一个点的半径。
最后,您可以结合几种方法。生成一些随机数 n
你想要的总点数。首先,将原始矩形划分为子矩形并以总共有 n / 3
个点的方式覆盖它们。然后通过选择原始矩形内的随机点来生成下一个 n / 3
个点,没有任何限制。在此之后,随机生成最后 n / 3
个点,并检查半径内的邻居。
有许多算法可以伪随机地填充二维平面。其中之一是 Poisson Disk Sampling,它随机放置样本,然后检查任意两个样本是否靠得太近。结果将如下所示:
您可以检查 some articles describing this algorithm. And even some implementations 可用。
问题是这个分布看起来一点也不像天空中的实际星星。虽然它提供了一个很好的开始工具 - 通过控制半径我们可以创建更好的图案。比如在this article they use Perlin Noise中控制Poisson Disk Sampling的半径:
您还需要用类似的方法调整星星的亮度。
我曾经使用过另一种方法——在笛卡尔系统中取真实的星位,例如HYG database by David Nash。我曾经把这个文件给我想约会的女孩看,说“看,这些是星星……在笛卡尔坐标系中”。
更新。现在已经五年多了,我们还住在一起
使用 X、Y 的统一绘图,如果绘制 40 个点,则所有点都在同一半部分的概率约为万亿分之一 (~0.0000000000009)。