快速隐藏相交的矩形

时间:2012-03-19 14:45:55

标签: algorithm graph-theory computational-geometry intersection

我正在研究一种有效的算法来“隐藏”在一组N矩形(轴对齐)中以2D布局的所有交叉矩形对。 所有矩形都具有相同的宽度和高度。

假设我在2D中布置的起始矩形集是 R={r_1,r_2,...,r_n} 其中r_i是所有矩形,r_i具有布尔属性visible

我想找到R的子集S,这样对于每个r_i,属于S r_j的{​​{1}}都不相交。

第一个简单的解决方案是强力 - 最大独立集方法。 首先,我迭代r_i,_r_j矩形(给定的矩形不与自身相交)并检查它们是否相交。同时我还将集合N(N-1)/2中的所有矩形作为图R的节点。该图中的边由交叉三角形对表示。

非交叉矩形的集合然后是图的一个最大独立集

我认为这不是最快的方法,尽管是正确的。我在一些讨论中读过,例如,如何通过x坐标预先排序矩形列表,可以加快交叉矩形对到G=(V,E)的计算速度(而不是强力O(nlog(n) )

现在我问,有人知道这个问题的更好的算法(用于计算一组矩形中的交叉对以及过滤那些矩形吗?)

将问题重新定位为SAT问题也很有意思,尽管这个想法刚出现在我的脑海中。问题在于找到O(n^2)属性的排列,使得没有可见的矩形与另一个相交。

3 个答案:

答案 0 :(得分:3)

是的,您应该按x排序矩形 由于矩形在同一个x轴上并且高度相同,因此在对它们进行排序后,您应该能够在线性时间内找到交点。您正在寻找的算法称为扫描线。

您将扫描线移动到所有矩形上(从刚刚排序的集合中的x坐标跳转),并查看哪些矩形在当前x位置相交。将所有x coord重叠矩形加载到数据结构中并检查它们是否相交(基于y坐标)。

答案 1 :(得分:2)

可能不只有一个子集S。例如,请考虑以下矩形布局:

     +-----+
     |     |
     |  A  |
+----|    +-----+
|    +----|     |
|  D  |   |  B  |
|     |--- +    |
+-----+    |----+
     |  C  |
     |     |
     +-----+

{A,C}{B,D}都是有效答案。所以,这个问题有些不明确。您在寻找最大基数子集吗?

答案 2 :(得分:1)

测试所有成对组合是一个好主意,但是O(n ^ 2)有助于找到加快它的方法。

将空间划分为粗网格,如棋盘格,每个单元格都有一个矩形列表。这意味着矩形的中心点位于单元格中。这种矩形到单元格的分配是O(n)。

细胞必须比矩形的大小舒适,可能是矩形的两倍,并且整个空间需要分成“几个”行和列 - 比如十几个,几百个,但是许多对于数量是有意义的矩形和它们居住的区域的大小。但是,至少有五行五列,否则你将无法获得更高的效率。

然后测试每个细胞内的所有成对组合。这将消除一堆重叠对。对于每个单元格,您还必须测试涉及八个相邻单元格的所有成对组合 - 共享一个边或角的单元格 - 因为矩形可以重叠多达四个单元格。当然,小心不要重对数。

执行时间被保存,因为你永远不会测试任何一个矩形在这里的方式,另一个在远方的区域结束。

这种技术很通用,可以应用于任何形状,类似于物理学家在模拟巨大星系(如星系中的恒星)时使用的技术。