浅学计算几何
极角排序
精度差较大的做法:使用 \(atan2(y, x)\)(直接返回向量 \(\vec{a}(x, y)\) 与 \(\vec{0}\) 的夹角大小) 的大小排序。
面对整数不会丢失精度的做法:
我们知道对于同一半平面的向量 \(\vec{a}, \vec{b}\),\(\sin<\vec{a}, \vec{b}>=\frac{\vec{a}\times\vec{b}}{|\vec{a}||\vec{b}|}\),由于保证了 \(<\vec{a}, \vec{b}> \in [0, \pi]\),我们珂以直接判断 \(\sin\) 正负性就珂以判断 \(\vec{a}, \vec{b}\) 的大小(正就是 \(\vec{a}\) 要逆时针翻到 \(\vec{b}\),即极角较小,否则相反)。
直接计算叉乘正负性就珂以了,因为分母不影响。
例题:CF598C
解法:极角排序完后,现欲比较角的大小。
我们将两个角旋回到 \(x(0, +\infty)\) 上,这样右边成了向量极角比较。
考虑一组角向量 \(<\vec{a}, \vec{b}>\) 旋转到 \(x(0, +\infty)\) 上变成了 \(<|\vec{a}|\cos \theta, |\vec{a}|\sin \theta>=<\frac{\vec{a} \cdot \vec{b}}{|\vec{b}|}, \frac{\vec{a} \times\vec{b}}{|\vec{b}|}>\),放缩 \(|\vec{b}|\) 后就消除了分数。