极角排序
所谓极角,指的就是以x轴正半轴为始边,逆时针转过的角,这个角的范围是[0,2π][0,2π]。
利用atan2函数
atan2(y,x),表示(x,y)这个点与原点连线,这条线与x轴正半轴的夹角,这里的这个极角的范围是[−π,π][−π,π]的,一二象限为正,三四象限为负。所以我们从小到大排完序后,实际上是第三象限→→第四象限→→第一象限→→第二象限。
struct node { int x, y; double angle; bool operator<(const node &a) const { return angle < a.angle; } } s[N]; int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i].x >> s[i].y
s[i].angle = atan2(s[i].y, s[i].x); } sort(s + 1, s + 1 + n);
叉积
已知两点坐标,通过叉积可以求得与原点所围成的三角形的有向面积。
(a.x*b.y−a.y*b.x)/2 即为该三角形面积,如果这个值是正的,说明b位于a的正方向,即逆时针方向(当然,这个角度小于π),反之,如果这个面积是负的,说明b位于a的负方向,即顺时针方向。
struct node { int x, y; } s[N];
bool cmp(node a,node b){ return a.x*b.y>b.x*a.y; }
int n; cin >> n; for (int i = 1; i <= n; i++) { cin >> s[i].x >> s[i].y; } sort(s + 1, s + 1 + n,cmp);