求三个矩形的相交矩形。

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

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值