求凸包—— graham_scan算法
先按Y-X排序,在按对p0的极角排序,然后进行扫描
Point stk[maxn]; int top; bool cmpYX(const Point A,const Point B)//按Y-X排序 { if(A.y<B.y) return true; if(A.y==B.y){ return A.x<=B.x; } return false; } bool cmp(const Point A,const Point B)//按极角排序 { return (A-p[0])*(B-p[0])>EPS; } void graham_scan() { sort(p,p+N,cmpYX); sort(p+1,p+N,cmp); top=0;//用数组模拟栈 stk[top++]=p[0]; stk[top++]=p[1]; for(int i=2;i<N;i++){ if((stk[top-1]-stk[top-2])*(p[i]-stk[top-1])<-EPS){ top--; stk[top++]=p[i]; } else stk[top++]=p[i]; } }
时间: 2024-10-23 13:35:39