View Code of Problem 1092

#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.


Back to problem 1092