如何对数组插值得到相邻点间距相等的二维散点序列
等距散点插值修正方案
问题原因
你现在的插值方式是分别对x、y坐标以原始点的索引为自变量做等距采样,等距的索引只代表原始点序号间隔相等,和曲线上的实际移动距离没有关系,所以最终得到的点分布不均匀。
正确处理逻辑
以原始路径的累积弧长作为统一的插值自变量,流程如下:
- 计算原始序列相邻点的欧式距离,累加得到累积弧长数组
- 按目标点数对总弧长做等距分割,得到等距弧长序列
- 将x、y分别作为弧长的函数做样条插值,代入等距弧长序列得到最终的等距坐标点
实现代码
import numpy as np from scipy.interpolate import UnivariateSpline import matplotlib.pyplot as plt # 原始散点坐标 xn, yn # 1. 计算累积弧长 dx = np.diff(xn) dy = np.diff(yn) seg_length = np.sqrt(dx ** 2 + dy ** 2) cum_len = np.concatenate(([0], np.cumsum(seg_length))) total_len = cum_len[-1] # 2. 生成等距弧长采样点 point_num = 50 equal_cum_len = np.linspace(0, total_len, point_num) # 3. 插值得到等距坐标 spl_x = UnivariateSpline(cum_len, xn, k=3, s=0) spl_y = UnivariateSpline(cum_len, yn, k=3, s=0) equal_x = spl_x(equal_cum_len) equal_y = spl_y(equal_cum_len) # 校验相邻点间距 check_dist = np.sqrt(np.diff(equal_x)**2 + np.diff(equal_y)**2) print("相邻点间距标准差:", np.std(check_dist)) # 数值接近0即说明间距几乎完全相等 # 绘图 plt.scatter(equal_x, equal_y, s=8, label="等距插值点") plt.scatter(xn, yn, s=8, label="原始点") plt.axis('equal') # 避免坐标轴拉伸导致视觉误差 plt.legend() plt.show()
关键说明
- 必须添加
plt.axis('equal'),否则横纵轴缩放比例不同会导致视觉上看起来点的间距不等,实际计算的间距是均匀的 - 原始点必须是沿路径按顺序排列的,如果顺序混乱会导致累积弧长计算错误,最终插值结果失效
内容的提问来源于stack exchange,提问作者wosker4yan
相关产品推荐
相关产品推荐

