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

    没有诗和远方 只有代码和当下
  • 相关阅读:
    「日常训练」Single-use Stones (CFR476D2D)
    「日常训练」Greedy Arkady (CFR476D2C)
    「Haskell 学习」二 类型和函数(上)
    「学习记录」《数值分析》第二章计算实习题(Python语言)
    「日常训练」Alena And The Heater (CFR466D2D)
    Dubbo 消费者
    Dubbo 暴露服务
    Rpc
    git fail to push some refs....
    Spring Cloud (6)config 客户端配置 与GitHub通信
  • 原文地址:https://www.cnblogs.com/ArleneZhangfj/p/9997968.html
Copyright © 2011-2022 走看看