推荐学习博客:[zz]判断两矩形是否交叉(包括包含的情况) - Avril - 博客园
一:判断两矩形是否相交
设矩形A的左下角坐标为(xa1,ya1),右上角坐标为(xa2,ya2)
矩形B的左下角坐标为(xb1,yb1),右上角坐标为(xb2,yb2)
判断是否相交,可通过两矩形的中心点连线与其坐标的关系
设ox为矩形A的中心点的横坐标,oy为矩形A的中心点的纵坐标
设ex为矩形B的中心点的横坐标,ey为矩形B的中心点的纵坐标
ox=(xa1+xa2)/2;
oy=(ya1+ya2)/2;
ex=(xb1+xb2)/2;
ey=(yb1+yb2)/2;
即若两矩形能相交,需同时满足
|ex-ox|<=((xa2-xa1)/2+(xb2-xb1)/2)
|ey-oy|<=((ya2-ya1)/2+(yb2-yb1)/2)
【假设xa2>xa1,xb2>xb1,ya2>ya1,yb2>yb1的情况】【需同时满足】
二:求相交矩阵的面积
当两矩形相交:
设cx为相交矩形的左下角点的横坐标
cy为相交矩形的左下角点的纵坐标
ex为相交矩形的右上角点的横坐标
ey为相交矩形的右上角点的纵坐标
cx=max(xa1,xb1); ///左下角的x坐标
cy=max(yb1,yb1); ///左下角y坐标
ex=min(xa2,xb2); ///右上角x坐标
ey=min(ya2,yb2); ///右上角y坐标
面积s_s=fabs(cx-ex)*fabs(cy-ey);
例题:G - IoU
Xzz需要计算两个矩形的交叉联盟(IoU),你能帮助他吗?
矩形(x,y,w,h)表示矩形MNPQ,M(x,y),N(x,y + h),P(x + w,y + h),Q(x + w,y) 。
IoU =重叠面积/结合面积。
输入
输入文件的第一行包含一个整数T(0 <T <= 100),表示有多少输入情况。
每种情况的描述如下:
每个输入集的第一行包含整数x1,y1,w1,h1。
每个输入集的第二行包含整数x2,y2,w2,h2。
0≤x,y,w,h≤100000
产量
每个测试用例的输出描述如下:
每个测试用例的输出的第一行包含数字k-两个矩形的IoU。
输出应舍入为小数点后的2位数。
样本输入
2 1 1 1 1 1 1 2 2 1 1 2 1 1 1 1 2
样本输出
0.25 0.33
题解:
w,h分别是其矩阵的宽和高,题目给定w,h>=0
左下角坐标(x,y),右上角坐标(x+w,y+h)
求相交矩形的面积和两矩形相交后组成的几何图形的面积的比值
代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<bitset>
typedef long long ll;
const int xmax=1e6+100;
using namespace std;
int main()
{
int t;
cin>>t;
double x1,y1,w1,h1;
double s,s1,s2;
double x2,y2,w2,h2;
while(t--)
{
cin>>x1>>y1>>w1>>h1;
cin>>x2>>y2>>w2>>h2;
s1=w1*h1;
s2=w2*h2;
double dx1=x1+w1; ///矩形1的与x1对角线的点的横坐标
double dy1=y1+h1; ///矩形1的与y1..........的纵坐标
double dx2=x2+w2; ///矩形2的与x2....
double dy2=y2+h2; ///矩形2的与y2.....
double ox1=x1+w1/2,oy1=y1+h1/2; ///矩形1的中心坐标
double ox2=x2+w2/2,oy2=y2+h2/2; ///矩形2的中心坐标
//cout<<ox1<<' '<<oy1<<' '<<ox2<<' '<<oy2<<endl;
if((fabs(ox2-ox1)<=w1/2+w2/2)&&(fabs(oy2-oy1)<=h1/2+h2/2))
{
double cx=max(x2,x1); ///相交矩形左下角的x坐标
double cy=max(y2,y1); ///左下角y坐标
double ex=min(x2+w2,x1+w1); ///右上角x坐标
double ey=min(y2+h2,y1+h1); ///右上角y坐标
//cout<<cx<<' '<<cy<<' '<<ex<<' '<<ey<<endl;
double s_s=fabs(cx-ex)*fabs(cy-ey);
//cout<<s_s<<endl;
s=s_s/((s1+s2)-s_s);
printf("%.2lf\n",s);
}
else
{
printf("0.00\n");
}
}
return 0;
}