algorithm – 轴对齐矩形的交叉区域

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

>边缘平行于x和y轴

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

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

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

最佳答案 乍一看似乎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]

>给定n个矩形,首先使用矩形的x_left和x_right值创建2n个点.
>创建一个点列表,并在x_value上对其进行排序.这需要O(n log n)时间
>从左侧开始(索引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轴感兴趣.

点赞