如何解决用不重叠的正方形填充不规则形状
我有不规则的形状(想想地理边界),我需要用一组不同大小的正方形填充,没有重叠。应优先使用尽可能大的正方形。到目前为止,我的方法是以增量循环遍历图像的长度/宽度,并检查 (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() 分别绘制区域和填充区域的边。
解决方法
解决问题的一种方法是:
A) 创建一个由最大正方形组成的网格
B) 为网格找到一个好的位置,并且
C) 细分不完全位于形状内部的方块。
第一步是用最大正方形的网格覆盖形状。下面显示了一个示例。绿色方块完全在形状内,黄色方块部分在形状外,红色方块完全在形状外。
第二步是找到网格的最佳位置。将最小正方形定义为 1x1 单位,将最大正方形定义为 8x8 单位,网格有 64 种可能的布局。网格的最佳放置可使绿色方块的数量最大化。给定两个具有相同数量绿色方块的展示位置,选择更好展示位置的标准是
- 尽量减少黄色方块的数量,或
- 将绿色方块大致放在形状的中心
一旦确定了网格位置,绿色方块将保持原样,红色方块被丢弃,黄色方块被细分为四个较小的方块。以下是细分黄色方块的示例:
同样的规则适用:保留绿色,丢弃红色,细分黄色。细分正方形的过程递归地继续,直到达到最小尺寸的正方形。
最终结果如下:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。