Javis March算法

学堂在线课程《计算几何》

模板:

 Jarvis March算法算法的复杂度更准确的表示为O(nh)h又由最终输出结果,即凸包本身来决定,输出结果决定了构造过程的复杂度,这就是所谓的“输出敏感性”。这种类型的算法又被称为output sensitive algorithm。这种特性在其它凸包算法中也会体现

 1 struct Point{
 2     double x,y;
 3     bool extreme;
 4     int succ;
 5 }P[maxn];
 6 int ltl;
 7 
 8 bool Toleft(Point p, Point q, Point s){
 9     int area2 = p.x*q.y - p.y*q.x
10                 + q.x*s.y - q.y*s.x
11                 + s.x*p.y - s.y*p.x;
12     return area2>0;///左侧为真
13 }
14 
15 int LTL(Point P[], int n){///LTL:lowest-then-leftmost point,找到第一个极点
16     int ltl=0;
17     for(int k=1;k<n;k++){
18         if( P[k].y<P[ltl].y || (P[k].y==P[ltl].y && P[k].x<P[ltl].x)){
19             ltl=k;
20         }
21     }
22     return ltl;
23 }
24 
25 double dis(int i,int j){
26     double xx=P[i].x-P[j].x;
27     double yy=P[i].y-P[j].y;
28     return sqrt(xx*xx+yy*yy);
29 }
30 
31 void Jarvis(Point P[], int n){
32     for(int k=0;k<n; k++){
33         P[k].extreme = false;    ///首先将所有点标记为非极点
34     }
35     ltl=LTL(P,n);               ///找到tlt
36     int k=ltl;                  ///将tlt作为第一个极点
37     do{
38         P[k].extreme=true;      ///判定为极点
39         int s=-1;
40         
41         ///选取下一个极点,每次比较两个点s,t
42         ///做点t和有向边ks 的to_left_test,最终找到s
43         for(int t=0;t<n;t++){
44             ///除了k和s外每个点,如果t在s右边
45             if( t!=k && t!=s && (s==-1 || Toleft(P[k],P[s],P[t]))){
46                 s=t;
47             }
48         }
49         ///k点的后继为s
50         ///s变为下一次查找的起点
51         P[k].succ = s;
52         k=s;
53     }while(ltl!=k);
54 }

 

posted @ 2020-02-03 19:18  swsyya  阅读(489)  评论(0编辑  收藏  举报

回到顶部