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 }