矩形相交以及求出相交的区域的原理解析

 更新时间:2011年01月24日 20:09:54   作者:  
问题:给定两个矩形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

(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)

相关文章

  • K8ssandra入门教程之Linux上部署K8ssandra到Kubernetes的过程

    K8ssandra入门教程之Linux上部署K8ssandra到Kubernetes的过程

    K8ssandra不仅帮助我们可以快速可靠地在Kubernetes上部署Cassandra,同时提供了许多组件,如监控、备份、同步、访问等,这篇文章给大家介绍K8ssandra入门教程之Linux上部署K8ssandra到Kubernetes的过程,一起看看吧
    2021-10-10
  • 完美解决浏览器Flash插件过期不能用问题

    完美解决浏览器Flash插件过期不能用问题

    这篇文章主要介绍了完美解决浏览器Flash插件过期不能用问题
    2021-02-02
  • Git撤销&回滚操作(git reset 和 get revert)

    Git撤销&回滚操作(git reset 和 get revert)

    这篇文章主要介绍了Git撤销&回滚操作(git reset 和 get revert),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Atom-IDE 的使用方法简单介绍

    Atom-IDE 的使用方法简单介绍

    这篇文章主要介绍了Atom-IDE 的使用方法简单介绍的相关资料,Facebook 和 GitHub 两大巨头联手推出 Atom-IDE,这里介绍下如何使用,希望通过本文能帮助到大家,需要的朋友可以参考下
    2017-09-09
  • JAVA IDEA入门使用手册(新手小白必备)

    JAVA IDEA入门使用手册(新手小白必备)

    IDEA的每一个方面都是为了最大限度地提高开发人员的工作效率而设计的,本文主要介绍了JAVA IDEA入门使用手册,帮助新手更好的入门,感兴趣的可以了解一下
    2021-05-05
  • 好玩的vbs小程序之关机功能

    好玩的vbs小程序之关机功能

    这篇文章主要介绍了好玩的vbs小程序之关机功能,非常有趣,感兴趣的朋友跟随小编一起看看吧
    2019-09-09
  • 电子邮件 退信原因大全

    电子邮件 退信原因大全

    我们可以对邮件多尝试几次发送,如果实在不行那就过一会再发送邮件。
    2009-06-06
  • 详解Hadoop 运行环境搭建过程

    详解Hadoop 运行环境搭建过程

    这篇文章主要介绍了Hadoop 运行环境搭建过程,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-06-06
  • Git配置用户签名方式及原因说明

    Git配置用户签名方式及原因说明

    这篇文章主要为大家介绍了Git配置用户签名方式及原因说明,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-04-04
  • Git工作流演示及三种工作方式

    Git工作流演示及三种工作方式

    在项目开发过程中使用Git的方式有三种工作方式,分别是集中式工作流,Git Flow工作流,Forking 工作流。下面主要针对Git工作流进行讲解
    2022-04-04

最新评论