我有两个x和y坐标数组:
x = np.round(np.arange(-4.67,-1.32,0.01),2)
y = np.round(np.arange(-3.32,3.32,0.01),2)
我正在使用这些数组在指定范围内随机绘制.65宽度/高度的正方形,这表示象限左侧的区域。这些值表示视觉度数与0之间的距离,x,y对是方形居中的距离。以下是我随机选取坐标的方法:
x1, y1 = random.choice(x), random.choice(y)
position1 = np.append(x1,y1)
问题在于有时候要绘制多个正方形,并且它们不能重叠。必须在定义区域内的正方形之间保持2度(中心到中心)的最小距离。
我考虑过创建一个包含该区域内所有可能坐标对的数组:
coords = np.array(list(itertools.product(x,y))
然后我可以从该数组中随机选择一对,生成另一个以该对为中心的方形区域中所有坐标点的数组,并从 coords 中删除它们。这将确保在该正方形的2度内不能绘制其他正方形。我想这可以用于多个方格。
这会产生一些大规模阵列。此代码在PsychoPy(实验构建器)中运行,因此将这些坐标分配给正方形非常重要。完成此任务的最有效方法是什么?也许有一个更明显的方法,我错过了?
答案 0 :(得分:1)
您可以使用网格地图进行快速检查。
当您选择一个点时,如果有任何其他点太近,则仅检查网格中的附近单元格,否则您接受该点并将该点添加到网格中:
grid = {}
points = []
def addPoint(x, y):
# returns True if the point was accepted
# compute the cell of the point
ix = int(math.floor(x / dist))
iy = int(math.floor(y / dist))
# check cell and all neighbors
for nhcell in ((ix-1, iy-1), (ix, iy-1), (ix+1, iy-1),
(ix-1, iy ), (ix, iy ), (ix+1, iy ),
(ix-1, iy+1), (ix, iy+1), (ix+1, iy+1)):
if nhcell in grid:
for xx, yy in grid[nhcell]:
if (x - xx)**2 + (y - yy)**2 < dist2:
# anoter existing point is too close
return False
# the new point is fine
points.add((x, y))
# we should also add it to the grid for future checks
if (ix, iy) in grid:
grid[(ix, iy)].append((x, y))
else:
grid[(ix, iy)] = [(x, y)]
return True