0
点赞
收藏
分享

微信扫一扫

OpenCV4.9关于矩阵上的掩码操作

sullay 3小时前 阅读 1

题目链接:

0矩形总面积 - 蓝桥云课 (lanqiao.cn)

说明:

参考文章:矩形总面积计算器:计算两个矩形的总面积,包括重叠区域_矩形r1的左下角坐标为x1, yl 、宽度为w1、高度为h1, 矩形r2的左下角坐标为x2,y2、宽-CSDN博客

看似简单,实际如果一种一种列举情况写if-else还挺麻烦的。首先很容易看出的是,两矩形不相交的情况:

x[4]<=x[1]||x[3]>=x[2]||y[3]>=y[2]||y[4]<=y[1]

以及一者包含另一者的情况:x[3]>=x[1]&&x[4]<=x[2]&&y[3]>=y[1]&&y[4]<=y[2]、x[3]<=x[1]&&x[4]>=x[2]&&y[3]<=y[1]&&y[4]>=y[2]

但是两者相交的情况,如果要用列举出来,情况非常多,至少以下这么多种情况(黑色为R1,其他颜色为R2):

所以需要考虑找规律。

按照参考文章的思路,我们需要找到高效率确定重叠区域的方法,二维图形不好想象,首先从两条直线来考虑重叠区域:

由图可知,右边界是两条直线右边界的较小值,左边界是两条直线左边界的较大值,在两个矩形的重叠区域的x方向上也是满足的。如果没有重叠区域,那么找出的左边界将会大于右边界。

由这个方法也可以找到y方向上的上下边界,由此就可以计算出重叠区域的面积,但要判断一下区域是否存在(也就是判断边界差值是否大于0)。

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e9;
int ans = 0;
int x[5],y[5]; 

signed main() {

    cin.tie(0);
    cout.tie(0);
    
    for(int i=1;i<5;i++){
    	cin>>x[i]>>y[i];
	}
	int s1=(y[4]-y[3])*(x[4]-x[3]),s2=(y[2]-y[1])*(x[2]-x[1]);
    int l,r;
	l=min(x[2],x[4])-max(x[1],x[3]) ;
	r=min(y[2],y[4])-max(y[1],y[3]);
	if(l>0&&r>0){
		ans=s1+s2-l*r;
	}
    else
    {
    	ans=s1+s2;
	}
	
    cout << ans;
    return 0;
}
举报

相关推荐

0 条评论