在半径为 radius 的球面上,计算两点间沿大圆的最短弧长;输入以方位角 f(经度,绕 z 轴)与天顶角 t(余纬,自 z 轴起),角度单位为弧度。
Returns the shortest distance on the sphere with radius radius between the points with azimuthal angles (longitude) f1 () and f2 () from x axis and zenith angles (latitude) t1 () and t2 () from z axis (0 = north pole). All angles measured in radians. Status: tested on kattis:airlinehub
展开阐述
-
定义与背景
- 模型:单位球(或半径为 radius 的球)上的两点最短路径位于穿过两点与球心的“大圆”上,其长度为球心夹角乘以半径。
- 输入坐标系:以 (f, t) 表示球面坐标,其中
- f:方位角(经度),相对 x 轴在 xy 平面的极角
- t:天顶角(余纬),相对 z 轴的夹角(t=0 为北极)
- 典型场景:地理/导航的球面距离、球面最近路由、球面插值与采样步长设定等。
-
接口/数据结构(据实现)
- 函数签名:double sphericalDistance(double f1, double t1, double f2, double t2, double radius)
- 参数单位:f1,f2,t1,t2 均为弧度;radius 为长度单位(米/千米等),返回值与其同单位
- 协同实体:
- 若已有笛卡尔坐标,可直接通过向量夹角计算再乘 radius
- 与 040-几何-三维点、039-几何-点 的向量原语可协同完成“坐标转化/夹角”
- 函数签名:double sphericalDistance(double f1, double t1, double f2, double t2, double radius)
-
核心流程/要点
- 球面坐标转笛卡尔坐标(文件注释方案)
- x = sin(t)·cos(f)
- y = sin(t)·sin(f)
- z = cos(t)
- 得到两点 u、v 后,欧氏差 d = |u−v|
- 球面弧长 s = radius · 2 · asin(d/2)
- 夹角法(等价形式)
- 以点积得到夹角:c = clamp(u·v, −1, 1);α = acos(c)
- 返回 s = radius · α
- 与上式等价,差别仅在反三角函数的数值表现
- 数值稳定性与选择
- 小角度时,2·asin(d/2) 具有良好的相对稳定性;点积法需对 c 做夹取以防 acos 域外
- 近对跖点时(α≈π),d≈2;两种公式均可,但需统一 eps 约束与夹取
- 单位与量纲
- 输入是弧度制;若外部以角度制供值,应先转弧度
- 返回值的长度单位与 radius 一致
- 球面坐标转笛卡尔坐标(文件注释方案)
-
复杂度与边界条件
- 时间:O(1)
- 边界:
- 同一点:返回 0
- 对跖点(相距 180°):α=π;弧长 = π·radius
- 半径为 0:退化返回 0
- 数值与精度:
- 需对 dot(u,v) 做 clamp 以防因舍入导致的 |c|>1
- 使用 double 可满足绝大多数场景;更高精度可使用 long double
- 以 eps 统一“几乎重合/几乎对跖”的阈值,避免反三角函数不稳定
-
变体/扩展
- 已有笛卡尔坐标输入:跳过 (f,t)→(x,y,z) 转换,直接用夹角法
- 返回球心夹角:若下游只需角度 α,可直接返回 α 而非弧长
- 球面插值(slerp):在 u、v 间按角度比例插值得到球面中间点(实现不在本节点)
- 地理坐标适配:经纬度与 (f,t) 的映射可在上游完成;本函数保持弧度制输入
- 椭球近似限制:本节点基于完美球体;若需地球椭球模型,应改用专门大地测量公式(不在本节点)
-
正确性要点与不变式
- 单位球几何:弧长等于球心夹角乘以半径;两个方案(asin 与 acos)本质一致
- 方向与闭式一致性:坐标转化后得到单位向量,保证 |u|=|v|=1,从而 dot、norm 等量计算保持简洁稳定
- 夹取不变式:在浮点误差下保持 c∈[−1,1],保证 acos 有定义
-
与相邻技术的对比与取舍
- 与“平面投影距离”对比:平面近似仅适用于小范围;球面距离在全球尺度保持正确性
- 与向量夹角法:二者等价;asin(d/2) 在小角时更稳健,acos(dot) 在实现上更直接
- 与 040-几何-三维点:可直接利用点积与单位化接口,减少重复实现
- 与 039-几何-点:二维向量原语可用于在局部图上近似,但不提供球面最短路