判断两个矩形是否相交

一个矩形由两个端点确定,即左上角和右下角,或由上下左右确定。
两个矩形相交时有公共部分
<=>两矩形相交时,长或宽经过平移都后有重叠的部分
<=>两矩形相交时,其外包矩形的长或宽都小于两矩形的长或宽之和
<=>两矩形相交时,其外包矩形的中心点被两矩形包含
两个矩形(x11,y11,x12,y12)和(x21,y21,x22,y22),max(|x11-x22|,|x21-x12|)即为外包矩形宽,max(|y11-y22|,|y12-y21|)即为外包矩形高。分别与两矩形宽之和、高之和比较即可。若都小于则两矩形相交;若有大于则不相交;若一等于一小于则边相交;若都等于则顶点相交。

class Square{int t,b,l,r;public Square(int t, int b, int l, int r) {this.t = t;this.b = b;this.l = l;this.r = r;}public Square copy(){return new Square(this.t,this.b,this.l,this.r);}private int maxAbs(int a,int b){return Math.max(Math.abs(a),Math.abs(b));}public int width(){return r-l;}public int height(){return t-b;}//判断是否重叠public boolean stackWith(Square another){return maxAbs(l- another.r,another.l-r)<width()+ another.width()&&maxAbs(t-another.b,b- another.t)<height()+ another.height();}//判断是否在另一矩形内部public boolean isInside(Square outer){return outer.l<=l&&outer.t>=t&&outer.r>=r&&outer.b<=b;}public boolean isEmpty(){return (l-r)*(t-b)==0;}Square[] parts;/**扣去一部分* 若不能扣去或已经部分扣去,则返回false* */public boolean removePart(Square remove){if (!remove.isInside(this)) return false;if(parts==null) {parts = new Square[5];//parts[2]是被扣去的部分parts[2] = remove;parts[0]=new Square(t, remove.t, l,r);parts[1]=new Square(remove.t,remove.b,l, remove.l);parts[3]=new Square(remove.t,remove.b,remove.r,r);parts[4]=new Square(remove.b,b,l,r);return true;}else {if(remove.stackWith(parts[2]))return false;boolean canRemove=true;if(remove.t>parts[0].b){canRemove=canRemove&&parts[0].removePart(new Square(remove.t,parts[0].b,remove.l, remove.r));}Square rFor13 = new Square(Math.min(parts[0].b, remove.t), Math.max(parts[4].t, remove.b), remove.l, remove.r);if(!rFor13.isEmpty()){if(remove.l>=parts[1].l&&remove.l<parts[1].r){canRemove=canRemove&&parts[1].removePart(rFor13);}elseif(remove.l>=parts[3].l&&remove.l<parts[3].r){canRemove=canRemove&&parts[3].removePart(rFor13);}}if(remove.b<parts[4].t){canRemove=canRemove&&parts[4].removePart(new Square(parts[4].t,remove.b,remove.l, remove.r));}return  canRemove;}}//是否全部被扣去public boolean isAllRemoved(){if(isEmpty())return true;if(parts==null)return false;for(int i=0;i<5;i++){if(i==2)continue;if(!parts[i].isAllRemoved())return false;}return true;}}

封装的矩形区域Rect或RectF都有成员方法intersect用于判断矩形是否相交。intersects则是静态的判断方法。

判断两个矩形是否相交相关推荐

  1. java判断两个矩形是否相交_判断矩形相交以及求出相交的区域

    问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...

  2. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  3. 判断两个矩形相交以及求出相交的区域

    问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2). (1)设计一个算法,确定两 ...

  4. 不使用物理系统判断两个矩形是否碰撞

    如图所示,不使用物理系统去检测两个物体是否碰撞的效果. 注意:两个物体如果一直相交,在Update中处理的时候会一直输出,在实际使用时需要注意相交时的处理. 直接上代码: 检测碰撞使用的是两个节点,节 ...

  5. 判断两个圆柱体是否相交

    问题 看到有人问这个问题.然后我写了解决这个问题的一个有用的理论准备.接下来简单介绍如何使用它判断两个圆柱是否相交. 解法 问题中的圆柱假设有中轴线,lil_i, 用固定点 Xi=(ai,bi,ci) ...

  6. 求取两个矩形的相交区域

    在此讨论的求取两个矩形的相交区域问题中的矩形的边是平行于坐标轴的情况,不平行的暂时无讨论. 因为工作的需要求取两个矩形的相交区域面积的python程序,当时在网上找呀找,要么是说的云里雾里的,要么代码 ...

  7. egret判断两个多边形是否相交(分离轴定律)

    参考原文:原文 预备知识:向量的点积:  关于向量的知识这里不再赘述 分离轴定理(Separating Axis Theorem) 概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠, ...

  8. 编程之美:编程判断两个链表是否相交

    1.问题描述 给出两个单向链表的头指针,比如h1.h2,判断两个链表是否相交.编程之美为了简化问题,假设两个链表均不带环. 如下图: 2.分析与解法 解法一:直观法,先判断第一个链表的每个节点是否在第 ...

  9. 3.6 判断两个链表是否相交

    判断两个链表是否相交,若相交则求其交点(指第一个相交的点). 思路1,利用计数法: 遍历链表1,将其节点的内存地址存入map或者hashmap内.然后遍历链表2,并查询map或者hashmap,判断链 ...

  10. 判断两个链表是否相交

    方法:获得两个链表的长度,获得长度的差值len,然后首先遍历较长的链表len次,然后再同时遍历两个链表,如果有相同部分,两个链表就相交,如果没有,则不相交,即没有公共部分. 代码: #include ...

最新文章

  1. 【OpenCV 4开发详解】图像噪声的种类与生成
  2. 从云到端,谷歌的AI芯片2.0
  3. Web API 安全问题
  4. win7 桌面右下角音量图标消失的解决办法 参考
  5. st-link v2怎么连接_三相交流电源的三角形和星形连接
  6. 吴恩达深度学习 —— 2.16 关于python/numpy向量的说明
  7. pycharm创建python虚拟环境好处_PyCharm虚拟环境创建Django2项目一些问题的解决方案...
  8. 基于MPI并行的VTI介质逆时偏移成像与ADCIGs提取
  9. Fortan中读取数据到text文件
  10. xmp文件格式怎么导入ps?ACR预设安装方法
  11. 石头机器人拖地水量调节_拖地组件再评测:正式版 家有 石头科技T4 米家一代 水箱拖地组件...
  12. iOS滤镜实现之LOMO(美图秀秀经典LOMO)
  13. 人民大学赵鑫:基于知识与推理的序列化推荐技术研究
  14. 用MATLAB制作音乐-小星星
  15. TortoiseGit 如何使用 cherry-pick
  16. 菱形是一种特殊的平行四边形,是四条边均相等的平行四边形。题目给出菱形的边长n,用*画出菱形。如n=1,输出:
  17. 高精度地图,从入门到入行
  18. krpano功能化实现
  19. 时间序列分析-针对时间序列的特殊方法
  20. 社群运营当下最流行的红包玩法

热门文章

  1. linux考勤机密码,一种基于Linux操作系统的考勤机的制作方法
  2. 云效研发效能度量体系,如何展示和解读交付效能数据
  3. CVPR'22 | 基于像素差异学习的视频高光检测算法及在视频广告中的应用
  4. wincc逻辑运算符_WINCC常用功能
  5. 你养狗的方法够科学吗?
  6. redis集群scan_Redis中的Scan命令的使用:查询大数据量
  7. Chrome插件(扩展)开发全攻略
  8. CUDA入门2——获取显卡参数
  9. 管理驾驶舱,老板的数据看板,移动报表,让数据更直观
  10. —— GPS测量原理及应用复习-6 ——