手把手推导B样条基函数:用Python可视化de Boor-Cox递推公式
在计算机图形学和几何建模领域,B样条曲线因其出色的局部控制能力和灵活的连续性而广受欢迎。与Bezier曲线相比,B样条允许我们独立控制曲线的阶数和控制点数量,这种解耦带来了极大的设计自由度。本文将带你从零开始实现de Boor-Cox递推公式,并通过Python动态可视化不同阶数的B样条基函数,直观理解其数学本质。
1. 环境准备与基础概念
在开始编码之前,我们需要明确几个关键术语:
- 阶数(k):B样条的阶数等于次数加1。例如,三阶B样条是二次曲线。
- 节点向量(U):非递减的参数序列,决定基函数的形状和支撑区间。
- 局部支撑性:每个基函数只在部分参数区间内非零。
安装必要的Python库:
bash复制pip install numpy matplotlib
典型的均匀节点向量生成方法:
python复制def uniform_knots(n, k):
"""生成均匀节点向量"""
return np.linspace(0, 1, n+k+1)
提示:节点向量的长度必须满足
len(U) = n + k + 1,其中n+1是控制点数量,k是阶数。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 实现de Boor-Cox递推公式
de Boor-Cox公式的精妙之处在于用递归方式构建高阶基函数:
code复制B_{i,1}(u) = { 1 if u_i ≤ u < u_{i+1}
{ 0 otherwise
B_{i,k}(u) = ω_{i,k}(u)B_{i,k-1}(u) + (1-ω_{i+1,k}(u))B_{i+1,k-1}(u)
其中权重系数ω的计算:
python复制def omega(u, i, k, U):
"""计算递推权重系数"""
denom = U[i+k-1] - U[i]
return (u - U[i]) / denom if denom != 0 else 0
完整的基础函数实现:
python复制def basis_function(i, k, u, U):
