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

    推荐学习博客:https://www.cnblogs.com/avril/archive/2012/11/13/2767577.html


一:判断两矩形是否相交

       设矩形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

每种情况的描述如下:

每个输入集的第一行包含整数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
#include
#include
#include
#include
#include
#include
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<

 

你可能感兴趣的:(几何)