1.凸包:
一:基于水平序的Andrew算法
步骤(1):把所有点按照从小到大排序(如果x相同,按照y从小到大排序),删除重复的点后得到序列p1,p2,p3...
(2) :然后把p1,p2放到凸包中
(3):从p3开始当新点在凸包前进方向的左边时继续,否则依次序删除最近加入凸包的点,直到新点在左边。
int ConvexHull(Point *p,int n,Point *ch)
{
sort(p,p+n);
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;
}