基于 Graham-Scan 的凸包求解算法是在枚举三角形时,采用了更精细的方式,将P_0作为极点,通过极角大小定位最右下侧的三角形∆P_0 P_1 P_2,然后让三角形绕P_0点旋转,扫描所有输入点,直到到最左下侧为止。
首先要对点集S进行预处理,选纵坐标最小的点作为P_0,其余点在以P_0为极点、水平方向为极轴的极坐标系下按极角从小到大排序。
Graham-Scan 算法的伪代码如下:
Graham-Scan(S):
输入:平面n个点的集合S,经预处理后存储于P[0:m]
输出:S的凸包Q
If m<=1
Then 返回“凸包为空”
将P[0]、P[1]、P[2]依次压入栈Q
For i=3 To n-1 Do
While Top(Q) ∈∆P[0]P[i]NextToTop(Q) Do
Pop(Q)
Push(Q,P[i])
随机点集S生成部分与蛮力算法相同
对点集S的预处理中,使用冒泡排序来比较两点极角大小,并将极角由小到大排序,在两点的极角相等时,保留距离P_0最远的点,删除另一个点。实现代码如下所示:
#冒泡排序来比较极角大小,将极角由小到大排序
def bubble_sort(array,p0,temp):
for i in range(len(array)-1):
#current_status是用来判断冒泡是否结束
current_status =