问题:给定两个矩形A和B,矩形A的左上角坐标为(Xa1,Ya1),右下角坐标为(Xa2,Ya2),矩形B的左上角坐标为(Xb1,Yb1),右下角 坐标为(Xb2,Yb2)。

(1)设计一个算法,确定两个矩形是否相交(即有重叠区域)

(2)如果两个矩形相交,设计一个算法,求出相交的区域矩形

(1) 对于这个问题,一般的思路就是判断一个矩形的四个顶点是否在另一个矩形的区域内。这个思路最简单,但是效率不高,并且存在错误,错误在哪里,下面分析一 下。

如上图,把矩形的相交(区域重叠)分成三种(可能也有其他划分),对于第三种情况,如图中的(3),两个矩形相交,但并不存在一个矩形的顶点在另一个矩形 内部。所以那种思路存在一个错误,对于这种情况的相交则检查不出。

仔细观察上图,想到另一种思路,那就是判断两个矩形的中心坐标的水平和垂直距离,只要这两个值满足某种条件就可以相交。

矩形A的宽 Wa = Xa2-Xa1 高 Ha = Ya2-Ya1

矩形B的宽 Wb = Xb2-Xb1 高 Hb = Yb2-Yb1

矩形A的中心坐标 (Xa3,Ya3) = ( (Xa2+Xa1)/2 ,(Ya2+Ya1)/2 )

矩形B的中心坐标 (Xb3,Yb3) = ( (Xb2+Xb1)/2 ,(Yb2+Yb1)/2 )

所以只要同时满足下面两个式子,就可以说明两个矩形相交。

1) | Xb3-Xa3 | <= Wa/2 + Wb/2

2) | Yb3-Ya3 | <= Ha/2 + Hb/2

即:

| Xb2+Xb1-Xa2-Xa1 | <= Xa2-Xa1 + Xb2-Xb1

| Yb2+Yb1-Ya2-Ya1 | <=Y a2-Ya1 + Yb2-Yb1

附上js实现

intersect = function(rect1, rect2) {

var half1Width = rect1.width / 2,

half1Height = rect1.height / 2,

half2Width = rect2.width / 2,

half2Height = rect2.height / 2,

cen1 = {

x: rect1.x + half1Width,

y: rect1.y + half1Height

},

cen2 = {

x: rect2.x + half2Width,

y: rect2.y + half2Height

};

return Math.abs(cen2.x - cen1.x) <= half1Width + half2Width &&

Math.abs(cen2.y - cen1.y) <= half1Height + half2Height;

};

(2) 对于这个问题,假设两个矩形相交,设相交之后的矩形为C,且矩形C的左上角坐标为(Xc1,Yc1),右下角坐标为(Xc2,Yc2),经过观察上图,很 显然可以得到:

Xc1 = max(Xa1,Xb1)

Yc1 = max(Ya1,Yb1)

Xc2 = min(Xa2,Xb2)

Yc2 = min(Ya2,Yb2)

这样就求出了矩形的相交区域。

另外,注意到在不假设矩形相交的前提下,定义(Xc1,Yc1),(Xc2,Yc2),且Xc1,Yc1,Xc2,Yc2的值由上面四个式子得出。这样, 可以依据Xc1,Yc1,Xc2,Yc2的值来判断矩形相交。

Xc1,Yc1,Xc2,Yc2只要同时满足下面两个式子,就可以说明两个矩形相交。

3) Xc1 <= Xc2

4) Yc1 <= Yc2

即:

max(Xa1,Xb1) <= min(Xa2,Xb2)

max(Ya1,Yb1) <= min(Ya2,Yb2)

欢迎试用Magix、star与fork

java判断两个矩形是否相交_判断矩形相交以及求出相交的区域相关推荐

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

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

  2. 例 9.14 声明一个类模板,利用它分别实现两个整数、浮点数和字符的比较,求出大数和小数。

    C++程序设计(第三版) 谭浩强 例9.14 个人设计 例 9.14 声明一个类模板,利用它分别实现两个整数.浮点数和字符的比较,求出大数和小数. 代码块: 在类模板内部定义成员函数 #include ...

  3. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

  4. java比较两个list是否相同_Java判断两个List是否相同

    1.利用Java中为List提供的方法retainAll() /** * 判断两个List内的元素是否相同 * * 此方法有bug 见Food.class * * @param list1 * @pa ...

  5. python判断两个数是否互质_《算法》第一章——判断两个整数是否互质

    判断两个整数互质的方法 概念:公约数只有1的两个数叫做互质数.根据互质数的概念可以对一组数是否互质进行判断.如:9和11的公约数只有1,则它们是互质数. 求商判断法:用大数除以小数,如果除得的余数与其 ...

  6. 判断两个树是否相等和判断tree1是否包含tree2 python实现

    判断两个树是否相等 def equal(node_a, node_b):"""判断两个树是否相等:param node_a: :param node_b: :return ...

  7. 判断两个对象是否相等java_判断两个对象的内容是否相等

    由于在做键盘导航组件的项目时,有这样一个需求,当用户传入按键字母和网址的映射时,如果和 localStorage 中的不一样那么就用 localStorage 中存储的,这个时候就需要比较两个对象的内 ...

  8. C语言判断两字符串同构,c语言实现判断两颗树是否同构

    在本题中认为如果两个树左右子树交换可以相同,也被认为是同构树. 对应输入格式为:4(总结点数) A - 1 B 2 3 C - - D - - #include #define Tree int #d ...

  9. JS判断两个日期的差或者判断两个日期的大小

    1.判断两个日期的差: /**计算日期天数差的函数-hanliwei-2013-03-14*/ function DateDiff(sDate1,sDate2) { //sDate1和sDate2的格 ...

最新文章

  1. Net::SSH::Perl 模块
  2. JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】
  3. 浅谈如何成为技术一号位
  4. tomcat的日志文件权限与启动用户的权限不一致
  5. PyTorch基础(part2)
  6. 纯js上传文件 很好用
  7. tpm php,TPM系列
  8. linux proc文件 write的原子性,linux - Linux中writev()系统调用的原子性 - 堆栈内存溢出...
  9. Java中竟有18种队列?45张图!安排
  10. 新手必学的java报表开发工具FineReport实用技巧
  11. php date( ymd_PHP DATE()
  12. 【转】 谈谈C++中的swap函数
  13. VC++ 6.0实现视频捕捉(VFW)
  14. eclipse+tomcat+mysql中JDBC驱动加载失败已解决
  15. 安装虚拟计算机有什么用途,为什么要使用虚拟机软件?——VMware的介绍与安装...
  16. Axure教程 axure新手入门基础(1)
  17. 第十三周 任务二
  18. asp.net机动车信息管理系统
  19. 前端、后端、客户端、数据库、服务器的简单总结
  20. Access端口和Trunk端口

热门文章

  1. [转]Express入门教程:一个简单的博客
  2. sum() over (order by )
  3. progressDialog 为什么设置了setProgress()方法无反应?
  4. PHP图形图像的典型应用 --常用图像的应用(统计图)
  5. C#小游戏-------猜数字(转载)
  6. java 注解校验_Java开发编写自定义校验注解和校验器
  7. Python爬取网易云热歌榜所有音乐及其热评
  8. FFmpeg wav转pcm(十一)
  9. RPM中SPEC宏定义对应路径
  10. 解决U盘安装Win10报错:No bootbale devices found.