//从原点开始,按逆时针顺序输出凸包上的每个点 #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 0 70 -50 60 30 -30 -50 80 20 50 -60 90 -20 -30 -40 -10 -60 90 10 */
输出凸包上的所有点
猜你喜欢
转载自blog.csdn.net/zizahn/article/details/52749944
今日推荐
周排行