我有以下图片(面具),
我想填写像这样的圆形区域,
在这个特定的例子中,我使用X&中的步骤手动创建了圆圈。 Y方向,如果95%落在白色区域,则只保留一个圆圈。但是我想最大化地图的覆盖范围。我认为这可以通过随机生成圆的中心来实现,并旨在最大化覆盖范围。如果我可以进一步最大化使用区域
,我不介意区域重叠一点是否有任何建议可以解决这个问题,或者是否有任何算法可以解决这个问题?
答案 0 :(得分:1)
这被称为circle packing问题,而且非常困难。
如果您不关心确切的界限并希望最大限度地覆盖范围,则应使用hexagonal tiling,这样可以获得约90.69%的覆盖率。
你可以这样做:
import numpy as np
from scipy import misc
import matplotlib.pyplot as plt
image = misc.imread('xZoI6.png')
ys, xs, _ = image.shape
x, y = np.meshgrid(np.arange(xs), np.arange(ys), sparse=True)
radius = 20.0
for i in range(int(-0.5 * ys / radius), int(xs / radius)):
for j in range(int(ys / radius)):
x0 = 2 * radius * (i + 0.5 * j)
y0 = 2 * radius * np.sqrt(3)/2 * j
r = np.sqrt((x - x0) ** 2 + (y - y0) ** 2)
indicator = r < radius
if np.any(image[indicator, 0] != 0):
image[r < radius] = [255, 0, 0, 255]
plt.imshow(image)
给出:
答案 1 :(得分:0)
我会使用具有适当尺寸的hexagonal tiling并在每个六边形的中心画一个圆圈。