所有n个矩形的交叉区域

时间:2018-02-07 10:22:58

标签: c++ algorithm c++11 area

我不知道如何开始这个,最好为我提供一个算法来帮助。问题如下,对于n矩形,调用输入来定义每个矩形。 n的限制为1000,而坐标限制为10000

给出了4个数字,

x1, x2, y1, y2

这样矩形由

界定
x=x1, x=x2, y=y1, y=y2  

当我需要找到所有这些矩形之间的交叉区域时,问题就出现了。知道算法应该如何工作吗?

我的想法:我实现了一个循环,它创建了第一次限定相交正方形的坐标。然后,对于每个新循环,我检查下一个输入的坐标是否相交。

2 个答案:

答案 0 :(得分:2)

将交叉矩形设置为第一个矩形,然后找到与第二个矩形的交点并更新交点,然后对所有剩下的矩形重复。

在伪代码中:

std::vector<Rect> rects;
Rect intersection = rects[0];
for( int i = 1; i < rects.size(); ++i)
{
    intersection = getIntersection( intersection, rect[i] );
}

答案 1 :(得分:1)

您只需要找到4个项目:左侧位置和顶部位置的最大值,以及右侧位置和底部位置的最小值。 (假设X和Y的正轴指向右下,如CS中的情况那样)

所以最小的代码可能是:

int lv = -1, tv = -1, rv = 10001, bv = 10001;
int l, t, r, b;
for (int i = 0; i < N; i++) {
    // cin >> l >> t >> r >> b; Input
    lv = max(lv, l);
    tv = max(tv, t);
    rv = min(rv, r);
    bv = min(bv, b);
}

然后你知道lv <= rv && tv <= bv是否有这4个值指定的交叉点。如果lv > rv || tv > bv,则没有共同的交叉点。