凸包是正好包含所有点的凸边形,之所以叫凸包,是因为凸中包含了凸多边形包围起来的所有点
我们要写的是找出凸包的顶点集,使用分治算法
首先,连接最左端和最右端的两点。命名线上方的区域为上包,下方位下包,将两点加入到顶点集合
然后,找到与直线距离最远的两点,与第一步中的两点相连,划分为上包和下包,新找出的两点为新的顶点加入到顶点集合
在此之后,上包递归分为上下两个子包,下包地柜分为两个子包,知道包节点数小于等于1,每次递归都要将新的顶点加入到顶点集。
分治的思路是每一次递归找到一个顶点,把剩余的顶点交给子问题,有子包去解决
from math import sqrt
solution = [] # 顶点集
def convex_hull(points):
# 凸包算法
# 长度小于=3 三角形
if len(points) <= 3:
return points
# 声明全局变量
global solution
# x坐标排序
points.sort(key=lambda x: x[0])
# 左边最远值
left_most = points[0]
# 右边最远值
right_most = points[- 1]
# 将左边右边最远值分别加入到顶点集合的后面 extend拆分添加
solution.extend([left_most, right_most])
# 分治 True为上包 FALSE为下包
helper(points, left_most, right_most, True)
helper(points, left_most, right_most, False)
return solution
def helper(points, left_most, right_most, upBool):
"""
利用line_helper计算lef