一般有两种算法来计算平面上给定n个点的凸包:Graham扫描法(Graham"s scan),时间复杂度为O(nlgn);Jarvis步进法(Jarvis march),时间复杂度为O(nh),其中h为凸包顶点的个数。这两种算法都按逆时针方向输出凸包顶点。
Graham扫描法
用一个栈来解决凸包问题,点集Q中每个点都会进栈一次,不符合条件的点会被弹出,算法终止时,栈中的点就是凸包的顶点(逆时针顺序在边界上)。
算法步骤如下图:
import sys
import math
import time
import random
#获取基准点的下标,基准点是p[k]
def get_leftbottompoint(p):
k = 0
for i in range(1, len(p)):
if p[i][1] < p[k][1] or (p[i][1] == p[k][1] and p[i][0] < p[k][0]):
k = i
return k
#叉乘计算方法
def multiply(p1, p2, p0):
return (p1[0] - p0[0]) * (p2[1] - p0[1]) - (p2[0] - p0[0]) * (p1[1] - p0[1])
#获取极角,通过求反正切得出,考虑pi/2的情况
def get_arc