Algorithm 求覆盖一组无重叠矩形的最小矩形的算法

Algorithm 求覆盖一组无重叠矩形的最小矩形的算法,algorithm,language-agnostic,geometry,rectangles,Algorithm,Language Agnostic,Geometry,Rectangles,我有一组矩形,我想“缩小”这个集合,这样我就有了最少的矩形来描述与原始集合相同的区域。如果可能的话,我希望它也很快,但我更关心的是得到尽可能少的矩形数量。我现在有一种方法,大部分时间都有效 目前,我从最左上角的矩形开始,看看是否可以在保持矩形的同时,将其左右展开。我这样做,直到它不能再展开,删除并分割所有相交的矩形,然后将展开的矩形添加回列表中。然后我用下一个最左上角的矩形再次开始这个过程,依此类推。但在某些情况下,它不起作用。例如: 对于这组三个矩形,正确的解决方案将以两个矩形结束,如下所示

我有一组矩形,我想“缩小”这个集合,这样我就有了最少的矩形来描述与原始集合相同的区域。如果可能的话,我希望它也很快,但我更关心的是得到尽可能少的矩形数量。我现在有一种方法,大部分时间都有效

目前,我从最左上角的矩形开始,看看是否可以在保持矩形的同时,将其左右展开。我这样做,直到它不能再展开,删除并分割所有相交的矩形,然后将展开的矩形添加回列表中。然后我用下一个最左上角的矩形再次开始这个过程,依此类推。但在某些情况下,它不起作用。例如:

对于这组三个矩形,正确的解决方案将以两个矩形结束,如下所示:

但是,在本例中,我的算法首先处理蓝色矩形。这将向下展开并拆分黄色矩形(正确)。但是,当处理黄色矩形的其余部分时,它不是向下展开,而是首先向右展开,然后取回先前拆分的部分。然后处理最后一个矩形,它不能向右或向下展开,因此原始矩形集是左侧的。我可以调整算法,先向下展开,然后向右展开。这将解决这个问题,但在一个被翻转的类似场景中也会导致同样的问题


编辑:只是澄清一下,原始矩形集不重叠,也不必连接。如果矩形的子集是连通的,那么完全覆盖它们的多边形可能有洞。

尽管你的问题有标题,但我认为你实际上是在寻找对直线多边形矩形的最小剖分。(Jason的链接是关于矩形的最小覆盖,这是一个完全不同的问题。)

在他2010年的调查文章的第3节中讨论了这个问题,他在以下内容中给出了一个很好的总结:

其思想是找到具有两个凹面顶点作为端点的不相交轴平行对角线的最大数目,沿着这些对角线拆分,然后为每个剩余凹面顶点形成一个拆分。求不相交轴平行对角线的最大数目,形成对角线的相交图;该图是二部图,因此它的最大独立集可以通过图匹配技术在多项式时间内找到

下面是我对这个令人钦佩的简洁描述的润色,使用Eppstein文章中的图2。假设我们有一个直线多边形,可能有洞

将多边形剖分为矩形时,每个凹顶点必须至少与剖分的一条边相交。所以我们得到了最小的剖分,如果尽可能多的这些边有双重作用,也就是说,它们连接两个凹顶点

让我们在完全包含在多边形中的两个凹顶点之间绘制轴平行对角线。(“轴平行”在这里表示“水平或垂直”,a是连接两个非相邻顶点的线。)我们希望在解剖中尽可能多地使用这些线,只要它们不相交

(如果没有轴平行的对角线,解剖很简单,只需从每个凹面顶点切割。或者如果轴平行的对角线之间没有交点,则我们使用它们,再加上从每个剩余凹面顶点切割。否则,请继续阅读。)

一组线段的顶点对于每条线段都有一个节点,如果线段相交,则边将连接两个节点。以下是轴平行对角线的交点图:

一部分是垂直对角线,另一部分是水平对角线。现在,我们想要选择尽可能多的对角线,只要它们不相交。这对应于在相交图中查找

在一般图中寻找最大独立集是一个NP难问题,但在二部图的特殊情况下,它等价于寻找最大匹配的问题,该问题可以在多项式时间内解决,例如通过。一个给定的图可以有几个最大匹配,但其中任何一个都可以,因为它们的大小都相同。在本例中,所有最大匹配都有三对顶点,例如{(2,4)、(6,3)、(7,8)}:

(此图中的其他最大匹配包括{(1,3)、(2,5)、(7,8)};{(2,4)、(3,6)、(5,7)};和{(1,3)、(2,4)、(7,8)}。)

要从最大匹配获得对应的,请应用。在上面显示的匹配中,左边的集合是L={1,2,6,7},右边的集合是R={3,4,5,8},L中不匹配的顶点集合是U={1}。只有一条交替路径从U开始,即1–3–6,因此交替路径中的顶点集为Z={1,3,6},因此最小顶点覆盖率为K=(L\Z)∪ (R)∩Z)={2,3,7},下面显示为红色,最大独立集显示为绿色:

将此转换回解剖问题,这意味着我们可以在解剖中使用五轴平行对角线:

最后,从每个剩余凹面顶点进行切割以完成解剖:


感谢这本真正帮助了我的出版物

根据这两件事:

我真的很惊讶。 我是个糟糕的程序员

我成功地遵循了这些步骤,用许多正交法进行了测试,现在 我得到了一套混乱的长方形

好的,但现在我真的很难用它来计算矩形列表

中庸的说教或课程

谢谢,这是事先准备好的

Jean Yves

今天我找到了这个问题的O(N^5)解决方案,我将与大家分享
4 9
010000010
111010111
101111101
000101000