Skip to content

方向判定

Orientation test

用二维或高维行列式符号判断点组转向或仿射定向的基本谓词。

条目类型
算法

形式陈述

二维点 a,b,c 的方向由行列式 orient(a,b,c)=det(ba,ca) 的符号决定:正、负、零分别表示逆时针、顺时针和共线。高维中,对 d+1 个点使用增广坐标行列式判定仿射定向。谓词本身是组合算法的基础,正确实现必须区分数学上的精确符号与浮点近似。

直觉

a 当作原点,向量 ba 旋转到 ca 的方向就是三点转向;二维叉积或行列式给出带符号面积,据其符号判断左转、右转或共线。该判定只依赖点的仿射相对位置,不依赖坐标原点;在几何算法中,许多“图形关系”最终都被还原为这一稳定谓词。符号正确比近似数值大小更重要,因为一个错误转向会改变凸包、相交或多边形拓扑。

例子与边界

(0,0),(1,0),(0,1) 的值为 1,故左转;交换后两点符号反转。凸包算法用它弹出造成错误转向的栈顶点。整数坐标时可用足够宽的整数计算,但乘法仍可能溢出;固定 epsilon 不能在所有尺度下可靠区分零与非零。

a=(0,0),b=(1,0),c=(1,1),行列式

det(ba,ca)=1>0,

abc 为逆时针左转;把 c 换成 (1,1) 得负值,三点 (0,0),(1,1),(2,2) 得零。

共线只说明落在同一直线上,不说明 c 位于线段 ab 内,还需坐标范围判断。大整数乘法可能溢出;浮点行列式在近共线输入上会由两个接近的乘积相减,消去误差可能翻转本应可靠的符号。固定 epsilon 又不随坐标尺度变化,因此不能统一代表“足够接近零”;实现仍应按输入范围扩大整数类型,或采用精确、可自适应提高精度的符号判定。

推论与应用

内接圆判定把三点方向与第四点相对外接圆的位置结合起来;二者常共同作为 Delaunay 构造的鲁棒几何谓词,但不能互相替代。

行列式给出代数公式,仿射空间解释平移不变性。方向符号驱动凸包与扫描线中的线段次序;点在多边形内判定用它识别边界和横截。Delaunay 三角剖分还要把 orientation 与 in-circle 谓词的符号约定配套,否则同一退化点集可能得到不一致拓扑。

随机增量构造会按随机顺序插入几何对象,并用这些精确谓词维护冲突关系;其期望复杂度来自排列随机性,不能由单次 orientation 的常数算术成本直接推出。若坐标是有界整数且中间乘积装得下机器字,符号判定可视为最坏 O(1);任意精度整数或自适应精度浮点实现则要把位复杂度计入。输出敏感算法还需另报输出规模 k,而方向谓词本身没有“输出敏感时间”这一接口。

参考资料
  • Mark de Berg et al., Computational Geometry: Algorithms and Applications, 3rd ed., Springer, 2008,Chs. 1–7。
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Parts I–VI。
关系图谱15 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系