原理公式

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

Bézier 与 B-Spline
Bézier 与 B-Spline