Python 生成的点不在彼此的范围内?

Python 生成的点不在彼此的范围内?,python,math,graphics,Python,Math,Graphics,我试图生成一组点,这些点不在固定区域内彼此的范围内。我的方法如下: 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 *

我试图生成一组点,这些点不在固定区域内彼此的范围内。我的方法如下:

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
导入集合
从随机导入制服
X=100.0
Y=100.0
分数=10
半径=10
圆中的定义(c_x,c_y,半径,x,y):
距离平方=(c_x-x)**2+(c_y-y)**2
返回距离平方=1e+05:
打印“无法满足约束”
系统出口(1)
阈值=0
当前[点]=[cX,cY]
打印cX、cY

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

你能将区域细分为边>=点之间允许的最小距离的正方形,然后随机选取其中的几个吗

例如,这些是点边界正方形,从0到j“编号”:

0 1 2 3 4
5 6 7 8 9
a b c d e
f g h i j
然后,创建一个平方索引数组(本例中为0到j),以bc4j25e1670dfgh89ai3结尾,并从其开始获取所需的任意多个索引点,例如5:bc4j2。然后将点放置在所选正方形的中心(或左上角):

0 1 * 3 *
5 6 7 8 9
a * * d e
f g h i *
关于泊松圆盘采样,您可能会感兴趣。作者解释了一种选择彼此不太接近的点的策略,甚至提供了几种语言的示例代码,包括Python


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

这类问题称为。mathworld上的文章指出,已知单位正方形最密集的填充是已知的(这个问题可以通过缩放x和y转化为那个问题)。这篇文章中的图片展示了两种密集的球形填料(正方形和六角形)

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