单调链凸包

来源:互联网 发布:linux ln s 编辑:程序博客网 时间:2024/05/22 01:45
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--;//减去起点,因为起点进去了两次;
转:http://www.faceye.net/search/118355.html
0 0
原创粉丝点击