Feng.Li's Java See

抓紧时间,大步向前。
随笔 - 95, 文章 - 4, 评论 - 58, 引用 - 0
数据加载中……

凸包的算法(伪代码)

           首先,给出凸包的定义
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 小锋 阅读(3634) 评论(0)  编辑  收藏 所属分类: algorithm