Hotdry.

Article

庞加莱圆盘双曲测地线计算与距离度量实现

从数学公式到工程实现,详解庞加莱圆盘模型中双曲距离计算、测地线绘制算法及莫比乌斯变换的数值稳定性处理。

2026-06-07visualization

在可视化层级结构或大规模图数据时,双曲几何提供的指数级空间扩张特性使其成为优于欧几里得平面的选择。庞加莱圆盘模型(Poincaré Disk Model)作为双曲平面的标准表示,将无限空间压缩到单位圆盘内,同时保持角度不变(共形映射)。本文从工程实现角度,拆解该模型中的核心计算问题:双曲距离度量、测地线绘制以及莫比乌斯变换的数值处理。

双曲距离公式的数值实现

庞加莱圆盘模型定义在单位开圆盘 $\mathbb {D} = {z \in \mathbb {C} : |z| < 1}$ 上。对于圆盘内两点 $x$ 和 $y$,其双曲距离由以下公式给出:

$$d(x, y) = \text{arccosh}\left(1 + \frac{2|x - y|^2}{(1 - |x|^2)(1 - |y|^2)}\right)$$

该公式源自双曲度量的线元 $ds^2 = \frac {4|dz|^2}{(1 - |z|^2)^2}$ 的积分结果。当其中一个点位于原点时,公式简化为 $d (0, x) = 2 \cdot \text {artanh}(|x|)$,计算效率更高。

在 JavaScript 实现中,需警惕浮点数精度陷阱。当点接近单位圆边界时,$1 - |x|^2$ 趋近于零,分母极小导致数值不稳定。工程上应设置精度阈值,例如定义 EPSILON = 1e-10,当 $|x| > 1 - \text {EPSILON}$ 时将该点视为 "无穷远" 处理。hyperbolic-canvas 库采用 INFINITYZERO 两个可配置常量替代原生 Infinity0,允许开发者根据场景调整精度与稳定性的权衡。

// 双曲距离计算实现
function hyperbolicDistance(p, q) {
  const normP = Math.sqrt(p.x * p.x + p.y * p.y);
  const normQ = Math.sqrt(q.x * q.x + q.y * q.y);
  
  // 边界检查
  if (normP >= 1 - EPSILON || normQ >= 1 - EPSILON) {
    return INFINITY;
  }
  
  const dx = p.x - q.x;
  const dy = p.y - q.y;
  const euclideanDistSq = dx * dx + dy * dy;
  
  const numerator = 2 * euclideanDistSq;
  const denominator = (1 - normP * normP) * (1 - normQ * normQ);
  
  return Math.acosh(1 + numerator / denominator);
}

测地线绘制算法

双曲测地线在庞加莱圆盘中有两种几何表现:过原点的直径(当两点与原点共线时),或与单位圆正交的圆弧(一般情形)。这一特性使得测地线绘制必须分情况处理。

直径情形的判定条件是两点叉积接近零:$|x_1 y_2 - x_2 y_1| <\text {THRESHOLD}$。此时直接在 Canvas 上绘制连接两点的直线段即可。

圆弧情形需要计算与单位圆正交的圆。设两点为 $p$ 和 $q$,该正交圆的圆心 $c$ 位于弦 $pq$ 的垂直平分线上,且满足 $|c|^2 = r^2 + 1$(正交条件)。具体计算步骤如下:

  1. 计算弦的中点 $m = (p + q) / 2$ 和方向向量 $v = q - p$
  2. 垂直平分线方向为 $v_\perp = (-v_y, v_x)$
  3. 圆心 $c = m + t \cdot v_\perp$,其中参数 $t$ 由正交条件解出
  4. 半径 $r = |c - p|$

Canvas 绘制时需计算圆弧的起止角度,使用 ctx.arc() 方法渲染。注意角度计算需正确处理象限,确保绘制的是劣弧而非优弧。

莫比乌斯变换的复合运算

莫比乌斯变换是庞加莱圆盘上的等距变换,保持双曲距离不变。其标准形式为:

$$\varphi_a(z) = e^{i\theta} \cdot \frac{z - a}{1 - \bar{a}z}, \quad |a| < 1$$

该变换将点 $a$ 映射到原点,常用于将复杂计算简化到中心对称情形。在可视化交互中,拖拽操作、缩放和平移都可通过莫比乌斯变换实现。

复合变换的计算需注意运算顺序。给定两个变换 $\varphi_a$ 和 $\varphi_b$,其复合 $\varphi_b \circ \varphi_a$ 的解析表达式为:

$$\varphi_b(\varphi_a(z)) = \frac{(1 - \bar{a}b)z + (b - a)}{(\bar{b} - \bar{a})z + (1 - a\bar{b})}$$

工程实现中,复合运算的结果可能因浮点误差导致 $|a|$ 略微超过 1,使变换不再保持圆盘内部。应在每次复合后执行归一化:若 $|a| > 1$,则令 $a = a / |a| \cdot (1 - \text {EPSILON})$。

数值稳定性工程清单

将双曲几何算法部署到生产环境时,以下参数配置直接影响用户体验:

  • 精度阈值EPSILON = 1e-10 用于边界检测,ZERO = 1e-12 用于共线判定
  • 最大迭代深度:递归细分测地线时限制迭代次数防止栈溢出
  • 坐标映射:将单位圆盘映射到 Canvas 像素坐标时,保持 1:1 宽高比避免形变
  • 边界裁剪:当测地线端点接近边界时,提前截断避免数值爆炸

双曲几何的数值实现本质上是连续数学与离散计算的折衷。理解公式背后的几何意义,才能在精度与性能之间做出合理取舍。


参考来源

  • Cornell University Mathematics: The Poincaré model for the hyperbolic plane, Section 7
  • ItsNickBarry/hyperbolic-canvas: JavaScript implementation of the Poincaré disk model

visualization

内容声明:本文无广告投放、无付费植入。

如有事实性问题,欢迎发送勘误至 i@hotdrydog.com