如何处理线性插值两个航向时跨越360度的问题?
罗盘航向环形插值的解决方法
普通线性插值(比如numpy.interp)会把罗盘航向当成线性数值处理,忽略了0°/360°是同一个方向的环形特性,导致跨正北方向插值时出现180°误差。解决这个问题的核心是基于单位圆坐标的插值,步骤如下:
- 把角度转换为单位圆上的笛卡尔坐标(余弦、正弦值),将环形问题转化为平面线性问题
- 对余弦和正弦分量分别做线性插值
- 将插值后的坐标转回角度,再映射到0°-360°范围
实现代码
import numpy as np def circular_interp(x, xp, fp): # 转换角度为弧度,适配三角函数计算 fp_rad = np.radians(fp) # 计算每个航向的cos、sin分量 fp_cos = np.cos(fp_rad) fp_sin = np.sin(fp_rad) # 对两个分量分别执行线性插值 interp_cos = np.interp(x, xp, fp_cos) interp_sin = np.interp(x, xp, fp_sin) # 将插值后的坐标转回角度(弧度转角度) interp_rad = np.arctan2(interp_sin, interp_cos) interp_deg = np.degrees(interp_rad) # 映射到0°-360°范围 return interp_deg % 360
测试示例
# 测试340°到10°的中点插值 xp = [0, 1] fp = [340, 10] x = 0.5 print(circular_interp(x, xp, fp)) # 输出355.0
这个方法兼容numpy.interp的输入格式,支持单点或多点插值,所有场景下都会自动选择最短路径计算插值结果。
内容的提问来源于stack exchange,提问作者Phillip Dobbs
相关产品推荐
相关产品推荐

