B样条

在数学的子学科数值分析裡，B-样条是样条曲线一种特殊的表示形式。它是B-样条基曲线的线性组合。B-样条是貝茲曲線的一种一般化，可以进一步推广为非均匀有理B样条（NURBS），使得我们能给更多一般的几何体建造精确的模型。

De Boor算法是一个数值上稳定的计算B样条的方法。

术语 B样条是Isaac Jacob Schoenberg创造的，B 是基（basis）样条的缩略。

定义 
给定m+1 个节点ti ，分布在[0,1]区间，满足

一个n次B样条是一个参数曲线：

它由n次B样条基(basis B-spline)组成
.

Pi称为控制点或de Boor点. 
m+1个n次B样条基可以用Cox-de Boor递归公式 定义

当节点等距，称B样条为均匀(uniform)否则为非均匀(non-uniform)。

均匀B样条曲线 
当B样条是均匀的时候，对于给定的n，每个B样条基是其他基的平移拷贝而已。一个可以作为替代的非递归定义是

满足

满足

其中 

是截断幂函数（truncated power function）

注解 
当节点数和多项式次数相等时，B样条退化为貝茲曲線。即函数的形状由节点的位置决定。缩放或者平移节点向量不会改变基函数。

样条包含在它的控制点的凸包中

n次B样条的一个基

仅当在区间[ti, ti+n+1]上非0。就是

换句话说，如果我们操作一个控制点，我们只改变曲线在局部的行为，而不像Bezier曲线那样是全局行为。

例子

常数B样条 
常数B样条是最简单的样条。只定义在一个节点距离上，而且不是节点的函数。它只是不同节点段（knot span）的指示函数。

线性B样条 
线性B样条定义在两个相邻的节点段上，在节点连续但不可微。

三次B样条 
一个片断上的B样条的表达式可以写作：

其中Si是第i个B样条片断而P是一个控制点集，i和k是局部控制点索引。控制点的集合会是的集合，其中是比重，当它增加时曲线会被拉向控制点，在减小时则把曲线远离该点。

片段的整个集合m-2条曲线（）由m+1个控制点（）定义，作为t上的一个B样条可以定义为

其中i是控制点数，t是取节点值的全局参数。这个表达式把B样条表示为B样条基函数的线性组合，这也是这个名称的原因。

有两类B样条-均匀和非均匀。非均匀B样条相邻控制点间的距离不一定要相等。一个一般的形式是区间随着插入控制点逐步变小到0。

B樣條的程式指令

Matlab 
In Matlab，the command“spline” can be used for spline interpolation.

(Note： In the command, the cubic B-spline  is used)

Cubic B-Spline Interpolation by Matlab

Generating a sine-like spline curve and samples it over a finer mesh:

x = 0:1:10; % original sampling points

y = sin(x);

xx = 0:0.1:10; % new sampling points

yy = spline(x,y,xx);

plot(x,y,'o',xx,yy)

Python 
事前安裝模組
pip install numpy
pip install scipy
pip install matplotlib

Cubic B-Spline Interpolation by Python

from scipy.interpolate import interp1d

import matplotlib.pyplot as plt

import numpy as np

x = np.arange(0, 11) # original sample points, [0, 1, 2, …, 9, 10]

y = np.sin(x)

f = interp1d(x, y, kind=' cubic ') ) # Cubic means the cubic B-spline.

x_new = np.arange(0, 10.1, 0.1) # new sample points, [0, 0.1, 0.2, ….., 9.9, 10]

y_new = f(x_new)

plt.plot(x,y,'o',x_new, y_new)

plt.show()

B样条曲面

B样条曲线及曲面相关算法 
关于此处涉及的算法，在著作中有针对Bézier、B样条（B-spline）以及非均匀有理B样条（Nurbs）的相关算法的详细数学表达和程序实现方法。

求导 
在几何处理中，对参数曲线及曲面的求导是最基本的运算之一，由于参数表达的特性，在给定点的切线及法线可通过求导直接得到。
先来考察曲线的情形：采用本页定义中的B样条曲线表达式
 
对参数进行求导：

节点插入与删除

曲线及曲面拟合

应用

参看 
样条
De Boor算法
非均匀有理B样条

参考

參考文獻

 Jian-Jiun Ding, “Time Frequency Analysis and Wavelet Transforms ”, NTU, 2021.

外部链接 
Interactive java applets for B-splines
Introduction to Computing with Geometry Notes (Dr.C.-K.Shene/Michigan Technological University) 

样条

de:Spline#B-Splines