核心概述:给定三角形顶点 A、B、C,常数时间计算其外接圆的圆心与半径。

The circumcirle of a triangle is the circle intersecting all three vertices. ccRadius returns the radius of the circle going through points A, B and C and ccCenter returns the center of the same circle. Source: http://en.wikipedia.org/wiki/Circumcircle Status: tested

展开阐述:

  • 定义与背景

    • 外接圆(Circumcircle):通过三角形三顶点的唯一圆,圆心为外心,半径为外接半径。
    • 应用:026-几何-德劳内三角剖分/027-几何-快速德劳内的判定、三角网格质量评估、几何构造等。
    • 接口(据实现):
      • ccRadius(A,B,C) double:外接半径 R。
      • ccCenter(A,B,C) Point:外心 O。
  • 核心公式与实现要点

    • 设 a=|B−A|,b=|C−B|,c=|A−C|;向量 b⃗=C−A,c⃗=B−A。
    • 面积 S = |(B−A) × (C−A)| / 2,记有向面积 cross = (B−A) × (C−A)。
    • 半径:R = abc / (4S) = a·b·c / (2|cross|)(实现直接用距离与叉积)。
    • 圆心(外心):
      • O = A + ((b⃗·|c⃗|² − c⃗·|b⃗|²).perp()) / (2 · (b⃗ × c⃗))。
      • 其中 perp 表示向量顺时针旋转 90°,分母是有向面积标量,符号决定相对朝向。
    • 复杂度 O(1)。
  • 数值与边界条件

    • 退化:三点共线时 cross≈0,R 与 O 均不稳定(无外接圆)。应在调用前检查 |cross| 是否小于 eps。
    • 精度:double 足够大多数竞赛;近共线时误差放大,可考虑 long double。
    • 坐标尺度:大坐标或长整型差向量的平方会溢出整型,应在计算前转为浮点。
  • 实现细节与常见坑

    • 使用向量公式比解两条垂直平分线的交点更简洁、鲁棒。
    • 注意 perp 的方向一致性(实现中的顺/逆时针约定),避免分母符号误用。
    • 若仅需半径,可直接用 R 公式,避免计算外心。
  • 变体与扩展

    • 内切圆(Incenter)与旁切圆可用角平分线交点与面积公式类似得到。
    • 外接圆在三维推广对应唯一球体需 4 点不共面。
  • 正确性要点

    • 外心位于垂直平分线交点,公式来自解线性方程与向量恒等式。
    • R 公式等价于著名的 abc/4R = 2S。

关联节点