您的位置:首页 > 其它

凸包(极角序)模板

2016-02-16 11:01 274 查看
#include<cstdio>
#include<iostream>
#include<cmath>
#define INF 1000000000
using namespace std;
struct Point{
double x,y;
}p[100005],st[100005];
int n,top;
double multiply(Point sp,Point ep,Point op){
return (sp.x-op.x)*(ep.y-op.y)-(ep.x-op.x)*(sp.y-op.y);
}
double dist(Point sp,Point op){
return sqrt((sp.x-op.x)*(sp.x-op.x)+(sp.y-op.y)*(sp.y-op.y));
}
bool cmp(const Point &a,const Point &b){
double tmp=multiply(a,b,p[0]);
return !(tmp<0||tmp==0&&dist(a,p[0])>dist(b,p[0]));
}
int main(){
freopen("convex.in","r",stdin);
freopen("convex.out","w",stdout);
cin>>n;
int i,mini;
double minx=INF,miny=INF;
for(i=1;i<=n;i++){
scanf("%lf %lf",&p[i].x,&p[i].y);
if(p[i].y<miny||p[i].y==miny&&p[i].x<minx){
minx=p[i].x;
miny=p[i].y;
mini=i;
}
}
p[0]=p[mini];
p[mini]=p[n--];
sort(p+1,p+n+1,cmp);/*
for(i=0;i<=n;i++)
printf("%.2lf %.2lf\n",p[i].x,p[i].y);*/
st[1]=p[0];
st[2]=p[1];
top=2;
for(i=2;i<=n;i++){
double tmp=multiply(st[top],p[i],st[top-1]);
while(tmp<=0&&top>=2){
top--;
if(top>=2)tmp=multiply(st[top],p[i],st[top-1]);
}
st[++top]=p[i];
}
for(i=1;i<=top;i++)
printf("%.0lf %.0lf\n",st[i].x,st[i].y);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: