求三个矩形的相交矩形。

来源:互联网 发布:小米盒子语音软件 编辑:程序博客网 时间:2024/05/17 04:30

金山WPS2016实习生招聘(武大宣讲会+现场笔试题)

2016年4月11日晚上7:00-9:00参加的笔试。

给定一个矩形结构体:

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;}

0 0
原创粉丝点击