凸包(Convex Hull)是一个计算几何(图形学)中的概念。点集Q的凸包(convex hull)是指一个最小凸多边形,满足Q中的点或者在多边形边上或者在其内(也就是说:平面上有n个点p1,p2, ..., pn, 要求求出一个面积最小的凸多边形,使得这个多边形包含所有平面上的点。)
关于凸包求解,主要有两种算法:
- Graham scan (Graham扫描法),时间复杂度
O(nlogn)
- Gift wrapping (Jarvis march,Jarvis步进法),时间复杂度
O(nh)
最常用的是Graham scan方法,主要步骤如下:(伪代码) plaincopy
- GRAHAM-SCAN(Q)
- {
- 1. 取出所有点中y坐标最小的点作为初始点p0
- 2. 之后对于所有其他点,以p0为中心,点集中的所有点按关于p0的极角逆时针排序,形成p1,p2,..pn-1
- 3. push(p0,Stack)
- 4. push(p1,Stack)
- 5. push(P2,Stack)
- for(Point i: 3->n-1)
- {
- px = nexttoTop(Stack)
- py = Top(Stack)
- do while (如果(py->pi向量)相对于(px->py向量)是向右走的)
- pop(Stack)
- px = nextotTop(Stack)
- py = Top(Stack)
- push(pi, Stack);
- }
- return Stack; //最后Stack栈中保存了所有凸多边形的顶点集合
- }