如何找到覆盖另一个矩形的矩形区域

时间:2014-05-14 14:04:53

标签: python algorithm geometry

我有一个点[xmin,ymin,xmax,ymax]的列表,每个点由黑点显示

如何找到被另一个矩形覆盖的矩形以及被覆盖的多少。算法应该是有效的。一个解决方案是检查每个矩形与每个其他矩形,这将花费时间复杂度O(n ^ 2),但我需要有效的算法。 enter image description here

请注意,图像中有许多这样的矩形。应该检测到红色的一个用于移除,并且应该保留绿色。

输入是n个矩形 输出是覆盖的区域和它所覆盖的矩形id。 最好给出一些算法和解释。

2 个答案:

答案 0 :(得分:3)

假设矩形列表为L,并说明只有绿色列表的最终列表为G。矩形可以一个接一个地添加到G.在每次添加之前,将根据G中已有的列表进行检查。如果它与其中一个重叠,则比较它们的大小(区域)。如果它大于列表中的那个,则替换它,否则它不会添加到G

G永远不会有两个重叠的矩形(即算法不变)。这样,您只需检查最终列表中的候选者。

如果矩形具有随机重叠,这肯定比O(n ^ 2)好。但最坏的情况仍然是O(n ^ 2) - 当L中的任何输入矩形都没有重叠时。在这种情况下,每个重叠检查都是O(n)操作。

但可以优化重叠检查。通过维持基于X和Y的排序的点列表,可以对最接近矩形的xmin,xmax,ymin和ymax的点进行重叠检查。我认为这有点棘手,尤其是当新矩形仅部分重叠或者与多个矩形重叠时。但它可以做到。

在任何情况下,重叠检查都可以在某种程度上加速,它不必与G中的所有矩形相对。我无法对其进行量化,但我认为可以正确完成,可以在O(nlogn)中完成。

答案 1 :(得分:1)

这不是一个答案,只是一个提示:

您可能会发现Quadtree空间细分数据结构很有用。如果布局良好,那么可以显着减少碰撞检测次数。

这种结构被旧街机视频游戏机中的各种2D精灵引擎使用,并且还有其他图形应用。

您的问题与搜索效率2D sprite engine完全相同。在视频游戏中,这组点经常变化(精灵遍布整个地方),因此算法必须快速。

如果您的任务可以解决这个问题,那么您应该能够找到许多不同语言的现有代码