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
 
 
说明:
  1. 两个矩形 rec1 和 rec2 都以含有四个整数的列表的形式给出。
  2. 矩形中的所有坐标都处于 -10^9 和 10^9 之间。

题意:

  判断两个矩形是否有重叠,又因为矩形给出的方式是[1, 2, 3, 4], (1,2)是左下角的坐标,(3,4)是右上角的坐标。

  因此,矩形的4条边必定与坐标轴各自平行。

  可考虑以下几种可能。

  1. 两个矩形恰有一条边重叠,另外一侧相交
  2. 一个矩形的一个角在另一个矩形内部
  3. 一个矩形的两个角在另一个矩形内部
  4. 两个矩形的中间部分相交
  5. 一个矩形包裹着另一个矩形

解题策略:

  想到这里,可结合两种方法来判断。

  1. 判断一个矩形的4个角是否在另一个矩形内,若有任意一个角满足,可断定两个矩形有相交;
  2. 判断一个矩形的形心是否在另一个矩形内部,增加这个判定主要是针对上面的第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 }

 

  

 

转载于:https://www.cnblogs.com/shayue/articles/10182057.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值