若判断重叠情况,每一种情况需考虑两个维度-横坐标与纵坐标,表示繁杂;若判断不重叠情况,每种情况只需考虑单维度。
反向思考,判断不重叠的时候
首先把各矩形的p1,p2统一对应左上方和右下方的点
当r1在r2上方时,r1的下边在r2的上边之上,表示:r1.p2.y > r2.p1.y
当r1在r2下方时,r1的上边在r2的下边之下,表示:r1.p1.y < r2.p2.y
当r1在r2右边时,左边时,以此类推,通过横坐标表示
具体实现:
struct SPoint
{
int x, y;
};
struct SRect
{
SPoint p1, p2;
};
bool isOverlapped(SRect r1,SRect r2)
{
//将各矩形p1,p2排列统一
if (r1.p2.x < r1.p1.x) swap(r1.p2.x, r1.p1.x);
if (r1.p2.y > r1.p1.y) swap(r1.p2.y, r1.p1.y);
if (r2.p2.x < r2.p1.x) swap(r2.p2.x, r2.p1.x);
if (r2.p2.y > r2.p1.y) swap(r2.p2.y, r2.p1.y);
//反向思维,列举不重合情况
if (r1.p2.y > r2.p1.y || r1.p1.y < r2.p2.y || r1.p2.x<r2.p1.x || r1.p1.x>r2.p2.x)
return 0;
else
return 1;
}