Skip to content

算法Algorithm

方向判定

Orientation test

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

形式陈述 ​

固定通常的右手平面坐标,二维点 a,b,c 的方向由行列式的符号决定。把向量作为列,展开为

orient(a,b,c)=(bx−ax)(cy−ay)−(by−ay)(cx−ax).

正、负、零分别表示 c 位于有向直线 a→b 的左侧、右侧或线上;非零时也对应三点逆时针或顺时针排列。若 a=b,值恒为零,但此时两点并未定义一条唯一的直线,调用者需要单独处理重合端点。屏幕坐标若向下为正,视觉上的顺逆时针与这里的符号约定相反。

高维中可对 d+1 个点使用差向量组成的 d×d 行列式,或采用与其符号一致的增广坐标行列式;行列次序必须固定。输出是负、零、正三个离散结果,正确实现必须区分数学上的精确符号与浮点近似。

直觉

把 a 当作原点,向量 b−a 旋转到 c−a 的方向就是三点转向;二维叉积或行列式给出带符号面积,据其符号判断左转、右转或共线。该判定不依赖坐标原点,但方向符号还依赖已选坐标的定向。对仿射变换 F(x)=Lx+t,有 orient(Fa,Fb,Fc)=det⁡(L)orient(a,b,c);正行列式保号,负行列式翻号,奇异变换还可能把非零方向压成零。在几何算法中,许多“图形关系”最终都被还原为这一稳定谓词。符号正确比近似数值大小更重要,因为一个错误转向会改变凸包、相交或多边形拓扑。

例子与边界

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

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

det⁡(b−a,c−a)=1>0,

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

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

例如 a=(0,0),b=(M,M−1),c=(M+1,M),精确行列式为 M2−(M−1)(M+1)=1。两项各有约 M2 的大小,结果却只剩 1;坐标很大时,普通浮点乘积可能舍入成相同数。自适应精确谓词先用快速近似和已证明的误差界检查符号是否可信,只有无法确定时才增加精度;它不会把“近似算出零”直接认定为共线。

若整数坐标满足各分量绝对值不超过 M,差值绝对值至多 2M,两个乘积绝对值各至多 4M2,因而 8M2 是行列式绝对值的一个安全粗界。类型选择还须覆盖差值及乘法中间结果,不能只检查最终返回类型。

推论与应用

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

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

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

参考资料
  • Jonathan Richard Shewchuk,Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates,Discrete & Computational Geometry 18,1997,305–363,作者资料与实现:行列式符号、自适应精度与近退化输入。

  • 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。

关系图谱31 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

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