【判断两矩形是否相交,并求相交面积】——例题:IoU

    推荐学习博客:[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;
}

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值