极角排序

方法一:使用角度排序

方法二:上下平面 + 叉积排序

相比第一种方法而言,这种方法的精度更高,因为不涉及浮点数之间的运算,也更加符合点的坐标都是整数的情况。

具体地来说,我们把向量分成两部分:

  1. 上半面:y>0y\gt 0 或者 y=0 and x0y=0 \texttt{ and } x\ge 0
  2. 下半面:y<0y\lt 0 或者 y=0 and x<0y=0 \texttt{ and } x\lt 0

对于每一个部分,我们用叉积判断向量 aa 是否在 bb 的逆时针位置,然后将排完序后的下半面向量与上半面向量直接 concat 起来.

叉积法极角排序
1
2
3
4
5
6
7
8
9
int is_neg(vect a) {
return (a.y < 0) || (a.y == 0 && a.x < 0);
}
// 这里的 cmp 函数表示,从 theta=0 转到 theta=2pi
bool cmp(vect a, vect b) {
int wa = is_neg(a), wb = is_neg(b);
if (wa != wb) return wa < wb;
else return a.cross(b) >= 0;
}