#include<stdio.h> #include<stdlib.h> #define eps 1e-8 struct point{ double x,y; }p[53],temp,first; double myabs(double x){ return x<0?-x:x; } double mult(struct point p1,struct point p2,struct point p3) { return (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x); } double dis(struct point p1,struct point p2) { return (p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y); } int cmp(const void *a,const void *b) { struct point c=*(struct point *)a; struct point d=*(struct point *)b; double temp=mult(p[0],c,d); if(temp<0||(myabs(temp)<eps&&dis(c,p[0])>dis(d,p[0]))) return 1; return -1; } int main() { int n=0,i,j,k; while(scanf("%lf%lf",&p[n].x,&p[n].y)>0) n++; first=p[0]; for(i=1;i<n;i++) { if(p[i].y<p[0].y||(p[i].y-p[0].y<eps&&p[i].x>p[0].x)) temp=p[i],p[i]=p[0],p[0]=temp; } qsort(p+1,n-1,sizeof(p[0]),cmp); for(i=0;i<n;i++) { if(myabs(first.x-p[i].x)<eps&&myabs(first.y-p[i].y)<eps) break; } for(j=i,k=0;k<n;j=(j+1)%n,k++) { printf("(%.0lf,%.0lf)\n",p[j].x,p[j].y); } return 0; } |
Double click to view unformatted code.