http://acm.pku.edu.cn/JudgeOnline/problem?id=2007
#include <cmath>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
typedef double TYPE;
//空间中的点,可以用来作为二维点来用
struct POINT {/*验证*/
TYPE x; TYPE y; TYPE z;
POINT() : x(0), y(0), z(0) {};
POINT(TYPE _x_, TYPE _y_, TYPE _z_ = 0)
: x(_x_), y(_y_), z(_z_) {};
//要用 G++ 提交 ,可以不用这个
POINT operator =(const POINT &A){
x = A.x;
y = A.y;
z = A.z;
}
};
// cross product of (o->a) and (o->b)
// 判断o->a 在 o->b 的哪边,如果在 o->b 的左边则为负数,在右边则为正数
// 叉乘
TYPE Cross(const POINT & a, const POINT & b, const POINT & o) {/*验证*/
return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
}
// planar points' distance
// 两个点的距离
TYPE Distance(const POINT & a, const POINT & b) { /*验证*/
return
sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y)
* (a.y - b.y) + (a.z - b.z) * (a.z - b.z));
}
/*//极角排序
顾名思义,极角排序一般就是有一个圆心的问题,将平面上各个点按照与圆心极角进行排序。
然后就可以在线性扫描之中解决一些统计问题。不过这类问题就稍稍超出计算几何范畴了。
*/
//按照极角进行 进行排序的比较函数
// BasalPoint 为基点,a,b为要比较的点
POINT _BasalPoint;//因为用于sort 的比较函数没有重载3个参数的
bool CmpByAngle(const POINT& a,const POINT& b)
{
TYPE res = Cross(a,b,_BasalPoint);
if(res > 0)
return true;
else if(res < 0)
return false;
else
{
TYPE dis1 = Distance(a,_BasalPoint);
TYPE dis2 = Distance(b,_BasalPoint);
if(dis1 < dis2)
return true;
else
return false;
}
}
int main(){
POINT p;
vector<POINT> v;
// int i=0;
while(~scanf("%lf%lf",&p.x,&p.y)){
v.push_back(p);
}
_BasalPoint=v[0];
sort(v.begin(),v.end(),CmpByAngle);
for(int i=0;i<v.size();i++){
cout<<'('<<v[i].x<<','<<v[i].y<<')'<<endl;
}
//system("pause");
return 0;
}