用圆圈覆盖不规则区域

时间:2017-07-30 20:10:32

标签: python geometry

我有以下图片(面具),

enter image description here

我想填写像这样的圆形区域,

enter image description here

在这个特定的例子中,我使用X&中的步骤手动创建了圆圈。 Y方向,如果95%落在白色区域,则只保留一个圆圈。但是我想最大化地图的覆盖范围。我认为这可以通过随机生成圆的中心来实现,并旨在最大化覆盖范围。如果我可以进一步最大化使用区域

,我不介意区域重叠一点

是否有任何建议可以解决这个问题,或者是否有任何算法可以解决这个问题?

2 个答案:

答案 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)

给出:

enter image description here

答案 1 :(得分:0)

我会使用具有适当尺寸的hexagonal tiling并在每个六边形的中心画一个圆圈。