836. 矩形重叠
题目描述:
矩形以列表 [x1, y1, x2, y2]
的形式表示,其中 (x1, y1)
为左下角的坐标,(x2, y2)
是右上角的坐标。
如果相交的面积为正,则称两矩形重叠。需要明确的是,只在角或边接触的两个矩形不构成重叠。
给出两个矩形,判断它们是否重叠并返回结果。
示例 1:
输入:rec1 = [0,0,2,2], rec2 = [1,1,3,3] 输出:true
示例 2:
输入:rec1 = [0,0,1,1], rec2 = [1,0,2,1] 输出:false
说明:
- 两个矩形
rec1
和rec2
都以含有四个整数的列表的形式给出。 - 矩形中的所有坐标都处于
-10^9
和10^9
之间。
题意:
判断两个矩形是否有重叠,又因为矩形给出的方式是[1, 2, 3, 4], (1,2)是左下角的坐标,(3,4)是右上角的坐标。
因此,矩形的4条边必定与坐标轴各自平行。
可考虑以下几种可能。
- 两个矩形恰有一条边重叠,另外一侧相交
- 一个矩形的一个角在另一个矩形内部
- 一个矩形的两个角在另一个矩形内部
- 两个矩形的中间部分相交
- 一个矩形包裹着另一个矩形
解题策略:
想到这里,可结合两种方法来判断。
- 判断一个矩形的4个角是否在另一个矩形内,若有任意一个角满足,可断定两个矩形有相交;
- 判断一个矩形的形心是否在另一个矩形内部,增加这个判定主要是针对上面的第4个可能,
即便一个矩阵的任何一个角不在另一个矩阵中,两者也能相交。
代码:
1 #include <iostream> 2 #include <vector> 3 using namespace std; 4 5 6 //如何判断两个矩形是否重叠,两个判断叠加 7 //1. 矩形1的形心在矩形2中或者矩形2的形心在矩形1中则两者重叠。 8 //2. 矩形1的四点是否在矩形2中,矩形2的四点是否在矩形1中 9 class Solution { 10 public: 11 bool isRectangleOverlap(vector<int>& rec1, vector<int>& rec2) { 12 bool first = isIn1(rec1, rec2); 13 bool second = isIn1(rec2, rec1); 14 bool third = isIn2(rec1, rec2); 15 bool fourth = isIn2(rec2, rec1); 16 return first || second || third || fourth; 17 } 18 19 bool isIn1(vector<int>& rec1, vector<int>& rec2) //判断rec2的形心是否在rec1中 20 { 21 int x1 = rec1[0]; 22 int x2 = rec1[2]; 23 int y1 = rec1[1]; 24 int y2 = rec1[3]; 25 26 //计算rec2的形心 27 double centroid_x = (rec2[0] + rec2[2]) / 2.0; 28 double centroid_y = (rec2[1] + rec2[3]) / 2.0; 29 if(centroid_x >= x1 && centroid_x <= x2 && centroid_y >= y1 && centroid_y <= y2) 30 return true; 31 return false; 32 } 33 34 bool isIn2(vector<int>& rec1, vector<int>& rec2) //判断rec2是否有点在rec1内部 35 { 36 int x1 = rec1[0]; 37 int x2 = rec1[2]; 38 int y1 = rec1[1]; 39 int y2 = rec1[3]; 40 if((rec2[0] < x2 && rec2[0] > x1) && (rec2[1] < y2 && rec2[1] > y1)) 41 return true; 42 if((rec2[0] < x2 && rec2[0] > x1) && (rec2[3] < y2 && rec2[3] > y1)) 43 return true; 44 if((rec2[2] < x2 && rec2[2] > x1) && (rec2[1] < y2 && rec2[1] > y1)) 45 return true; 46 if((rec2[2] < x2 && rec2[2] > x1) && (rec2[3] < y2 && rec2[3] > y1)) 47 return true; 48 return false; 49 } 50 }; 51 52 int main() 53 { 54 int a[] = {8,12,12,18}; 55 int b[] = {10,17,19,20}; 56 vector<int> vec1(a, a+4); 57 vector<int> vec2(b, b+4); 58 Solution s; 59 cout << s.isRectangleOverlap(vec1, vec2) << endl; 60 }