微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用不重叠的正方形填充不规则形状

如何解决用不重叠的正方形填充不规则形状

我有不规则的形状(想想地理边界),我需要用一组不同大小的正方形填充,没有重叠。应优先使用尽可能大的正方形。到目前为止,我的方法是以增量循环遍历图像的长度/宽度,并检查 (x,y) 处的正方形是否有效。如果是这样,请将正方形保存在那里并将该区域标记为无效。然后我对每个正方形大小重复这个过程。它做我想要的,但对于几乎很小的增量来说太慢了。如果我尝试在每个正方形维度上使用 else/if 一次性完成,则最小的正方形将占主导地位。我也不能保证正方形大小的最优性。

nim[mask] = .5
nim[~mask] = 0
cim = nim.copy()

inc = 500
dims = [4000,2000,1000,500]

regions = []
for d in dims:
    for x in range(0,nim.shape[0],inc):
        for y in range(0,nim.shape[1],inc):
            if (np.count_nonzero(cim[x:x+d,y:y+d])/(d*d) < .0001):
                nim = rect(nim,y,x,d,1)
                cim = blocc(cim,1)
                regions.append([x,d])
                
plt.imshow(nim)
plt.show()

其中 rect() 和 blocc() 分别绘制区域和填充区域的边。

Desired result

解决方法

解决问题的一种方法是:
A) 创建一个由最大正方形组成的网格
B) 为网格找到一个好的位置,并且
C) 细分不完全位于形状内部的方块。

第一步是用最大正方形的网格覆盖形状。下面显示了一个示例。绿色方块完全在形状内,黄色方块部分在形状外,红色方块完全在形状外。

enter image description here

第二步是找到网格的最佳位置。将最小正方形定义为 1x1 单位,将最大正方形定义为 8x8 单位,网格有 64 种可能的布局。网格的最佳放置可使绿色方块的数量最大化。给定两个具有相同数量绿色方块的展示位置,选择更好展示位置的标准是

  • 尽量减少黄色方块的数量,或
  • 将绿色方块大致放在形状的中心

一旦确定了网格位置,绿色方块将保持原样,红色方块被丢弃,黄色方块被细分为四个较小的方块。以下是细分黄色方块的示例:

enter image description here

同样的规则适用:保留绿色,丢弃红色,细分黄色。细分正方形的过程递归地继续,直到达到最小尺寸的正方形。

最终结果如下:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。