GJK算法

article/2025/9/25 0:26:03

转自:http://blog.sina.com.cn/s/blog_833d50630100xw1r.html


GJK算法最初用来求三维空间中凸多面体的距离(即最近距离),也因此经常用来做碰撞检测(距离是否为0)。后被推广到n维空间中求凸包之间的距离,此处用来求二维平面上2个凸多边形的距离。
    GJK算法首先要解决计算Minkowski和的问题。所谓Minkowski和,指A、B两个集合,令A+B={x+y,其中x属于A,y属于B}即二者的Minkowski和。类似的可以定义负集与Minkowski差。
    若A、B为凸多边形,顶点个数分别是n、m,则他们的Minkowski和一定是凸多边形且至多有n+m个顶点。

GJK算法


     左上为多边形A、B,假设黑点为原点,三个图分别表示-B、A+B与A-B。A、B之间的点对距离即||x - y||,其中x属于A,y属于B;而A、B之间的距离就是||x-y||的最小值。因此,A、B之间的距离就是其Minkowski差A-B中的最小元素,这个最小指的是模最小,实际上就是距离原点的距离。因此,2个凸多边形的距离转化为点到凸多边形的距离,点指的是原点,凸多边形指的是原题中的2个凸包的Minkowski差。

    Minkowski和的算法如下,将A、B的边按逆时针方向拆成向量(顺时针实际上也可以),如上图可以得到6个向量。将这些向量按极角排序,然后依次首尾相连即可得到凸包。该算法找自英文维基,感谢谷歌,感谢CCTV(关它P事)。

    上述算法只是得到了和的形状与相对位置(因为首尾相连时出发的基点是原点),实际上该凸包还需做一个平移才能得到正确的坐标。如果排序时极角是取0~360度范围(NOTE:不必显示的求出极角,用先象限后叉积的方法排序),则求出A、B各自的最下最左点,将其坐标相加作为出发的基点即可。

    求出Minkowski差之后(求差与求和本质是一样的),剩下的就是求点到凸多边形的距离,这个问题又转化为求点到边的距离。一个凸多边形有n条边,点到这n条边的距离的最小值就是点到凸多边形的距离。而且,点到边的距离是具有确定单调性的,因此运气好的话不需要求出所有边的距离,只需扫描到极小值即可。点到边的距离也就是点到线段的距离,利用叉积计算、点积进行判断,很容易求得。

    上述算法其实不是GJK算法,因为所求为凸多边形,而GJK算法可以用来求曲线凸包之间的距离(此情况下是一个数值逼近过程)。简单描述一下GJK的迭代过程,除了初始情况下,每一步迭代时均已求得凸包边缘上的3个点构成一个三角形Tk,然后求指定点p距离Tk最近的点,记作q,再将凸包投影到pq。qp方向上最远的投影点所对应的凸包上的点记作w,最后将Tk的3个点舍去1个,然后加上w形成新的Tk+1。最开始的3个点哪里来的?似乎可以随便选边缘上的3个点,最后应该可能也许大概一定可以迭代到结果,只是影响迭代次数而已。

    上述GJK算法来自《计算机图形学几何工具算法详解》中译本,此书的某些算法有问题,可能是翻译的问题。

   用GJK算法的Minkowski和可以解决POJ3608。凸多边形的距离也可以使用旋转卡壳法解决,但GJK算法应该更容易实现一些。



http://chatgpt.dhexx.cn/article/mOCmV7Ih.shtml

相关文章

碰撞检测GJK算法论文解析二

碰撞检测GJK算法论文解析二 The Theoretical Algorithm内容详解 初探The Distance Subalgorithm内容详解 Appendix Ⅱ涉及的概念内容详解 接上文,本篇文章讲解GJK算法论文的第四、第五部分前半部分,这是整个算法最为核心的部分。第四部分阐述了算法的核心…

碰撞检测GJK算法论文解析三

碰撞检测GJK算法论文解析三 再探Appendix Ⅱ内容详解 再探The Distance Subalgorithm内容详解过程1过程2过程3 这里要先纠正上篇文章的一些错误,就是上篇文章的最后其实并没有证明定理3,而只是给出了仿射集系数向量 λ \lambda λ的解的形式,…

GJK碰撞检测(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

物理引擎学习04-GJK计算多边形之间的最近距离

计算多边形之间的最近距离,才是GJK算法原本的目的。只有两个多边形不相交,计算最近距离才有效。如果相交,则最近距离无效,但是可以使用EPA算法要计算碰撞深度。本文的写作目的,主要是对GJK算法的理解和应用。对算法本身…

python碰撞检测算法_GJK碰撞检测算法

现实世界里我们对于是否碰撞的判断可以说极其容易而且准确,比如下图。在二进制的世界里,一切就没这么直观了。 GJK(Gilbert-Johnson-Keerthi Distance Algorithm) GJK 就是此次要实现的碰撞检测算法。如果对碰撞算法有过了解的话,大概率听过另一个碰撞检测算法 SAT(Separati…

【计算几何】凸多面体重叠判断算法:GJK 算法详解 C++代码实现二维情形的凸多边形重叠判断

文章目录 一、GJK 算法简介二、前置知识2.1 二维向量的点乘和叉乘2.2 三维向量叉乘2.3 凸多边形2.4 闵可夫斯基差2.5 单纯形2.6 Support 函数 三、GJK 算法讲解3.1 熟悉 GJK 算法流程3.1.1 多边形重叠的情形3.1.2 多边形不重叠的情形 3.2 总结 GJK 算法步骤3.3 讲解 GJK 算法细…

GJK 算法

GJK 算法(Gilbert–Johnson–Keerthi) 翻译自:http://www.dyn4j.org/2010/04/gjk-gilbert-johnson-keerthi/ 今天,我将讨论dyn4j项目随附的其他碰撞检测算法。您可以找到很多GJK文档,但是其中很多实际上是技术性的,主要是因为它…

碰撞检测算法之GJK算法

简介 参考: 碰撞检测算法之GJK算法 - 知乎 (zhihu.com) 运筹优化】凸多面体重叠判断算法:GJK 算法详解 & C代码实现二维情形的凸多边形重叠判断_c 凸多边形_WSKH0929的博客-CSDN博客 物理引擎学习03-GJK碰撞检测算法基础gjk算法游蓝海的博客-CSDN博客…

物理引擎学习05-GJK和EPA计算穿透向量

EPA,是扩展多边形算法(Epanding Polytop Algorithm) ,用来计算两个多边形碰撞的穿透深度和方向,可用于将两个发生碰撞的多边形分离。本文的写作目的,主要是对GJK和EPA算法的理解和应用。对算法本身感兴趣的朋友,可以阅…

物理引擎学习03-GJK碰撞检测算法基础

GJK是由Gilbert,Johnson,Keerthi 三位前辈发明的,用来计算两个凸多面体之间的碰撞检测,以及最近距离。GJK算法可以在O(MN)的时间复杂度内,检测出碰撞,算法在每次迭代的过程中,都会优先选择靠近原…

碰撞检测——GJK算法

目录 碰撞检测——GJK算法 1.GJK算法的原理及思想 1.1 Minkowski Sum(明可夫斯基和) 1.2 Simplex 1.3 support函数 1.4 构建Simplex 2. GJK算法步骤 3. GJK算法的优缺点分析 4. GJK算法与其他相关算法的比较分析 4.1 GJK算法和SAT算法的比较 …

QPM 之悬浮窗设置信息

QPM 开源地址:https://github.com/ZhuoKeTeam/QPM 更多实用信息: 手机的基本信息AndroidManifest.xml 信息App 中所有的 SharePreference 信息可配置的开关网络接口 手机基础信息 再也不用 去手机的复杂界面查看各种数据;再也不用 下载 辅…

QPM访谈问题

QPM:Quantitative Project Management,量化项目管理 一、访谈问题 1、请简要介绍贵司的QPM管理的管理方式? 依据公司整体商业目标和CMMI要求,制定和部署了《量化项目管理过程》和相关的指南、模板。 在项目执行中,…

QPM 性能监控组件——总篇

QPM (Quality Performance Monitor) 是一个质量性能监控组件,可以很方便的查看当前 App 的性能和常用数据。目前主要运行在 Android 平台上,通过集成 QPM 组件,可以在 App 中通过悬浮窗可视化相关实时数据。意在帮助广…

IDEA快捷键显示参数提示

一、IDEA显示参数的提示 1、理想状态是这样 2、某度了半天 都是让画show parameter 那个勾的,不是我想要的 IDEA默认的快捷键提示是 " ctrl p",但是我改成eclipse的快捷键后就没有提示了 File---->settings---->keymap 需要给ecli…

Idea设置代码自动提示快捷键

使用eclipse都习惯使用快捷键ALT/ 来代码自动提示,后来使用IntelliJ Idea这个快捷键并不管用,十分不便,这里记录如何使更改idea代码自动提示快捷键。 哪个是代码自动提示快捷键 File–》Settings–》KeyMap(快捷键ctrlalts)进入快捷键设置界…

IDEA提示方法参数的快捷键

在写Java方法的时候有时想让软件提示一下方法的参数,解决方法是将鼠标放置到方法括号里,按下ctrlp,即可显示方法参数

idea 设置代码提示快捷键

Settings->Keymap 搜索框内搜索 completion Main Menu-Code-Code Completion-Basic 设置成对应的快捷键,如 Alt/

IDEA的使用—常用快捷键

IDEA常用快捷键 具体详解视频见于(【零基础 快速学Java】韩顺平 零基础30天学会Java) 文章目录 前言一、IDEA快捷键是什么?二、IDEA快捷键的设置 1.快捷键12.快捷键23.快捷键3总结 前言 IDEA快捷键能够提升编程速度以及防止出现书写代码时的低…

idea快捷键设置(Idea常用快捷键大全)

目录 友情提醒第一章、IDEA常用快捷键1.1)快捷键:查找/提示类1.2)快捷键:修改代码类1.3)快捷键:光标移动类 第二章、Idea如何修改快捷键2.1)已知快捷键,通过搜索快捷键查找2.2&#…