POJ2007 Scrambled Polygon
http://poj.org/problem?id=2007
题意
乱序给出凸多边形的顶点坐标,要求按逆时针顺序输出各顶点,给出的第一个点一定是(0,0),没有其他点在坐标轴上,没有三点共线的情况。
输入
每行两个数表示一个点的二维坐标,输入至文件结束。
输出
逆时针顺序输出各顶点。
样例输入
0 0
70 -50
60 30
-30 -50
80 20
50 -60
90 -20
-30 -40
-10 -60
90 10
样例输出
(0,0)
(-30,-40)
(-30,-50)
(-10,-60)
(50,-60)
(70,-50)
(90,-20)
(90,10)
(80,20)
(60,30)
分析
利用叉积进行排序。
C++程序
#include<iostream>
#include<algorithm>
using namespace std;
const double EPS=1e-6;
struct Point{
double x,y;
Point(){}
Point(double x,double y):x(x),y(y){}
};
//判断x的符号
int symbol(double x)
{
if(x<-EPS)
return -1;
else if(x>EPS)
return 1;
else
return 0;
}
//向量减法
Point operator -(Point p,Point q)
{
return Point(p.x-q.x,p.y-q.y);
}
//叉积
double operator ^(Point p,Point q)
{
return p.x*q.y-p.y*q.x;
}
//叉积排序
bool cmp(Point p,Point q)
{
Point s(0,0);
double v=(p-s)^(q-s);
if(symbol(v)==1) //结果为正数表示向量sq在向量sp的左边,sp则排在前面,返回true
return true;
return false;
}
int main()
{
Point p[55];
int x,y,n=0;
while(~scanf("%lf%lf",&p[n].x,&p[n].y)) n++;
sort(p+1,p+n,cmp);
printf("(0,0)\n");
for(int i=1;i<n;i++)
printf("(%.lf,%.lf)\n",p[i].x,p[i].y);
return 0;
}