图形学的数学基础(十五):贝塞尔曲线

图形学的数学基础(十五):贝塞尔曲线

贝塞尔曲线($Bézier\;curve$)

用一系列控制点定义的曲线,如下图所示:曲线由四个控制点定义(三阶贝塞尔曲线),从$P_0$开始,沿着$P_0-P_1$切线方向行进,结束时沿着
$P_2-P_3$方向,结束于$P_3$点。

贝塞尔曲线

参数方程-$de\;Casteljau\;Algorithm$

首先考虑由三个控制点组成的二次贝塞尔曲线( $quadratic\;Bézier$):

贝塞尔曲线

假设有一颗沿着曲线运动的小球,当$t = 0$,球体在$b_0$点,当$t = 1$,球体在$b_1$点 定义曲线关于时间$t$的参数方程,实质上就是求在任意时间$t$($0<=t<=1$),球体的位置。这就是$de\;Casteljau$算法的核心思想,将曲线方程转换成了求一个点位置。

求解步骤:

1> 三个控制点$b_0,b_1,b_2$组成了两条线段,假设时间为$t$,分别去计算两条线段$b_0-b_1和b_1-b_2$在时间$t$上的位置(实际上是线性插值),得到$b^1_0和b^1_1$.

贝塞尔曲线

2> 将$b^1_0和b^1_1$连成一条线,在该线段上继续找$t$的位置,得到$b^2_0$ :

贝塞尔曲线

3> 最终收敛的点$b^2_0$即是我们要找的在时间$t$球体在曲线上的位置。

由此可见,$de\;Casteljau$算法是一个递归的线性插值的过程,每次递归将减少一个控制点,最终收敛到一个点,即是我们要寻找的答案。

三阶贝塞尔曲线($cubic\;Bézier\;curve$)

套用二阶贝塞尔曲线的思路,三阶贝塞尔曲线无非是多了一个控制点而已,每次计算多了一次递归而已。

贝塞尔曲线

贝塞尔曲线

代数形式

从金字塔底部开始,每两个相邻的点做一次线性插值,形成新的点,对新的点继续做同样规则的线性插值,最终收敛到一个点。

贝塞尔曲线

拿二阶贝塞尔曲线举例:

贝塞尔曲线

$b^1_0(t) = (1-t)b_0 +tb_1$

$b^1_1(t) = (1-t)b_1 +tb_2$

$b^2_0(t) = (1-t)b^1_0 +tb^1_1$

$b^2_0(t) = (1-t)^2b_0 + 2t(1-t)b_1 + t^2b_2$

由此可见,二阶贝塞尔曲线在时间$t$上的点,是$b_0,b_1,b_2$和时间$t$的某种组合。类似于二项式$(a+b)^2 = a^2 + 2ab + b^2$的展开形式。

伯恩斯坦多项式

由$n+1$个控制点组成的$n$阶贝塞尔曲线,在时间$t$上点的位置是一个跟时间有关的多项式,由以下公式定义:

$b^n(t) = b^n_0(t) = \sum\limits_{j=0}^n{b_j}B^n_j(t)$

其中$b_j$代表第j个控制点,$B^n_j(t)$正是伯恩斯坦多项式。

$B^n_i(t) = \begin{matrix}
n\\
i
\end{matrix}t^i(1-t)^{n-i}$

贝塞尔曲线

总结:n阶贝塞尔曲线是由伯恩斯坦多项式对每个控制点的加权。

三维空间中的贝塞尔曲线

假设在三维空间中,我们有4个控制点$b_0 = (0, 2, 3), b_1 = (2, 3, 5), b_2 = (6, 7, 9), b_3 = (3, 4, 5)$

由这些控制点定义的三维贝塞尔曲线仍然满足以上规则:

$b^n(t) = b_0(1-t)^3 + b_13t(1-t)^2 + b_23t^2(1-t)+b_3t^3$

贝塞尔曲线的多项式公式不局限于二维空间。

参考

GAMES101 -现代计算机图形学入门-闫令琪