【问题标题】:Covering irregular region with circles用圆圈覆盖不规则区域
【发布时间】:2017-07-30 20:10:32
【问题描述】:

我有以下图片(蒙版),

我想用这样的圆形区域来填充,

在这个特定的示例中,我使用 X 和 Y 方向的步长手动创建了一个圆圈,并且只有当 95% 的圆圈落在白色区域时才保留一个圆圈。但是,我想最大化地图的覆盖范围。我认为这可以通过随机生成圆心来实现,并旨在最大化覆盖范围。如果我可以进一步最大化使用区域,我不介意这些区域是否重叠

对于我如何解决这个问题,或者是否有任何算法可以为我解决这个问题,有什么建议吗?

【问题讨论】:

  • 填充还是覆盖?

标签: python geometry


【解决方案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)

给出:

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2010-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多