You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 01:49:58