【问题标题】:Generating points not within the range of each other?生成点不在彼此的范围内?
【发布时间】:2011-10-28 10:43:14
【问题描述】:

我正在尝试在固定区域内生成一组不属于彼此范围内的点。我的方法如下:

import collections
from random import uniform

X = 100.0
Y = 100.0
points = 10
radius = 10

def in_circle(c_x, c_y, radius, x, y):
    dist_squared = (c_x - x)**2 + (c_y - y)**2
    return dist_squared <= radius ** 2

current = collections.defaultdict(lambda: [])

threshold = 0    

for point in range(1, points+1):
    cX = uniform(1.0, X)
    cY = uniform(1.0, Y)

    for cur in current:
        while in_circle(current[cur][0], current[cur][1], 2*radius, cX, cY):
          cX = uniform(1.0, X)
          cY = uniform(1.0, X)

          threshold += 1
          if threshold >= 1e+05:
              print "Cannot satisfy constraints"
              sys.exit(1)

    threshold = 0

    current[point] = [cX, cY]
    print cX, cY

有没有一种好方法可以终止这个算法而不使其进入无限循环?我确实进行了阈值检查,但有更好的方法吗?

【问题讨论】:

    标签: python math graphics


    【解决方案1】:

    This article 关于泊松圆盘采样你可能会感兴趣。作者解释了一种选择彼此不太接近的点的策略,甚至还提供了包括 Python 在内的几种语言的示例代码。

    正如您所指出的,您概述的策略的问题是,如果您想选择很多点,或者您希望这些点相距很远,那么性能可能会变得很糟糕。我相信泊松盘方案具有更好的性能特征。

    【讨论】:

      【解决方案2】:

      您能否将区域细分为具有边 >= 点之间允许的最小距离的正方形,然后随机选择其中一些?

      例如,这些是您的点边界方块,从 0 到 j“编号”:

      0 1 2 3 4
      5 6 7 8 9
      a b c d e
      f g h i j
      

      然后您创建一个平方索引数组(在本例中为 0 到 j)randomly shuffle it,以 bc4j25e1670dfgh89ai3 结尾,并从其开头获取所需点数的索引,例如5:bc4j2。然后你把你的点放在所选正方形的中心(或者可能是左上角):

      0 1 * 3 *
      5 6 7 8 9
      a * * d e
      f g h i *
      

      【讨论】:

        【解决方案3】:

        这类问题称为circle packing。 mathworld 上的文章表明,已知单位正方形的最密集的堆积是已知的(这个问题可以通过缩放 x 和 y 转换为那个问题)。那篇文章中的图片展示了两个致密的球体堆积(正方形和六边形)。

        至于您是否可以插入一个新圆,voronoi diagram 有可能用于衡量最大剩余未采样区域。在某些情况下,评估未占用区域的其他近似方法(例如四叉树或空间散列)也可能足够

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-20
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多