极角排序
Posted nublity
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了极角排序相关的知识,希望对你有一定的参考价值。
极角排序
所谓极角,指的就是以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);
以上是关于极角排序的主要内容,如果未能解决你的问题,请参考以下文章