Appearance
极坐标系
- 极点:O
- 极轴:
- 极径:
- 极角:
- 极坐标:
对于非零向量
但该等式不能唯一确定
极角排序
排序范围小于
若所有非零向量的极角都位于同一个长度严格小于
完整一周的排序
使用 atan2
对非零向量使用 atan2(y,x) 计算极角,其值域为
atan2 的主要优势是同时利用 atan(y/x) “精度更高”。它仍是浮点运算,会受到舍入误差影响;但它不需要先计算
使用半平面和叉积
可以先划分半平面,再在同一半平面内比较叉积。例如约定从
cpp
struct Point {
long long x, y;
};
using i128 = __int128_t;
bool zero(const Point &a) {
return a.x == 0 && a.y == 0;
}
int half(const Point &a) {
return a.y < 0 || (a.y == 0 && a.x < 0);
}
i128 cross(const Point &a, const Point &b) {
return (i128)a.x * b.y - (i128)a.y * b.x;
}
i128 len2(const Point &a) {
return (i128)a.x * a.x + (i128)a.y * a.y;
}
bool cmp(const Point &a, const Point &b) {
if (zero(a) != zero(b))
return zero(a);
if (zero(a))
return false;
if (half(a) != half(b))
return half(a) < half(b);
i128 c = cross(a, b);
if (c != 0)
return c > 0;
return len2(a) < len2(b);
}在中间量不溢出的精确整数运算下,该比较器满足严格弱序。若不关心同方向向量的长度次序,也可以在叉积为 false,将它们视为等价;若后续算法需要确定顺序,则保留模长这一 tie-break。对于浮点坐标,叉积同样会有舍入误差,并非“无精度损失”;也不应直接在排序比较器中用可能破坏传递性的 eps 判等。
时间复杂度:
