如何通过两个矩形的左上、右下顶点坐标判断二者是否相交
矩形相交判断方法(边/角接触均判定为相交)
前置约定
先统一坐标规则,保证判断逻辑通用:
- 对任意矩形,左上顶点坐标为
(x1, y1),右下顶点坐标为(x2, y2),强制满足x2 > x1 - 两个矩形使用同一套坐标系即可,无论y轴是向上(数学坐标系)还是向下(屏幕坐标系),只要保证同一矩形的
y2在对应坐标系规则下大于y1即可
核心判断逻辑
用反向排除法实现更简单,不容易出错:先找出所有「两个矩形一定不相交」的情况,只要不满足任意一种不相交情况,就属于相交范畴。
两个矩形一定不相交的4种充分条件,满足任意一种即可判定为不相交:
- 矩形A整体在矩形B左侧:
A.x2 < B.x1 - 矩形A整体在矩形B右侧:
A.x1 > B.x2 - 矩形A整体在矩形B上方:
A.y2 < B.y1 - 矩形A整体在矩形B下方:
A.y1 > B.y2
也就是说,只有当以上4个条件全部不成立时,两个矩形相交,完全符合「边接触、角点接触均算相交」的要求。
代码示例
以下是Python实现的判断函数:
def is_intersect(rect_a, rect_b): # rect参数格式为 (x1, y1, x2, y2),需满足x2>x1、y2>y1 a_x1, a_y1, a_x2, a_y2 = rect_a b_x1, b_y1, b_x2, b_y2 = rect_b # 满足任意不相交条件返回False,否则返回True if a_x2 < b_x1 or a_x1 > b_x2 or a_y2 < b_y1 or a_y1 > b_y2: return False return True
边界场景验证
- 边接触场景:矩形A右边界为10,矩形B左边界为10,纵向范围存在重叠,此时
A.x2 < B.x1即10 < 10不成立,函数返回True,符合相交判定规则 - 角点接触场景:矩形A右下顶点为(10, 10),矩形B左上顶点为(10, 10),四个不相交条件全部不成立,函数返回True,符合相交判定规则
- 完全错开场景:矩形A右边界为9,矩形B左边界为10,此时
A.x2 < B.x1成立,函数返回False,符合预期
内容的提问来源于stack exchange,提问作者Max Aquino
相关产品推荐
相关产品推荐

