凸包问题(模板)

来源:互联网 发布:linux bash alias 编辑:程序博客网 时间:2024/05/29 11:10

Andrew算法模板:

具体实现:
1.把所有点按照x从小到大进行排序 (x同则y用y进行排序)
2.删除重复序列后得到序列p1,p2.。。,
3.让后把p1 p2放入凸包中 从p3开始。当新点在凸包“前进”方向的左边时继续,否则依此删除最近加入凸包的点 直到新点在左边
这个算法你可以理解为逆时针画圆 每次半个圆

int Cross(point A,point B)//叉积  {      return A.x*B.y-A.y*B.x;  }  int cmp(point A,point B)  {      return A.x==B.x ? A.y<B.y : A.x<B.x;  }  int ConvexHull(point *p,int n,point *ch)//Andrew  {      int m = 0;      for(int i = 0;i < n;i++)      {          while(m>1&&Cross(ch[m-1] - ch[m-2],p[i]-ch[m-2]) <= 0) m--; //如果发现更好的点把之前凸包内的点吐出           ch[m++] = p[i];      }      int k = m;      for(int i=n-2;i >= 0;i--)      {          while(m > k&&Cross(ch[m-1]-ch[m-2],p[i]-ch[m-2]) <= 0) m--;          ch[m++] = p[i];      }      if(n>1)          m--;        return m;  }  
0 0
原创粉丝点击