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

时间:2023-08-17 18:39:09 

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

标签:矩形相交
0
投稿

猜你喜欢

  • Python线程编程之Thread详解

    2022-04-10 17:37:01
  • Golang解析yaml文件操作指南

    2024-05-09 14:51:59
  • MySQL常用分库分表方案汇总

    2024-01-18 10:51:14
  • SQL Server开发智能提示插件SQL Prompt介绍

    2024-01-23 01:02:54
  • 一文教你利用Python画花样图

    2023-09-01 20:26:42
  • Python获取航线信息并且制作成图的讲解

    2023-08-28 18:18:56
  • 设计中基于人类学的田野调查与比较研究法 ——浅谈用研与竞品分析方法之理论基础

    2009-08-31 16:45:00
  • 设计师的职业规划

    2009-08-31 12:52:00
  • Node.js Domain 模块实例详解

    2024-05-08 09:35:15
  • Pytorch to(device)用法

    2022-05-04 22:57:19
  • PHP对战ASP:这还值得讨论吗

    2008-04-16 14:19:00
  • python中for用来遍历range函数的方法

    2022-01-28 03:04:53
  • python 递归调用返回None的问题及解决方法

    2022-12-21 05:52:56
  • Python Django框架实现应用添加logging日志操作示例

    2022-09-17 20:59:52
  • Mysql中报错函数floor()函数和rand()函数的配合使用及原理详解

    2024-01-21 13:41:03
  • Mysql的列修改成行并显示数据的简单实现

    2024-01-24 01:39:54
  • 潜谈产品设计中的可用性和可访问性

    2009-01-18 12:47:00
  • python 实现的截屏工具

    2023-05-15 00:20:39
  • python学习print中format的用法示例

    2023-06-03 14:21:57
  • javascript实现禁止复制网页内容汇总

    2024-04-16 09:31:48
  • asp之家 网络编程 m.aspxhome.com