反向矩形装箱

5
我有一个由方块组成的相连形状,例如拿一张方格纸,在现有线条上画一条线,使其结束于起点并且不交叉。
现在的目标是找到一种算法(非暴力),用尽可能少的不重叠矩形填充这个形状。
我正在寻找最优解。从图片中可以看出,贪心算法(选择最大的矩形)不起作用。
我的场景是顶点约简,但我确信还有其他用例。
注意:这个问题似乎很基础,但我无法在其他地方找到解决方案。此外,这个问题是否是NP-hard?
编辑:我刚意识到,在我的场景中,用尽可能少的不重叠三角形填充形状会得到更好的结果。

不知道这是否是最优解,但直觉告诉我你可以扫描水平维度并计算在水平方向上构建的矩形数量,然后对垂直维度执行相同的操作,并取两者中的最小值。 - irrelephant
这听起来像是重新绘制部分遮挡窗口的类似问题,也许你可以在旧的窗口管理器中找到一个最优算法,该算法仅使用矩形剪切而不是任意掩码,例如st-80。 - aka.nice
搜索“装箱算法”。 - SpagnumMoss
无关大雅:我不明白。你能再详细解释一下吗? aka.nice:有趣的想法。你有什么窗口管理器可以推荐吗? TonyHartley:似乎是个不同的问题。 - aZen
装箱问题(bin packing)使用边缘启发式算法来寻找最佳匹配,我认为您的问题的最佳解决方案在于边缘模式分析。我建议尝试一种分治类型的方法,该方法使用边缘分析和分辨率划分(例如从8x8、4x4、2x2开始)。 - SpagnumMoss
2个回答

2
自从我提出这个问题以来,我花了很多时间研究它。对于第一个问题(用矩形最优填充形状),我已经在这里写下了解决方案,标题是“最优贪心网格化”: http://blackflux.wordpress.com/2014/03/01/meshing-in-voxel-engines-part-2/ 实际上,复杂度比没有孔的多边形进行最优三角剖分要更好(更快)。最慢的部分是Hopcroft-Karp算法。
链接的博客文章中也讨论了将形状视为多边形的问题。请注意,我还考虑了孔洞的情况。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接