zoukankan      html  css  js  c++  java
  • 两个矩形相交问题判断是否相交

    最近,面试遇到一道算法题目如下:

    两个矩形,判断是否相交;如果相交面积大于零,输出相交部分的左上角以及右下角坐标点,否则,输出(-1,-1)、(-1,-1)。

    没有给出完善的解决方案,在面试官的细心引导下,解决了两个线段相交输出交点的问题。因此下来在网上搜了相关的问题。

    1)下面是转自https://blog.csdn.net/szfhy/article/details/49740191判断两个矩形是否相交的方法:

    下图是两个矩形相交的5种情况:

    如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的。

    Case 2345中,两个中心点间的距离肯定小于AB边长和的一半。

    Case 1中就像等了。

    设A[x01,y01,x02,y02]  B[x11,y11,x12,y12].

    矩形A和矩形B物理中心点X方向的距离为Lx:abs( (x01+x02)/2 – (x11+x12) /2)

    矩形A和矩形B物理中心点Y方向的距离为Ly:abs( (y01+y02)/2 – (y11+y12) /2)

    矩形A和矩形B X方向的边长为 Sax:abs(x01-x02)  Sbx: abs(x11-x12)

    矩形A和矩形B Y方向的边长为 Say:abs(y01-y02)  Sby: abs(y11-y12)

    如果AB相交,则满足下列关系:

    Lx <= (Sax + Sbx)/2 && Ly <=(Say+ Sby)/2

     1 static uint8_t is_rect_intersect(int x01, int x02, int y01, int y02,
     2     int x11, int x12, int y11, int y12)
     3 {
     4     int zx = abs(x01 + x02 -x11 - x12);
     5     int x  = abs(x01 - x02) + abs(x11 - x12);
     6     int zy = abs(y01 + y02 - y11 - y12);
     7     int y  = abs(y01 - y02) + abs(y11 - y12);
     8     if(zx <= x && zy <= y)
     9         return 1;
    10     else
    11         return 0;
    12 
    13 }

    2)如何确定相交部分矩形的左上角坐标和右下角坐标,网上看了很多版本,总觉得不全面。(比如好多都是在原有的两个矩形的坐标中中确定相交矩形的坐标,明显忽略了交点是两个矩形边相交的情况(如下图),等后面学习到全面的答案,再做补充)

    没有诗和远方 只有代码和当下
  • 相关阅读:
    BZOJ 1630/2023 Ant Counting 数蚂蚁
    BZOJ 3997 组合数学
    BZOJ 2200 道路与航线
    BZOJ 3181 BROJ
    BZOJ 4011 落忆枫音
    BZOJ 4027 兔子与樱花
    vijos 1741 观光公交
    vijos 1776 关押罪犯
    vijos 1780 开车旅行
    5、异步通知机制
  • 原文地址:https://www.cnblogs.com/ArleneZhangfj/p/9997968.html
Copyright © 2011-2022 走看看