二阶与三阶贝塞尔曲线详解(含 De Casteljau 与公式推导)

在 UI 动画、路径规划、字体渲染、Unity 动画曲线中,我们几乎每天都在使用一种"看似简单但极其强大"的工具------贝塞尔曲线(Bezier Curve)。

但很多开发者对它的理解停留在:

"就是几个点拉一条弯曲的线"

实际上,贝塞尔曲线背后是一套非常优雅的数学与几何体系。

这篇文章将带你从直觉 → 构造 → 数学 → 工程理解,彻底掌握:

二阶贝塞尔曲线

三阶贝塞尔曲线(重点)

De Casteljau 算法(核心思想)

通用数学公式(Bernstein 表达)

一、从线性插值开始(所有贝塞尔的根)

在进入贝塞尔曲线之前,我们先理解一个最基础的操作:

线性插值(Lerp)

给定两个点:

(P_0)

(P_1)

定义一个参数 (t∈ 0,1),则:

含义是:

(t = 0) → 在 (P_0)

(t = 1) → 在 (P_1)

中间值 → 在两点之间移动

这就是所有贝塞尔曲线的"原子操作"

二、二阶贝塞尔曲线:三点生成平滑曲线

2.1 三个点如何生成一条曲线?

二阶贝塞尔曲线由三个点定义:

(P_0):起点

(P_1):控制点

(P_2):终点

关键问题:

如何从三个点生成一条"弯曲"的曲线?

2.2 De Casteljau 算法(核心思想)

我们不用公式,直接用"构造过程"理解。

Step 1:两两插值

对两段做插值:

Step 2:再插一次

这个 (B(t)) 就是曲线上的点

2.3 直觉理解(非常重要)

可以这样理解:

第一层:连接控制点形成"折线"

第二层:在折线上滑动

第三层:再连接一次

最终:

得到一条"平滑曲线"

2.4 二阶贝塞尔公式推导

将插值公式展开:

权重解释:

权重

P0

((1-t)^2)

P1

(2(1-t)t)

P2

(t^2)

本质:加权平均

2.5 几何特性

曲线一定经过:

(P_0)

(P_2)

不一定经过:

(P_1)

曲线始终在三点构成的三角形内部(凸包性质)

三、三阶贝塞尔曲线:工程中的主角

3.1 为什么三阶最常用?

三阶贝塞尔曲线使用四个点:

(P_0):起点

(P_1):起点切线控制

(P_2):终点切线控制

(P_3):终点

优势:

可以控制起点方向

可以控制终点方向

表达能力强

计算成本低

所以被广泛用于:

CSS cubic-bezier

Unity AnimationCurve

SVG Path

3.2 De Casteljau 三阶构造

构造过程:

第一层

第二层

第三层

3.3 控制点真正的作用(重点理解)

很多人误解:

控制点在曲线上

其实:

控制点决定的是"方向和速度"

更准确理解:

P1:控制起点的"出发方向"

P2:控制终点的"进入方向"

曲线的切线:

在 P0:方向为 (P1 - P0)

在 P3:方向为 (P3 - P2)

3.4 三阶公式

展开后得到:

和二阶一样,本质仍是加权平均

四、通用贝塞尔公式(统一理解)

4.1 一般形式

对于 n 阶贝塞尔曲线:

4.2 关键组成

二项式系数

Bernstein 基函数

作用:

控制每个点的影响权重

保证平滑变化

4.3 非常重要的性质

权重和为 1

保证是"加权平均"

非负性

所有权重 ≥ 0

曲线不会"飞出去"

凸包性质

曲线始终在控制点构成的区域内

非常适合做动画与路径

五、De Casteljau 算法(更深一层)

5.1 递归定义

5.2 为什么它很重要?

相比直接用公式:

优点:

数值稳定(避免浮点误差)

易实现(只用 lerp)

可扩展(任意阶)

5.3 曲线分割(工程非常重要)

De Casteljau 还能做:

曲线拆分

在某个 (t):

左半段 = 一条贝塞尔

右半段 = 一条贝塞尔

用途:

曲线细分(渲染)

路径动画分段

碰撞检测

六、小结

贝塞尔曲线本质上就是:

对控制点做"逐层线性插值"

或者从数学角度:

对控制点做"参数化加权平均"