zoukankan      html  css  js  c++  java
  • 极角排序

    极角排序,指的是对于二维坐标中的点,当然也可以说是向量。极角排序的用途一般是预处理二维平面中的点,使之变得相对有序,接下来在有序的条件小用 O(n) 或者 O(nlogn) 处理,而不是无序条件下的 O(n*n) 的枚举。

    在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向)。

    对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标。

    那么给定平面上的一些点,把它们按照一个选定的中心点排成顺(逆)时针。

    模板:

     1 #include<cstdio>
     2 #include<cmath>
     3 #include<algorithm>
     4 #include<iostream>
     5 
     6 using namespace std;
     7 
     8 struct point
     9 {
    10     int x,y;
    11 };
    12 
    13 const int maxn = 77;
    14 point poly[maxn];
    15 
    16 int cross(point p0,point p1,point p2) //计算叉积  p0p1 X p0p2
    17 {
    18     return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
    19 }
    20 
    21 double dis(point p1,point p2)  //计算 p1p2的 距离
    22 {
    23     return sqrt((double)(p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y));
    24 }
    25 
    26 bool cmp(point p1,point p2) //极角排序函数 , 角度相同则距离小的在前面
    27 {
    28     int tmp=cross(poly[0],p1,p2);
    29     if(tmp>0) return true;
    30     else if(tmp==0&&dis(poly[0],p1)<dis(poly[0],p2)) return true;
    31     else return false;
    32 }
    33 
    34 int main()
    35 {
    36     int cnt = 0;
    37     while (~scanf("%d%d", &poly[cnt].x, &poly[cnt].y)) cnt++;
    38     sort(poly, poly + cnt, cmp);
    39     for (int i = 0; i < cnt; i++)
    40         printf("(%d,%d)
    ", poly[i].x, poly[i].y);
    41 
    42     return 0;
    43 }
  • 相关阅读:
    事务传播机制,搞懂。
    洛谷 P1553 数字反转(升级版) 题解
    洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here 题解
    洛谷 P1055 ISBN号码 题解
    洛谷 P2141 珠心算测验 题解
    洛谷 P1047 校门外的树 题解
    洛谷 P1980 计数问题 题解
    洛谷 P1008 三连击 题解
    HDU 1013 题解
    HDU 1012 题解
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13768453.html
Copyright © 2011-2022 走看看