判断两个矩形是否相交(Rect Intersection)
0x00 Preface
最近在开发一个2D组态图形组件的过程中,里面的数学模块,涉及到两个矩形是否相交的判断。
这个问题很多年前就写过,算是个小的算法吧。
网络上搜索一下,有很多思路,有一些思路要基于多种组合的判断,显得比较复杂。 比如两个矩形相交的情形,可能有下面的多种类型:
而每种类型又有多种子类型。
0x01 Body
其实可以反向来思考这个问题,就比较简单,两个矩形A和B,不相交的情况有哪些,然后通过bool 取反,就是相交的情况。
假设矩形的的定义如下:
class Rect {
constructor(x,y,w,h) {
this.x = x;
this.y = y;
this.w = w;
this.h = h;
this.r = x + w; // r表示矩形的右边
this.b = y + h; // b 表示矩形的下边
}
}
不相交的情况可以归纳为这几种情况:
- A在B的左边 (A.r < B.x)
- A在B的右边 ( B.r < A.x)
- A在B的上边 (A.b < B.y )
- A在B的下边 (B.b < A.y )
所以不相交的代码如下:
A.r < B.x || B.r < A.x || A.b < B.y || B.b <A.y
对于这种情况取反,就是相交的情况:
!(A.r < B.x || B.r < A.x || A.b < B.y || B.b <A.y)
取反之后 或变与:
A.r >= B.x && B.r >= A.x && A.b >= B.y && B.b >= A.y
尝试着问下ChatGPT,它给出的正是这种思路,如下图:
0x02 Conclusion
- 有时候反过来思考问题,是一种很好的思路
- ChatGPT 牛逼。
0x03 The Last
最后,关注公号“ITMan彪叔” 可以添加作者微信进行交流,及时收到更多有价值的文章。
判断两个矩形是否相交(Rect Intersection)的更多相关文章
- PHP判断两个矩形是否相交
<?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的 ...
- C# 判断两个矩形是否相交
源代码 public bool JudgeRectangleIntersect(double RecAleftX, double RecAleftY, double RecArightX, doubl ...
- 判断圆和矩形是否相交C - Rectangle and Circle
Description Given a rectangle and a circle in the coordinate system(two edges of the rectangle are p ...
- poj1410(判断线段和矩形是否相交)
题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两 ...
- Oracle判断两个时间段是否相交
SQL中常常要判断两个时间段是否相交,该如何判断呢?比如两个时间段(S1,E1)和(S2,E2).我最先想到的是下面的方法一.方法一:(S1 BETWEEN S2 AND E2) OR (S2 BET ...
- HDU 1221 Rectangle and Circle(判断圆和矩形是不是相交)
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1221 Rectangle and Circle Time Limit: 2000/1000 MS (J ...
- [cocos2d-x]判断两个矩形是否有交叉区域
bool Rect::intersectsRect(const Rect& rect) const { return !( getMaxX() < rect.getMinX() || r ...
- Codeforces Round #587 (Div. 3) C题 【判断两个矩形是否完全覆盖一个矩形问题】 {补题 [差点上分系列]}
C. White Sheet There is a white sheet of paper lying on a rectangle table. The sheet is a rectangle ...
- C# 判断两条直线是否相交
直接上代码,过程不复杂 /// <summary> /// 判断两条线是否相交 /// </summary> /// <param name="a"& ...
- cocos2d-x 判断两条直线是否相交
bool GraphicsUtil::linesCross(b2Vec2 v0, b2Vec2 v1, b2Vec2 t0, b2Vec2 t1, b2Vec2 &intersectionPo ...
随机推荐
- Apollo 分布式配置中心理论到实践
携程开源的配置管理中心(统一管理各种应用配置的基础服务组件),能够集中化管理应用的不同环境,不同集群的配置,配置修改后能够实时推送到应用端,适合微服务配置管理场景.Apollo包括服务端和客户端. 在 ...
- 【牛客小白月赛69】题解与分析A-F【蛋挞】【玩具】【开题顺序】【旅游】【等腰三角形(easy)】【等腰三角形(hard)】
比赛传送门:https://ac.nowcoder.com/acm/contest/52441 感觉整体难度有点偏大. 作者:Eriktse 简介:19岁,211计算机在读,现役ACM银牌选手力争以通 ...
- 万字血书Vue—Vuex
Vuex概述 组件之间共享数据的方式(小范围) 全局事件总线 Vuex是什么? 专门在Vue中实现集中式状态(数据)管理的一个Vue插件,可以方便的实现组件之间的数据共享. 使用Vuex统一管理状态的 ...
- Redis分布式Session和普通的cookie session有什么区别?
Redis 是一种高性能的缓存和 key-value 存储系统,常被用来实现分布式 Session 的方案.在这种方案中,用户的登录信息存储在 Redis 中,而不是存储在本地的 cookie 或 s ...
- STM32 HAL库学习 (3) 中断!
中断在单片机开发中有着重中之重的地位. 中断即打断,实至CPU再执行当前程序时,由于系统出现了某种需要处理的紧急情况,CPU暂停正在执行的程序,转而去执行另一段特殊程序来处理的出现的紧急 ...
- it必给装机小软件附源码
需要的包 启动之后是这个样子的 远吗如下: #authon fengimport zipfile as zfimport osimport win32apiimport win32conimport ...
- 系统建模之UML用例视图
<用例视图> 1 用例图的目标 who「参与者」:确定谁要使用系统 what「功能」:他们使用系统做什么? 2 用例图-四大主要组件 2.1 参与者 参与者:与应用程序或系统进行交互的用户 ...
- Java设计模式 —— 单例模式
6 单例模式 6.1 单例模式概述 Singleton Patter:确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例. 单例模式有3个要点: 该类只能有一个实例 该类必须自行创建这个实 ...
- CentOS7---Nginx安装并配置虚拟主机
1.源码安装nginx,并提供服务脚本 源码包的获取:官网下载 实验环境:和企业环境类似,关闭防火墙,禁用selinux,使用静态IP地址 安装步骤: 步骤一:安装Nginx所需的pcre库 [roo ...
- AI降临,前端启用面壁计划
作者:京东零售 郑炳懿 开篇: "在我们有生之年,你觉得会看到AI兵临城下的那一天吗?就像电影黑客帝国里面演的一样",Barry从红色的烟盒里取出一根烟发问道. "不可能 ...