如何在Python中绘制5次2D B样条?附Mathematica实现参考
在Python中绘制5次2D B样条的实现方法
你可以通过numpy、matplotlib和scipy库实现与Mathematica效果一致的5次2D B样条绘制,以下是完整步骤:
1. 准备控制点数据
先将你提供的控制点整理为NumPy数组:
import numpy as np import matplotlib.pyplot as plt from scipy.interpolate import make_interp_spline # 控制点的x坐标 x_points = np.array([ 0.,0.86743,2.6022,5.2041,8.67278,13.011,17.3611,21.743,26.1889, 30.7493,35.4913,40.4803,45.7634,51.3537,57.2092,63.2248,69.264, 75.1835,80.8609,86.2205,91.2212,94.9214,97.5265,99.188,100. ]) # 控制点的y坐标 y_points = np.array([ 0.,10.73,30.8894,57.2271,84.5088,105.565,113.937,110.625,97.5266, 77.8432,56.1083,37.1385,25.1542,22.8973,30.5531,45.24,62.4303, 77.0019,84.4261,81.8761,67.8054,46.8155,25.5477,8.92353,0. ])
2. 创建5次B样条插值器
使用make_interp_spline生成样条曲线,指定k=5对应5次B样条,同时采用均匀参数化(与Mathematica默认行为一致):
# 生成均匀参数t,对应每个控制点的参数值 t = np.linspace(0, 1, len(x_points)) # 创建x和y方向的5次B样条插值器 spl_x = make_interp_spline(t, x_points, k=5) spl_y = make_interp_spline(t, y_points, k=5)
3. 生成平滑曲线的密集点
为了绘制出平滑的曲线,生成密集的参数点来计算曲线上的坐标:
# 生成1000个密集参数点,保证曲线平滑 t_dense = np.linspace(0, 1, 1000) x_dense = spl_x(t_dense) y_dense = spl_y(t_dense)
4. 绘制并展示结果
将B样条曲线、控制多边形和控制点一起绘制:
plt.figure(figsize=(10, 6)) # 绘制5次B样条曲线(蓝色实线) plt.plot(x_dense, y_dense, 'b-', label='5次B样条曲线') # 绘制控制多边形(绿色虚线) plt.plot(x_points, y_points, 'g--', label='控制多边形') # 绘制控制点(红色圆点) plt.scatter(x_points, y_points, c='r', s=50, label='控制点') plt.legend() plt.axis('equal') # 保证坐标轴比例一致,避免曲线变形 plt.title('5次2D B样条绘制') plt.show()
关键说明
make_interp_spline会自动生成符合要求的B样条节点向量,无需手动计算节点,简化了实现流程。- 采用均匀参数化
t,确保生成的曲线形状与Mathematica中绘制的结果一致。
内容的提问来源于stack exchange,提问作者bkarpuz
相关产品推荐
相关产品推荐

