struct point { double x,y,angel; } p[N],stack[N]; int top,n; double dis(point a,point b)//求距离 { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } bool mult(point p1,point p2,point p0)//叉乘 { return (p1.x-p0.x)*(p2.y-p0.y) >= (p2.x-p0.x)*(p1.y-p0.y); } bool cmp(point a,point b) { if(a.angel == b.angel) { if (a.x == b.x) return a.y > b.y; return a.x > b.x; } return a.angel < b.angel; } void graham() { //p为点集,n为点的个数,stack为凸包点集,top为凸包个数 int i,k=0; point temp; for(i=0; i<n; i++) if(p[i].y<p[k].y||((p[i].y==p[k].y)&&(p[i].x<p[k].x))) k=i; temp=p[0]; p[0]=p[k]; p[k]=temp; for(i=1; i<n; i++) p[i].angel=atan2(p[i].y-p[0].y,p[i].x-p[0].x); sort(p+1,p+n,cmp); stack[0]=p[0]; stack[1]=p[1]; stack[2]=p[2]; top=3; for(i=3; i<n; i++) { while(top > 2 && mult(stack[top-2],stack[top-1],p[i])<=0) top--; stack[top++]=p[i]; } }
原文:http://www.cnblogs.com/lxm940130740/p/3899440.html