判断两矩形bouding box是否相交或包含

本文探讨如何判断两个矩形的bounding box是否相交或包含,避免复杂条件判断。通过分析矩形中心与边的关系,得出结论:若两矩形相交,它们中心之间的连线长度在x和y轴上的分量都小于等于对应边长之和的一半。据此编写简洁的代码解决该问题。
摘要由CSDN通过智能技术生成

背景

今天在做一个需求的时候突然想到一个问题,需要来解决两个bounding box是否相交或者包含。看到这个问题的第一反应是写一堆if呗,一个一个判断,然而这样条件是不是太多了,万一自己漏掉一个之后还要被测试同学追杀,不行不行。

继续思考,发现是不是判断某个矩形的顶点顶点在另一个矩形内部就行了?这样if的判断就一下子少了很多,听起来是个不错的选择,但是再经过一些确认后发现,这里其实是有bug的,因为存在矩形相交但是没有一个顶点再另一个矩形内部。于是,为了避免这种盲点的再次出现,我先进行了一波分析,分析了一下两个矩形的可能存在的情况:

矩形关系
经过我仔细的思考,应该就是这8种情况了。于是我又开始思考,这回是从数学角度进行了一波分析,发现矩形有一个特点。

矩形的四条边互相垂直

依据这个特点,我们可以分析一下,矩形的中心一定在两个互相垂直的边的中点的垂线上。

之后我们考虑矩形中心和矩形边长的关系,我们其实可以发现,如果两个矩形相交或包含,他们的中心连线线段的长度一定是小于两个矩形的长宽之和的。这么描述可能不够直观,我们进行一下分解。

将这个长度在平面直角坐标系中表示,这样便有x和y两个分量,同样矩形的长宽也进行同样的解析,分为x和y两个分量。

于是我们可以发现,如果两个矩形相交,他们中心距离的x分量一定是小于等于两矩形长(x分量)之和的一半,他们中心距离的y分量一定小于等于两矩形宽(y分量)之和的一半。

于是我们便可以从这个角度进行coding,而且这样写完代码也很简洁。

解决方案

from decimal import *

def _in_bbox
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值