如何从点数组生成过所有点且无起伏的贝塞尔折线SVG路径?
解决方案:约束型单调插值实现过点且无超调的曲线
你需要的是经过所有采样点、且曲线的极值(波峰/波谷)与采样点完全重合的拟合方案,这类需求可以通过**单调分段三次Hermite插值(PCHIP)**实现,它能严格保证曲线在相邻点之间保持单调性,不会出现超出采样点范围的凸起或凹陷。
核心原理
PCHIP插值会为每个区间计算Hermite多项式,通过约束导数使得曲线在相邻点之间单调,这样曲线的所有极值点必然就是输入的采样点,完全符合你“不高于/低于已知点”的要求。
代码示例(Python)
以Python的scipy库为例,实现步骤如下:
import numpy as np from scipy.interpolate import PchipInterpolator import matplotlib.pyplot as plt # 你的点数组 points = np.array([[1, 2], [3, 1], [5, 3], [7, 0.5], [9, 2.5]]) x = points[:, 0] y = points[:, 1] # 创建PCHIP插值器 pchip = PchipInterpolator(x, y) # 生成高密度的x值用于绘制平滑曲线 x_new = np.linspace(x.min(), x.max(), 1000) y_new = pchip(x_new) # 绘图展示 plt.plot(x, y, 'ro', label='原始点') plt.plot(x_new, y_new, 'b-', label='PCHIP拟合曲线') plt.legend() plt.show()
方案适配性说明
- 曲线严格经过所有输入点,无偏差
- 相邻点间曲线保持单调,不会出现高于最高点或低于最低点的超调,所有波峰/波谷均与输入点重合
- 曲线平滑度满足折线图转平滑曲线的展示需求
内容的提问来源于stack exchange,提问作者Abhinandan Kushwaha
相关产品推荐
相关产品推荐

