Python中交互式B样条拟合及三次样条拟合函数实现
如何在Python中实现交互式B样条拟合?
我来给你详细拆解一下这个三次样条拟合函数的使用方法,还有输入点的格式要求,帮你快速上手:
输入点P的格式规范
- P得是一个列表,里面每个元素都是表示坐标的二元组(tuple),比如
[(x1,y1), (x2,y2), ..., (xn,yn)]这种形式 - 坐标值不管是整数还是浮点数都可以,只要能被NumPy正常处理就行
- 注意哦,这个函数默认会把曲线做成闭合的——它会把P的第一个点拼到末尾,所以如果你不需要闭合曲线,记得删掉代码里的
pts = np.vstack([P, P[0]])这一行
函数plotCurve()的使用步骤
- 先导入依赖库:这个函数依赖NumPy、SciPy的
interp1d和Matplotlib,所以使用前必须先导入这些库:import numpy as np from scipy.interpolate import interp1d import matplotlib.pyplot as plt - 准备你的输入点P:按照上面的格式把需要拟合的坐标点整理好
- 调用函数并查看结果:直接把P传进去就行,函数会返回拟合后曲线上的x、y坐标数组,同时会自动绘制原始点和拟合曲线
# 举个实际的输入例子 P = [(921,1181),(951,1230),(993,1243),(1035,1220),(1070,1175)] # 调用拟合函数 xi, yi = plotCurve(P) # 如果看不到图像,要么取消函数里的plt.show()注释,要么在这里手动调用plt.show() plt.show()
额外说明:函数的工作逻辑
这个函数其实是对x、y坐标分别做了三次样条插值,具体流程是:
- 把输入点首尾拼接,形成闭合路径(如果不需要闭合就去掉这一步)
- 给每个原始点分配一个索引值作为插值的自变量
- 用
interp1d生成高密度的拟合点(默认是原始点数的100000倍,保证曲线足够平滑) - 最后绘制出平滑曲线和原始的控制点
内容的提问来源于stack exchange,提问作者snelzb
相关产品推荐
相关产品推荐

