首先,给出凸包的定义
1:集合S的凸包,$#(S),就是包含S的最小凸集。
2:将平面点集P的凸包定义为:顶点取自P,包含P中所有点的唯一凸多边形。
算法1:
Algorithm SolwConvexHull(P)
input 平面点集P.
Output 由 $#(S) 的顶点沿顺时针方向排列的队列$
1:E = 空集
2:For(每一有序对(p,q)属于P,p!=q)
3: do vaild = true
4: for (除p,q 外的所有点r属于P)
5: do if (r位于p ,q所确定的有向直线的左侧)
6: then vaild = false
7: if (vaild) then 将有向边pq 加入到E
8: 根据集合E中的各边,找出凸包的所有顶点,并按照顺时针方向将他们组织为列表$
复杂度分析:一共需要检查n^2 - n 对点,每一对点,要检查其他的n-2个点。时间复杂度为O(n^3) 哈哈,别想了,放弃吧。
算法二:
Algorithm ConvexHull(P)
Input 平面点集P
OutPut 由$(P)的所有顶点沿顺时针方向组成的一个列表
1: 根据x坐标,对所有点进行排序,得到序列p1,p2,p3..........pn,
2: 在$(upper)中加入P1和P2(P1在前)
3: for (i=3 to n)
4: do 在$(upper)中加入Pi
5: while ($(upper)中至少还有三个点,而且最末尾的三个点所构成的不是一个右拐)
6: do 将倒数第二个顶点从$(upper)中删除
7: 在$(lower)中加入Pn和Pn-1(Pn在前)
8: for(i=n-2 down to 1)
9: do 在$(lower)中加入Pi
10: while ($(lower)中至少还有三个点,而且最末尾的三个点所构成的不是一个右拐)
11: do 将倒数第二个顶点从$(lower)中删除
12:将第一个点和最后一个点从$(lower)中删除。(以免构成重复)
13:return $(upper)和$(lower)的连接
14:
15:
16:
posted on 2007-10-10 11:34 小锋 阅读(2861) 评论(0) 编辑 收藏 所属分类: algorithm