凸包问题
问题描述:凸包(Convex Hull)是一个计算几何中的概念。在一个n维向量空间V中,对于给定集合X,所有包含X的凸集的交集S被称为X的凸包。在二维空间中,凸包可想象为一个刚好包含所有点的凸多边形,即对于任意的一个点,要么这个点在这个凸多边形上,要么在凸多边形内。凸包问题是给定平面上一堆点集,要求输出位于凸包上的点。这个问题有很多种算法,如穷举法,分治法,Gift-Wrapping算法,Melkman算法,Graham扫描法,这里先介绍前三种算法。
一、穷举法
穷举法比较简单,由两个步骤组成:
- 将点集中的点两两配对,每对点分别计算一条直线
- 对于每条直线,检查剩余的 n-2 个点是否在直线的同一侧,如果是,再检查是否有点在这条直线上但不在这条线段上,如果没有,则这两个点都在凸包上。
二、分治法
分治法的思想是把一个大问题分成几个结构相似的子问题,然后再把子问题再分成几个更小的子问题……。这样我们就能用递归的方法,分别求这些子问题的解。最后把每个子问题的解“组装”成原来问题的解。分治法解决凸包问题的基本思想是根据在凸包上的点不断划分点集。具体算法如下:
- 把所有的