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个顶点。

左上为多边形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个向量。将这些向量按极角排序,然后依次首尾相连即可得到凸包。该算法找自英文维基,感谢谷歌。
    上述算法只是得到了和的形状与相对位置(因为首尾相连时出发的基点是原点),实际上该凸包还需做一个平移才能得到正确的坐标。如果排序时极角是取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算法应该更容易实现一些。

GJK算法求凸多边形之间的距离相关推荐

  1. C++第一次实验-求两点之间的距离

    一.问题及代码 /* 文件名称:Test4.cpp * 作 者:胡嘉威 * 完成日期: 2017 年 2 月 28 日 * 版 本 号:v1.0 * 对任务及求解方法的描述部分:输入两个点的坐标,求两 ...

  2. 求两点之间的距离(C++语言)

    求两点之间的距离 两种思路: 第一种: 直接利用四个坐标值进行计算. 第二种: 利用结构体描绘坐标,实现对坐标的抽象描述. 此处两个函数同名,但其函数的参数不同,即函数的函数签名不同,是C++特有的函 ...

  3. C语言 求两点之间线段距离

    求两点之间线段位置 函数求距离方法 #include <stdio.h> #include<math.h> double square(); int main() {print ...

  4. 平行线判断函数+求平行线之间的距离

    struct LINE {CvPoint pt0;CvPoint pt1;LINE( CvPoint pta, CvPoint ptb ){pt0 = pta;pt1 = ptb;}LINE(){pt ...

  5. Python算法--求1-100之间所有的偶数和奇数

    i = 1 sum1 = 0 sum2 = 0 while i <= 100:if i % 2 == 0:sum1 += ielse:sum2 += ii +=1 print("1-1 ...

  6. 【C】编一程序。求两点之间的距离,已知直角坐标系中求两点(x1,y1),(x2,y2)之间的距离。

    int main() {int x1,x2,y1,y2,d;printf("请输入1坐标(x1,y1):");scanf("%d%d",&x1,& ...

  7. python中求两点之间的距离_python – 列表中两点之间的距离公式

    我需要创建一个列表,找到最接近的两个点,然后打印出来.如何比较列表中的每个点? 没有任何需要绘制或任何东西,只是比较点,找到列表中最接近的两个. import math # 'math' needed ...

  8. python求多叉树任意两点之间的距离

    对于多叉树求两点之间的距离,最难的地方在于有没有思路,如何找到指定点的位置,以及如何去计算两个指定点之间的距离,下图是一个简单的的多叉树,从5到1的距离为2,从5到7的距离为4. 我们可以将求解两点之 ...

  9. 7-1 求两点之间距离

    定义一个Point类,有两个数据成员:x和y, 分别代表x坐标和y坐标,并有若干成员函数. 定义一个函数Distance(), 用于求两点之间的距离. 输入格式: 输入有两行: 第一行是第一个点的x坐 ...

最新文章

  1. 64位Ubuntu上编译32位程序
  2. 选择排序算法流程图_C#实现——十大排序算法之选择排序
  3. jquery总结_代码收藏
  4. JAVA学习--面向对象的特征二:继承性
  5. 计算机组成原理AB什么运算,2010~2011学年武汉大学计算机组成原理AB类AB卷及答案...
  6. 点广告才可以下载的代码
  7. 51nod 1046 A^B Mod C
  8. 【BZOJ3328】PYXFIB 数论+矩阵乘法
  9. MAC下的环境变量配置
  10. 【289天】每日项目总结系列027(2017.11.21)
  11. 使用Jersey创建RESTful服务
  12. 市场上主要的PB系统提供商简介
  13. fragstats移动窗口
  14. 企业云计算运营模式,主要分为哪3种运营模式?
  15. Windows MSDOS的批处理文件命令
  16. seo优化如何写出高质量的文章
  17. 信用飞疑似信息泄露致用户被骗近4万元,平台借款利率高达75%
  18. 活动(已结束)--我们是冠军,啊呸,我们是CSDN VIP
  19. Unity3D 光照系统(一)
  20. 一个女测试工程师的成长之路

热门文章

  1. java反序列化漏洞挖掘
  2. 亚马逊选品有什么技巧?品选对了可以带来什么好处?
  3. 湖南科技学院C语言答案,湖南科技大学C语言期末考试习题库.doc
  4. CentOS7下无界面使用Selenium+chromedriver进行自动化测试
  5. 前端开发的五种设计模式
  6. 022:vue+openlayers加载中国边界JSON数据(代码示例)
  7. c#自定义Pen、Brush颜色
  8. angularjs框架_为什么AngularJS是我首选的软件开发框架
  9. matlab血管图像增强算法,基于Hessian特征的视网膜血管图像的增强滤波算法
  10. PCB的板芯材料种类介绍与PCB的分类