极角排序,指的是对于二维坐标中的点,当然也可以说是向量。极角排序的用途一般是预处理二维平面中的点,使之变得相对有序,接下来在有序的条件小用 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 }