极角排序

所谓极角,指的就是以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.ya.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);
02-11 14:12