Skip to content

内接圆判定

In-circle test · Incircle predicate · In-sphere predicate in 2D

用带方向的行列式判定一点位于三点外接圆内、圆上还是圆外。

形式陈述

给定平面点

a=(ax,ay), b=(bx,by), c=(cx,cy), d=(dx,dy),

定义

InCircle(a,b,c,d)=det(axayax2+ay21bxbybx2+by21cxcycx2+cy21dxdydx2+dy21).

a,b,c 逆时针且不共线,则:

  • 行列式 >0d 在三点外接圆内;
  • 行列式 =0:四点共圆;
  • 行列式 <0d 在圆外。

a,b,c 顺时针,符号整体反转。因此实际接口应先核对 orient(a,b,c),或返回二者符号乘积

sign(orient(a,b,c))sign(InCircle(a,b,c,d)).

把坐标先平移到 d 可得到数值更紧凑的 3×3 行列式,但判定完全相同。

直觉

提升映射

(x,y)(x,y,x2+y2)

把平面点送到抛物面。前三点决定的圆对应提升空间中的一个平面;第四点位于圆内还是圆外,转化为其提升点位于该平面的哪一侧。行列式同时计算这个有向侧别。

方向条件不能省略:交换 a,b 会改变行列式符号,却不会改变几何圆。只有把圆判定与三角形方向绑定,符号才有固定语义。

例子与边界

a=(0,0), b=(1,0), c=(0,1).

三点逆时针,其外接圆圆心为 (1/2,1/2)。点 d=(1/2,1/2) 在圆内,点 (1,1) 在圆上,而 (2,2) 在圆外,对应行列式正、零、负。

浮点直接求行列式在近共圆输入上可能因消去误判符号。几何算法需要的是谓词符号,而不是近似行列式数值;可使用整数扩展精度、自适应精确算术或 symbolic perturbation。四点共圆时 Delaunay 对角线不唯一,算法必须规定一致的退化处理。

推论与应用

内接圆行列式在四点近共圆时会发生严重消去,符号必须由精确几何计算或可靠自适应谓词确定。用普通浮点结果的接近零值直接决定 Delaunay 翻边会破坏组合一致性。

Delaunay 三角剖分的局部空圆条件用该谓词判断是否翻转一条边。增量构造在定位包含新点的三角形后,反复检查相邻三角形的外接圆。

方向判定回答三点位于直线哪一侧;内接圆判定回答第四点相对圆的位置。二者都是鲁棒计算几何的基础谓词,但矩阵维度、几何退化与符号约定不同。

参考资料
  • Jonathan Richard Shewchuk, “Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates,” Discrete & Computational Geometry 18, 1997.
  • Mark de Berg et al., Computational Geometry: Algorithms and Applications, 3rd ed., Springer, 2008, Chapter 9.
  • Steven Fortune, “Numerical Stability of Algorithms for 2D Delaunay Triangulations,” International Journal of Computational Geometry & Applications 5(1–2), 1995.