输出凸包上的所有点

来源:互联网 发布:招java学徒是骗局吗 编辑:程序博客网 时间:2024/04/26 05:41
//从原点开始,按逆时针顺序输出凸包上的每个点#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>using namespace std;struct Point{int x,y;}s[1005];bool cmp(Point a,Point b){    if(a.y==b.y) return a.x<b.x;    else return a.y<b.y;}int cross(Point p1,Point p2,Point p3){    int tmp=(p2.x-p1.x)*(p3.y-p2.y)-(p3.x-p2.x)*(p2.y-p1.y);    if(tmp>=0) return 1;    else return -1;}int n,l,st[1005],ans[1005],tail,cnt;void Jarvis(){    sort(s,s+n,cmp);    tail=-1,cnt=0;    st[++tail]=0,st[++tail]=1;    for(int i=2;i<n;i++)    {        while(tail>0&&cross(s[st[tail-1]],s[st[tail]],s[i])<0)           tail--;        st[++tail]=i;    }    for(int i=0;i<=tail;i++)        ans[cnt++]=st[i];    tail=-1;    st[++tail]=n-1,st[++tail]=n-2;    for(int i=n-3;i>=0;i--)    {        while(tail>0&&cross(s[st[tail-1]],s[st[tail]],s[i])<0)            tail--;        st[++tail]=i;    }    for(int i=1;i<tail;i++) //1~tail-1避免重复        ans[cnt++]=st[i];}double dist(Point a,Point b){    double tmp=(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);    return sqrt(tmp);}int main(){    cin>>n;    for(int i=0;i<n;i++)        scanf("%d%d",&s[i].x,&s[i].y);    Jarvis();    cout<<endl;    int k;    for(k=0;k<cnt;k++)     if(!s[ans[k]].x&&!s[ans[k]].y)        break;    for(int i=k;i<cnt;i++)        cout<<s[ans[i]].x<<' '<<s[ans[i]].y<<endl;    for(int i=0;i<k;i++)        cout<<s[ans[i]].x<<' '<<s[ans[i]].y<<endl;    return 0;}/*0 070 -5060 30-30 -5080 2050 -6090 -20-30 -40-10 -6090 10*/

0 0