当前位置: 首页 > news >正文

【教程】矩形重叠检测 -- 分离轴定理的应用

目录

  • 判断条件
  • 代码实现

假设现在提供了两个矩形的起始行,起始列,结束行和结束列(提供坐标点本质上也是一样的判断逻辑),要求判断两个矩形是否重叠。

这个问题乍一看似乎比较简单,无非就是判断两个矩形是否存在边的交叠,但是要完整判断所有情况,那么必须抽象出一个判断条件来涵盖所有可能性。

矩形重叠检测,换一个角度可以理解为图形的碰撞检测,而基于超平面分离的分离轴定理可以很好的用在矩形重叠检测上。

这里关于超平面定理和分离轴定理不进行赘述,仅说明分离轴定理如何用在矩形重叠检测中。

判断条件

从经验分析,两个矩形重叠无非也就是这四种情况(完全重叠为其极端场景)
在这里插入图片描述
我们规定矩形上面的边为起始行,矩形左边的列为起始列,矩形下面的行为结束行,矩形右边的列为结束列。

同时,这里我们规定两个矩形如果边重叠,也被视为重叠。

因此我们不难总结出当同时满足如下条件时,我们可以说两个矩形重叠了:

  1. A 的起始行 <= B 的结束行
  2. A 的起始列 <= B 的结束列
  3. A 的结束行 >= B 的起始行
  4. A 的结束列 >= B 的起始列

以上就是分离轴定理在矩形重叠检测中的应用。

代码实现

现在提供 A,B 两个矩形的起始行,起始列,结束行和结束列,我们来判断两个矩形是否重叠。
在这里插入图片描述

#include <iostream>
#include <vector>using namespace std;bool IsOverLap(vector<int>& A, vector<int>& B) {if (A[0] <= B[2] &&A[1] <= B[3] &&A[2] >= B[0] &&A[3] >= B[1]) return true;return false;
}int main() {vector<int> A = {0, 1, 3, 5}; // 起始行 起始列 结束行 结束列vector<int> B = {1, 3, 6, 6};cout << IsOverLap(A, B) << endl; // 重叠B = {2, 7, 4, 7};cout << IsOverLap(A, B) << endl; // 不重叠return 0;
}
http://www.xdnf.cn/news/954037.html

相关文章:

  • Vue 插槽(Slot)用法详解
  • UFW防火墙安全指南
  • 【算法-BFS实现FloodFill算法】使用BFS实现FloodFill算法:高效识别连通块并进行图像填充
  • 时间复杂度和算法选择
  • WinUI3开发_使用mica效果
  • vitepress添加图片放大功能
  • 基于2.4G功能的使用
  • encodeURIComponent和decodeURIComponent
  • 21-Oracle 23 ai-Automatic SQL Plan Management(SPM)
  • 多元隐函数 偏导公式法 (显示变化 + 隐式变化)
  • ABAP设计模式之---“Tell, Don’t Ask原则”
  • STL 1 容器
  • 基于生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作
  • 12.找到字符串中所有字母异位词
  • Oracle查询表空间大小
  • vue的<router-link>的to里面的query和params的区别
  • pocketflow库实现guardrail
  • Nginx server_name 配置说明
  • Qt插件化编程的全面解析(QPluginLoader)
  • 微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
  • 云防火墙(安全组)配置指南:从入门到精通端口开放 (2025)
  • OCR、图像分类与目标检测
  • 雷达RCS计算中的旋转矩阵
  • 在Ubuntu上利用loongarch64交叉编译工具编译opencv4.4.0
  • 【排错】ollama报错unable to load model
  • 【知识点】第8章:程序设计方法论
  • CKA考试知识点分享(6)---PriorityClass
  • 自动化测试工具playwright中文文档-------19.评估JavaScript
  • 初版BL程序一些细节整理(碎碎念)
  • 相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解