凸包
今天看了一下凸包,自己理解的也不是很深,在這裏說說自己的理解
如何求這個凸包呢
排序後應該是這樣
第一步 0 , 1 ,2入棧 第二步 1到3左轉,2出棧
第三步 1到4右轉,4入棧 最後遍歷完成,凸包形成
下面是代碼
struct node
{
long long x,y;
}q[51234],stack1[51234];
int n,top;
long long dist(node p1,node p2) //兩點距離的平方
{
return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y);
}
long long mult(node p1,node p2,node p0) //判斷是否左轉
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int cmp(node p1,node p2) //極角排序的比較函數
{
if(mult(p1,p2,q[0])>0)
return 1;
else if(mult(p1,p2,q[0])==0 && dist(p1,q[0])<dist(p2,q[0])) //相等的按距離近的
return 1;
return 0;
}
void Gramham()
{
int i,k=0;
for(i=0;i<n;i++)
{
if(q[i].y<q[k].y || (q[i].y==q[k].y && q[i].x<q[k].x)) //找y最小的點,y相等找x最小的點
k=i;
}
node tep;
tep=q[0];
q[0]=q[k];
q[k]=tep;
sort(q+1,q+n,cmp);
stack1[0]=q[0];
stack1[1]=q[1];
stack1[2]=q[2];
top=2;
for(i=3;i<n;i++)
{
while(top>1 && mult(q[i],stack1[top],stack1[top-1])>=0) //是否左轉,是繼續判斷,不是,就入棧
top--;
stack1[++top]=q[i];
}
}