原理公式
Bézier 曲线(n 次,n+1 个控制点 P₀…Pₙ)用伯恩斯坦基函数定义:
$$B(t) = \sum_{i=0}^{n} \binom{n}{i} t^i (1-t)^{n-i}\, P_i, \qquad t\in[0,1]$$
工程上更常用 de Casteljau 递推(不依赖组合数,数值稳定):
$$P_i^{(k)}(t) = (1-t)\,P_i^{(k-1)}(t) + t\,P_{i+1}^{(k-1)}(t)$$
B-Spline 是分段多项式,每个曲线段由相邻 k 个控制点决定,段间可做到 C² 连续, 比单条高次 Bézier 更平滑、更易局部修改。
重难点核心代码(code/demo13_bezier.py)
Python
def bezier(points, t): # de Casteljau 递推
p = np.array(points, dtype=float)
while len(p) > 1:
p = (1 - t) * p[:-1] + t * p[1:] # 相邻两点线性插值
return p[0]
from scipy.interpolate import BSpline
knots = np.arange(len(P) + 4) - 2 # 均匀节点
spl = BSpline(knots, P, 3) # 三次均匀 B-Spline
