Algorithm 轴对齐矩形的相交区域

Algorithm 轴对齐矩形的相交区域,algorithm,computational-geometry,Algorithm,Computational Geometry,每个矩形由如下4个双倍体组成:(x0,y0,x1,y1) 这些边与x轴和y轴平行 它们是随机放置的-它们可能在边缘接触、重叠或没有任何接触 我需要找到它们重叠形成的区域-画布中多个矩形“覆盖”的所有区域(例如,两个矩形的交点) 我知道我需要使用扫描线算法。我必须使用树形结构吗?对于这个问题,使用扫描线算法最简单的方法是什么?乍一看,O(n^2)算法应该很简单,因为我们可以检查所有成对点。但是,这会产生重复计数的问题,因为3个矩形中的所有点都会被计数3次!在意识到这一点之后,O(n^2)算法现在

每个矩形由如下4个双倍体组成:(x0,y0,x1,y1)

  • 这些边与x轴和y轴平行

  • 它们是随机放置的-它们可能在边缘接触、重叠或没有任何接触

  • 我需要找到它们重叠形成的区域-画布中多个矩形“覆盖”的所有区域(例如,两个矩形的交点)


    我知道我需要使用扫描线算法。我必须使用树形结构吗?对于这个问题,使用扫描线算法最简单的方法是什么?

    乍一看,O(n^2)算法应该很简单,因为我们可以检查所有成对点。但是,这会产生重复计数的问题,因为3个矩形中的所有点都会被计数3次!在意识到这一点之后,O(n^2)算法现在在我看来并不坏。如果你能想出一个简单的O(n^2)算法,请发布

    下面是一个O(n^2 log^2 n)算法

    数据结构:点(p){x_值,isBegin,isEnd,y_低,y_高,rectid}

    [对于每个点,我们有一个x_值、两个y_值和该点所来自的矩形的ID]

  • 给定n个矩形,首先使用矩形的x_left和x_right值如上所述创建2n个点

  • 创建点列表,并根据x_值对其排序。这需要O(n logn)时间

  • 从左侧开始(索引0),在看到起点时使用贴图放置,在看到终点时使用贴图移除

  • 换言之:

    Map m = new HashMap();  // rectangles overlapping in x-axis
    for (Point p in the sorted list) {
        if (p.isBegin()) {
            m.put(p);  // m is keyed off of rectangle id
            if (s.size() >= 2) {
                checkOverlappingRectangles(m.values())
            }
        } else {
            m.remove(p);  // So, this takes O(log n) time
        }
    }
    

    接下来,我们需要一个函数,它获取一个矩形列表,知道所有矩形都有重叠的x轴,但可能在y轴上重叠,也可能不重叠。事实上,这与此算法相同,我们只使用横向数据结构,因为我们现在对y轴感兴趣。

    Josh,谢谢你的回答。你能解释一下什么是地图,如何使用地图吗。你用哪种语言写的代码?@mauricio我刚刚用了Java中内置的映射结构。TreeMap是另一个选项,我相信它是红黑树的实现,支持O(logn)插入、搜索和删除操作