极角排序

极角排序,指的是对于二维坐标中的点,当然也可以说是向量。极角排序的用途一般是预处理二维平面中的点,使之变得相对有序,接下来在有序的条件小用 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 }
原文地址:https://www.cnblogs.com/wsy107316/p/13768453.html