我有一个点[xmin,ymin,xmax,ymax]的列表,每个点由黑点显示
如何找到被另一个矩形覆盖的矩形以及被覆盖的多少。算法应该是有效的。一个解决方案是检查每个矩形与每个其他矩形,这将花费时间复杂度O(n ^ 2),但我需要有效的算法。
请注意,图像中有许多这样的矩形。应该检测到红色的一个用于移除,并且应该保留绿色。
输入是n个矩形 输出是覆盖的区域和它所覆盖的矩形id。 最好给出一些算法和解释。
答案 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完全相同。在视频游戏中,这组点经常变化(精灵遍布整个地方),因此算法必须快速。
如果您的任务可以解决这个问题,那么您应该能够找到许多不同语言的现有代码