两个矩形重叠当且仅当x方向和y方向均重叠;即max(x1,x2)
两个轴对齐矩形(AABB)不重叠,当且仅当其中一个完全在另一个的左侧、右侧、上方或下方。因此,**重叠的充要条件是:x方向重叠 AND y方向重叠**。这是最可靠、最高效的方式,避免了所有边界情况误判。
std::min 和 std::max 计算重叠区间假设每个矩形用左上角 (x, y) 加宽高 w、h 表示(y 向下为正),则右下角为 (x + w, y + h)。重叠判断可转化为两区间交集是否非空:
[x1, x1 + w1) 与 [x2, x2 + w2) 是否有交集[y1, y1 + h1) 与 [y2, y2 + h2)
std::max(left1, left2)
bool rectanglesOverlap(float x1, float y1, float w1, float h1,
float x2, float y2, float w2, float h2) {
float right1 = x1 + w1;
float right2 = x2 + w2;
float bottom1 = y1 + h1;
float bottom2 = y2 + h2;
bool xOverlap = std::max(x1, x2) < std::min(right1, right2);
bool yOverlap = std::max(y1, y2) < std::min(bottom1, bottom2);
return xOverlap && yOverlap;
}
很多 bug 来自对“是否包含边界”的模糊处理。C++ 中常用半开区间(如 [left, right))更安全,尤其配合浮点数或像素级坐标时:
left, top, right, bottom(即已含右/下边界),则直接用 left1
或调整区间定义
== 判断边界相等;优先用区间不等式逻辑,而非计算交集面积是否 > 0无需引入额外结构体也能写出清晰代码。关键在于把“分离条件”取反——比枚举四种分离情形更简洁、不易漏:
立即学习“C++免费学习笔记(深入)”;
auto overlap = !(x1 + w1 <= x2 || // A 在 B 左侧
x2 + w2 <= x1 || // B 在 A 左侧
y1 + h1 <= y2 || // A 在 B 上方
y2 + h2 <= y1); // B 在 A 上方
这行逻辑等价于前述 xOverlap && yOverlap,但更贴近人脑直觉(“不分离”即重叠)。只要矩形宽高非负,该写法鲁棒且无分支预测惩罚。
真正复杂的是旋转矩形或带 transform 的场景——那得用分离轴定理(SAT),但那是另一回事了。
# c++
# 结构体
# transform
# bug
# 的是
# 这是
# 浮点数
# 充要条件
# 那是
# 也能
# 回事
# 其中一个
# 四种
# 而非
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Go 中 defer 在 goroutine 内部不生效的原因与执行时机详解
Win11怎么关闭触摸屏_禁用Win11笔记本触摸屏功能设置【教程】
php订单日志怎么记录评价_php记录订单评价日志方法【方法】
Win11怎么制作U盘启动盘_Win11原版系统安装盘制作【详解】
Win11如何设置开机自动联网 Win11宽带连接自动拨号【步骤】
Go 语言标准库为何不提供泛型 Contains 方法:设计哲学与类型系统约束
Windows的便笺功能如何使用?(桌面备忘技巧)
Win11怎么更改鼠标指针_Windows 11自定义鼠标样式与大小【美化】
MAC如何修改默认应用程序_MAC文件后缀关联设置与打开方式更改【教程】
Python字符串处理进阶_切片方法解析【指导】
如何在 Go 中正确反序列化多个并列的 XML 元素(而非 XML 数组)
Win11如何卸载OneDrive_Win11卸载OneDrive方法【教程】
win11如何清理传递优化文件 Win11为C盘瘦身删除更新缓存【技巧】
c# 如何深拷贝和浅拷贝
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
Golang如何实现基本的用户注册_Golang用户注册表单处理示例
C++友元类使用场景_C++类间协作设计方式讲解
如何在Golang中编写异步函数测试_Golang异步操作测试策略
全球各国上班时间表外贸邮件时间
如何在Windows中创建新的用户账户?(标准与管理员)
Windows怎样关闭桌面弹窗广告_Windows关闭桌面弹窗设置【教程】
MAC怎么使用表情符号面板_MAC Emoji快捷键调用与符号查找【方法】
如何在Golang中处理数据库事务错误_回滚和日志记录
c++如何获取map中所有的键_C++遍历键值对提取所有key的方法
短链接还原php提示内存不足_调整PHP内存限制设置【技巧】
c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】
Python配置文件操作教程_JSONINIYAML解析与应用实战
如何使用Golang捕获测试日志_Golang testing日志记录方法
如何在Mac上搭建Golang开发环境_使用Homebrew安装和管理Go版本
Win11文件扩展名怎么显示_Win11查看文件后缀名设置【基础】
Win11如何设置开机问候语 Win11修改登录界面提示【技巧】
Go 中 := 短变量声明的类型推导机制详解
Win10路由器怎么隐藏ssid Win10隐藏wifi名称设置【指南】
Python实现图数据库操作_Neo4j核心CRUD与图算法解析
如何在Golang中处理通道发送接收错误_防止阻塞或panic
php怎么下载安装后设置默认字符集_utf8配置步骤【详解】
MAC怎么截图并快速编辑_MAC自带截图快捷键与标注工具使用【方法】
Win10怎样清理C盘爱奇艺缓存_Win10清理爱奇艺缓存步骤【步骤】
mac怎么安装字体_MAC添加第三方字体与字体册管理【教程】
c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】
微信企业付款回调PHP怎么接收_处理企业付款异步通知数据教程【教程】
如何在Golang中编写端到端测试_Golang E2E测试流程示例
c# Task.ConfigureAwait(true) 在什么场景下是必须的
c++的STL算法库find怎么用 在容器中查找指定元素【实用教程】
如何在Golang中处理二进制数据_Golang io与encoding/binary二进制操作方法
Windows10任务栏图标变成白色文件_Win10重建图标缓存修复方法
Golang如何测试HTTP中间件_Golang HTTP中间件功能测试实践
windows 10应用商店区域怎么改_windows 10微软商店切换地区方法
Win10如何备份注册表_Win10注册表备份步骤【攻略】
如何在 VS Code 中正确配置并使用 NumPy
2026-01-05
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。