• 极角排序


    极角排序,指的是对于二维坐标中的点,当然也可以说是向量。极角排序的用途一般是预处理二维平面中的点,使之变得相对有序,接下来在有序的条件小用 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 }
  • 相关阅读:
    OutputCache详解
    C#数值类型的转换
    C#变量类型转换
    C#和.net
    数组
    mvc
    C#部分基础知识
    项目开发-->高级功能汇总
    项目开发-->基础功能汇总
    C#基础篇
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13768453.html
Copyright © 2020-2023  润新知