求三个矩形的相交矩形。
来源:互联网 发布:小米盒子语音软件 编辑:程序博客网 时间: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;}
- 求三个矩形的相交矩形。
- 求矩形相交面积
- Opencv求两个矩形是否相交,以及相交的比值
- Opencv求两个矩形是否相交,以及相交的比值
- 矩形相交的面积
- HDU 2056 Rectangles (求相交矩形的面积)
- 求平行坐标轴的2矩形相交面积
- 矩形相交
- 计算两个矩形是否相交以及相交的矩形
- 矩形相交区域的计算
- 矩形相交区域的计算
- 蓝桥杯---矩形运算(求相交部分)
- 如何求两个矩形相交面积
- 已知矩形的任意三个点,求第四个点
- 线段 矩形 矩形与矩形 相交
- 三个互相重叠的矩形
- 判断两个矩形相交以及求出相交的区域(生成的相交矩形)
- 判断任意多边形与矩形的相交(线段与矩形相交或线段与线段相交)
- STM32 C/C++ uCOSII 函数调用return 无法返回或者函数无法正常反回上一层函数的问题
- 互联网公司应该如何“敏捷”?
- java中string和int互相转化
- C++第三次实验——类和对象2
- FZU 1500 Monetary System(深搜+打表)
- 求三个矩形的相交矩形。
- N-Queens -- LeetCode
- 人脸识别特征提取(LBP)及其opencv实现
- 总结自己的Git常用命令
- 用Foxmail for Mac客户端登录网易163邮箱
- js-call和apply
- 在Linux下安装Python
- docker overlay network测试
- Android-ListView适配器BaseAdapter的使用和优化