1、凸包问题应用举例
1.求点集中最大直径。
2.给定一个点集,求其面积最小的外接矩形。
...等等
3、Graham扫描法模板
typedef struct
{
double x,y;
}Point;
Point point[1001],stack[1001];
int n,top;
double l;
int Multi(Pointp0,Point p1,Point p2)
{
return ((p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y));
}
double Dis(Pointp1,Point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
int cmp(Pointa,Point b)
{
if(Multi(point[0],a,b)>0)return1;
if(Multi(point[0],a,b)<0)return0;
if(Dis(point[0],a)<Dis(point[0],b))
return 1;
return 0;
}
void Graham()
{
int i,k=0;
Point tmp;
for(i=1;i<n;i++)
if((point[i].y<point[k].y)||((point[i].y==point[k].y)&& (point[i].x < point[k].x)))
k=i;
tmp=point[0];
point[0]=point[k];
point[k]=tmp;
sort(point+1,point+n,cmp);
stack[0]=point[0];
stack[1]=point[1];
i=top=1;
while(i<n)
if(Multi(stack[top],stack[top-1],point[i])<0)//=0时共线点也入栈
stack[++top]=point[i++];
else
top--;
}