这是一般用于检测凸多边形是否重叠的理论,并简称为SAT

首先 我们先看一下知乎上对于分离轴定理的定义:

我们定义分离轴是这样一个方向轴,两个convex物体分别投影到这个轴上,同时这两个物体的投影互不相交。因此,若给出两个convex物体A、B,若存在一条分离轴则这两个物体AB必不相交,否则这两个物体存在相交。

也就是说我们可以通过判断投影是否存在间隙来判断物体是否相碰撞。

第一部分,对于不规则图形,若是可以简化成外围为简单的几何凸多边形,我们就可以用此来判断。

下面记录我写的一道例题

给出两个矩形的四个位置坐标,试求是否碰撞,题保证若碰撞,两矩形的重叠面积至少占其中的一个矩形面积的10%

下面给出我copy加自己简化的代码(第一次写不会)

typedef struct {float x,y;
}point;
point rt1[4],rt2[4];
float axis(point p,point o,point v_axis){point p_o;p_o.x=p.x-o.x;p_o.y=p.y-o.y;return p_o.x*v_axis.x+p_o.y*v_axis.y;
}
int check(point v_axis,point o){float al=FLT_MAX,ar=-FLT_MAX,bl=FLT_MAX,br=-FLT_MAX;for(int i=0;i<4;i++){al=min(al,axis(rt1[i],o,v_axis));ar=max(ar,axis(rt1[i],o,v_axis));bl=min(bl,axis(rt2[i],o,v_axis));br=max(br,axis(rt2[i],o,v_axis));}if(ar<=bl)return 0;if(al>=br)return 0;return 1;
}
int solve(){point v_rt1_h,v_rt1_w,v_rt2_h,v_rt2_w;v_rt1_h.x=rt1[3].x-rt1[0].x;v_rt1_h.y=rt1[3].y-rt1[0].y;v_rt1_w.x=rt1[1].x-rt1[0].x;v_rt1_w.y=rt1[1].y-rt1[0].y;v_rt2_h.x=rt2[3].x-rt2[0].x;v_rt2_h.y=rt2[3].y-rt2[0].y;v_rt2_w.x=rt2[1].x-rt2[0].x;v_rt2_w.y=rt2[1].y-rt2[0].y;int ans=1;ans&=check(v_rt1_h,rt1[0]);ans&=check(v_rt1_w,rt1[0]);ans&=check(v_rt2_h,rt2[0]);ans&=check(v_rt2_w,rt2[0]);return ans;
}

首先我们可以从中得到一点经典的惯用技巧:

1,可以定义一个结构体来简化点的输入

2,可以定义多个结构体数组来描绘一个对象

3,需要包含<float.h>头文件来定义极大极小值

其次

我们开始分析函数

第一个是投影位置的长度

假设以o点为坐标原点,那么以o点链接的一条边为投影的x轴,得到v_axis,

输入一个坐标,那么其投影的长度公式为x1*x2+y1*y2;

可得到有向线段的长度

第二个是逐个坐标带入,求取对应矩形的投影长度最大最小值。

然后返回是否存在不相交的情况

若是遍历矩形的所有的边,仍未找到,返回1(碰撞)。

另外

我们一般处理空间上的点时,利用向量可以减少不必要的排序。

后记

只是学了这个定理,感觉其道理简朴,思绪明了,但纸上得来终觉浅,需要更深入的结合实践来巩固才好,同时此题也让我大开眼界,计算几何道阻且长。

计算几何类------分离轴定理相关推荐

  1. JavaScript实现碰撞检测(分离轴定理)

    概述 分离轴定理是一项用于检测碰撞的算法.其适用范围较广,涵盖检测圆与多边形,多边形与多边形的碰撞:缺点在于无法检测凹多边形的碰撞.本demo使用Js进行算法实现,HTML5 canvas进行渲染. ...

  2. 分离轴定理SAT及碰撞检测

    1.简介 分离轴理论,简称SAT(SeparatingAxisTheorem),通过判断任意两个凸多边形在任意角度下的投影是否均存在重叠,来判断是否发生碰撞.即两个不相交的多边形一定能找到一条轴,它们 ...

  3. 碰撞检测之分离轴定理算法讲解

    本文翻译自@sevenson的文章Separating Axis Theorem (SAT) Explanation .原文作者用的是ActionScript 3来编写算法,不过文中主要讲述的还是算法 ...

  4. 分离轴定理SAT凸多边形精确碰撞检测

    分离轴定理SAT凸多边形精确碰撞检测 定理 Separating Axis Theorem,缩写SAT,中文为分离轴理论或分离轴定理,通过判断凸多边形在分离轴上的投影是否重叠来判断是否发生碰撞. 所谓 ...

  5. 碰撞检测之分离轴定理算法

    本文转载自 https://blog.csdn.net/yorhomwang/article/details/54869018,感谢博主分享 本文翻译自@sevenson的文章Separating A ...

  6. 分离轴定理及向量应用

    分离轴定理及向量应用 通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠,来判断是否发生碰撞.若在某一角度光源下,两物体的投影存在间隙,则为不碰撞,否则为发生碰撞. 算法简述1 从根本上来讲 ...

  7. 【运动规划算法项目实战】如何使用分离轴定理算法实现碰撞检测(附ROS C++代码)

    文章目录 前言 一.分离轴定理简介 二. 碰撞检测流程 三.代码实现 3.1 计算物体的顶点坐标 3.2 计算出物体的所有边 3.3 检测两个三维物体是否发生碰撞 3.4 完整代码 3.5 RVIZ显 ...

  8. java 用面向接口编程的方式开发打印机_Java“打印机”模型理解面向接口编程。实现接口定义类,接口实现类,核心“业务”类分离...

    接口定义类 IinkBox.java package printerDemo.iface; public interface IInkBox { public String getColor(); } ...

  9. egret判断两个多边形是否相交(分离轴定律)

    参考原文:原文 预备知识:向量的点积:  关于向量的知识这里不再赘述 分离轴定理(Separating Axis Theorem) 概念:通过判断任意两个 凸多边形 在任意角度下的投影是否均存在重叠, ...

最新文章

  1. centos mongodb安装及简单实例
  2. ERP与SCM之区别
  3. java流与文件——对象流和序列化
  4. AndroidStudio cmakelist找不到问题
  5. 蓝图解锁怎么用_[UE4蓝图][Materials]虚幻4中可互动的雪地材质完整实现(一)
  6. debian php安装pdo扩展,在debian下为PHP5.0.3安装pdo模块
  7. ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
  8. 红米手机 android 版本,#MIUI#关于红米手机4高配版 Android版本适配的说明【miui9吧】_百度贴吧...
  9. 例子---随机数/不重复的随机数
  10. 异常详细信息: System.UnauthorizedAccessException: 对路径的访问被拒绝。
  11. 67.二进制求和 (力扣leetcode) 博主可答疑该问题
  12. 魔百和盒子、中兴盒子、咪咕盒子、华为盒子、华为悦盒、烽火盒子、创维盒子、天邑盒子等运营商盒子固件合集分享
  13. netware显示没有首选服务器,NetWare下服务器配置几例
  14. BZOJ#4816. [Sdoi2017]数字表格
  15. 三国演义人物出场次数
  16. IDEA中一直indexing问题
  17. Hyperledger Fabric 2.0 官方文档中文版 第6章 教程(上)
  18. 大像素图像目标检测的解决方案
  19. 爱思考CISP证书适合哪些人学习?
  20. 安卓手机管理软件_安卓苹果手机电池使用久了该不该换

热门文章

  1. 前端——css 背景background
  2. 那些年薪百万的人都在靠什么赚钱?
  3. 将一个C类网络划分20个子网, 最适合的子网掩码是多少
  4. IPFS官方周报(第16期)
  5. LIRA: Learnable, Imperceptible and Robust Backdoor Attacks 论文笔记
  6. postgresql.conf superuser_reserved_connections
  7. android 闹钟时间选择,根据时间选择器设置闹钟android
  8. linux查找一个文件中abc字段命令,Linux查询命令整理(示例代码)
  9. Tensor的创建方法
  10. 手把手教你在夜神、雷电上搭frida+Xposed