轴对齐矩形的交叉区域

时间:2011-03-28 14:27:12

标签: algorithm computational-geometry

  • 每个矩形由4个双打组成:(x0,y0,x1,y1)

  • 边缘与x轴和y轴平行

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

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

我明白我需要使用扫描线算法。我必须使用树形结构吗?使用扫描线算法解决此问题的最简单方法是什么?

1 个答案:

答案 0 :(得分:2)

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

这是一个O(n ^ 2 log ^ 2 n)算法。

数据结构:Point(p){x_value,isBegin,isEnd,y_low,y_high,rectid}

[对于每个点,我们有一个x_value,两个y_values,以及这个点来自的矩形的ID]

  1. 给定n个矩形,首先使用矩形的x_left和x_right值创建2n个点。

  2. 创建一个点列表,并在x_value上对其进行排序。这需要O(n log n)时间

  3. 从左侧开始(索引0),在看到开始时使用地图放置,并在看到终点时删除。

  4. 换句话说:

    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轴感兴趣。