Part One 求凸包
凸包的算法有很多种,我这里使用的是是Andrew那个凸包算法,就是先循环所有点求出下凸包,再逆向循环所有点定求出上凸包的那个算法。
时间复杂度为O(NlogN)一个java的Applet演示算法执行过程
Monotone Chain Convex Hull 算法伪代码:
输入:一个在平面上的点集P
点集 P 按 先x后y 的递增排序
声明两个栈:U,L
U - 上凸包
L - 下凸包
// 构建上凸包
for i = 1,2,3,4, .... n:
while U 中至少有两个点 and
U 中的栈首的两个点 与 P[i] 不为逆时针时:
U 出栈一次
P[i] 进入 U 栈
// 构建下凸包
for i=n,n-1,n-2, .... 1:
while L 中至少有两个点 and
L 中的栈首的两个点 与 P[i] 不为逆时针是:
L 出栈一次
P[i] 进入 L 栈
按顺序合并U L两个栈: U+L => H 则 集合H 为 点集P 的凸包点集合, 点的方向为逆时针
原文:
Input: a list P of points in the plane.
Sort the points of P by x-coordinate (in case of a tie, sort by y-coordinate).
Initialize U and L as empty lists.
The lists will hold the vertices of upper and lower hulls respectiv