假设我有一个不同形状和颜色的矩形网格,我想减少(合理地接近最佳值就可以了,不需要最佳值)代表相同颜色布局的矩形数。
上图是一个非常简化的情况,矩形之间的空白仅用于可视化-它们实际上是紧密包装的。
可以帮助我做到这一点的方法或算法名称(对Google满意)是什么?
假设我有一个不同形状和颜色的矩形网格,我想减少(合理地接近最佳值就可以了,不需要最佳值)代表相同颜色布局的矩形数。
上图是一个非常简化的情况,矩形之间的空白仅用于可视化-它们实际上是紧密包装的。
可以帮助我做到这一点的方法或算法名称(对Google满意)是什么?
Answers:
首先,我们可以将源矩形转换为基础网格中的单元格,以使输入更均匀。(有效地光栅化问题)
这将使我们找到在直接使用源矩形时可能并不明显的优化,尤其是在涉及拆分多个源矩形以不同方式重组它们时。
接下来,我们可以使用深度优先搜索或洪水填充算法找到相同颜色的连通区域。我们可以孤立地考虑每个连接的区域(一个多米诺骨牌)-我们对其他区域所做的任何操作都不需要影响这个区域。
实际上,我们想找到一种将这种多米诺骨肉切成矩形的方法(不幸的是,我能找到的大多数文献都是关于相反的问题:将矩形切成多米诺骨肉!这使得寻找线索变得棘手...)
一种简单的方法是将相邻正方形的水平行组合成细长的矩形。然后,我们可以与上一行进行比较,并结合运行开始和结束是否匹配-在完成每个运行/行时,或者在考虑将每个单元添加到当前运行时。
我还不知道这种方法达到最佳效果的程度。当尚未考虑的行与迄今为止看到的行不同时,似乎会遇到一些麻烦:
检测运行/矩形何时被上/下运行精确地覆盖,然后将其拆分并合并将解决此特定情况,但我尚未探讨问题的普遍性。
我还研究了沿着多米诺骨牌的周边行走并在遇到凹角时将其横切的方法,但是这种方法对我来说似乎更容易出错。要获得最佳结果,似乎需要对连接两个凹角的切口进行优先排序,并且包含凹陷的形状需要特殊处理,因此行扫描方法似乎具有简单性优势。
我正在寻找的另一种方法是采用在第一行中找到的第一个运行并将其尽可能地向下延伸。然后在剩下的第一行中进行第一轮奔跑...虽然这在倒T形上被绊倒了,所以也不是最优的。
我觉得可能存在使用动态编程来找到最佳分割的方法,但是我还没有找到。