1 Monotone Chain Convex Hull(单调链凸包)算法伪代码: 2 //输入:一个在平面上的点集P 3 //点集 P 按 先x后y 的递增排序 4 //m 表示共a[i=0...m]个点,ans为要求的点; 5 struct P 6 { 7 int x,y; 8 friend int operator < (P a, P b) 9 { 10 if((a.x<b.x) || (a.x==b.x && a.y<b.y)) 11 return 1; 12 return 0; 13 } 14 }a[m+10],ans[m+10]; 15 //判断第三点在这个直线的左侧还是右侧 16 //当judge(), 的返回值小于等于0,说明在右侧,我们一直要找在直线右侧的点 17 double judge(P a, P b,P c) 18 { 19 return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y); 20 } 21 //构建下凸包,从左跑到右,由下面通过 22 int k1=0; 23 for(int i=0; i<m; i++)//下凸包 24 { 25 while(k1>1 && judge(ans[k1-2],ans[k1-1],a[i])<=0) 26 { 27 k1--; 28 } 29 ans[k1++]=a[i]; 30 } 31 // 构建上凸包,从右到左,由上面通过 32 int k2=k1; 33 for(int i=m-1; i>=0; i--)//上凸包 34 { 35 while(k1>k2 && judge(ans[k1-2],ans[k1-1],a[i])<=0) 36 { 37 k1--; 38 } 39 ans[k1++]=a[i]; 40 } 41 k1--;//减去起点,因为起点进去了两次;
凸包题目:nyoj 78 圈水池 poj 1113 wall