给定一个矩形结构体:
struct Rect
{
int x;
int y;
int w;
int h
};
要求实现函数:
Rect IntersectRect(const Rect &rectA,const Rect &rectA,const Rect &rectA)
若三个矩形有相交矩形,则返回相交矩形,若没有,则设置返回矩形的x、y、w、h均为-1。
分析:
1.首先要做三个矩形有无相交矩形的判断,
2.若没有,直接返回x、y、w、h均为-1的rect对象。
3.若有相交矩形,返回相交矩形。
进一步分析:三个矩形的相交比较复杂,因此我们可以分解为求两个矩形的相交矩形,再用得到的相交矩形去与第三个矩形做相交。
首先写一个判断两个矩形相交的函数,只有三个矩形两两相交,才有公共矩形。
矩形相交的情况比较复杂,而不相交的情形比较简单,两个矩形r1、r2不相交,则有两种情况:
(1)r1在r2的左边(相反类同)则有r1.x+r1.w<r2.x 或者r2.x+r2.w < r1.x
(2)r1在r2的上边(相反类同)则有r1.y+r1.h<r2.y或者r2.y+r2.h<r1.y
即可以设置判断两个矩形是否相交的函数如下:
bool IsCross(const Rect &r1,const Rect &r2)
{
if(r1.x + r1.w < r2.x || r2.x + r2.w < r1.x || r1.y + r1.h < r2.y || r2.y + r2.h < r1. y)
return false;
else
return true;
}
然后需要写一个求两个矩形相交矩形的函数。
两个矩形r1、r2相交,分析空间位置关系,相交矩形的顶点坐标即宽高可以这样来求:
max_x = max(r1.x,r2.x);
max_y = max(r1.y,r2.y);
min_x = min(r1.x+r1.w,r2.x+r2.w);
min_y = min(r1.y+r1.h,r2.y+r2.h);
则最终的相交矩形r坐标如下:
r.x = max_x;
r.y = max_y;
r.w = min_x - max_x;
r.h = min_y - max_y;
求两个相交矩形的函数如下:
Rect CrossRect(const Rect &r1,const Rect &r2)
{
Rect r;
int max_x = max(r1.x,r2.x);
int max_y = max(r1.y,r2.y);
int min_x = min(r1.x+r1.w,r2.x+r2.w);
int min_y = min(r1.y+r1.h,r2.y+r2.h);
r.x = max_x;
r.y = max_y;
r.w = min_x - max_x;
r.h = min_y - max_y;
}
至此,主要函数设置完毕,完善最终要求的三个矩形相交函数即可
Rect IntersectRect(const Rect &rectA,const Rect &rectA,const Rect &rectA)
//先判断没有相交的情况
if(! ( IsCross(rectA,rectB) && IsCross(rectA,rectC) && IsCross(rectB,rectC) ) )
{
ans.x = -1;
ans.y = -1;
ans.w = -1;
ans.h = -1;
return ans;
}
else
//有相交的情况
{
ans = CrossRect(rectA,rectB);
return CrossRect(ans,rectC);
}
这里附上我在本地编译器的完整代码。
/*
求三个矩形的相交矩形
要求实现函数
Rect IntersectRect(const Rect &rectA,const Rect &rectA,const Rect &rectA)
*/
#include <iostream>
using namespace std;
//分别表示矩形左上角顶点的坐标,矩形的宽高。
struct Rect
{
int x;
int y;
int w;
int h;
};
bool IsCross(const Rect &r1,const Rect &r2)
{
if(r1.x + r1.w < r2.x || r2.x + r2.w < r1.x || r1.y + r1.h < r2.y || r2.y + r2.h < r1. y)
return false;
else
return true;
}
Rect CrossRect(const Rect &r1,const Rect &r2)
{
Rect r;
int max_x = max(r1.x,r2.x);
int max_y = max(r1.y,r2.y);
int min_x = min(r1.x+r1.w,r2.x+r2.w);
int min_y = min(r1.y+r1.h,r2.y+r2.h);
r.x = max_x;
r.y = max_y;
r.w = min_x - max_x;
r.h = min_y - max_y;
return r;
}
Rect IntersectRect(const Rect &rectA,const Rect &rectB,const Rect &rectC)
{
Rect ans;
//先判断没有相交的情况
if(! ( IsCross(rectA,rectB) && IsCross(rectA,rectC) && IsCross(rectB,rectC) ) )
{
ans.x = -1;
ans.y = -1;
ans.w = -1;
ans.h = -1;
return ans;
}
else
//有相交的情况
{
ans = CrossRect(rectA,rectB);
return CrossRect(ans,rectC);
}
}
int main()
{
Rect A = {0,0,2,2};
Rect B = {0,1,2,2};
Rect C = {0,1,1,2};
Rect res = IntersectRect(A,B,C);
cout << res.x << endl;
cout << res.y << endl;
cout << res.w << endl;
cout << res.h << endl;
int x;
cin >> x;
cout << "Hello world!" << endl;
return 0;
}
---------------------
作者:走在不归路上
来源:CSDN
原文:https://blog.csdn.net/u014221279/article/details/51130169