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

489 阅读2分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路

转载请注明出处.

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

贝塞尔曲线(Beˊzier  curveBézier\;curve)

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

1.jpg

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

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

2.jpg

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

3.jpg

求解步骤:

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

4.jpg

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

5.jpg

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

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

三阶贝塞尔曲线(cubic  Beˊzier  curvecubic\;Bézier\;curve

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

6.jpg

代数形式

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

7.jpg

拿二阶贝塞尔曲线举例:

9.jpg

b01(t)=(1t)b0+tb1b^1_0(t) = (1-t)b_0 +tb_1

b11(t)=(1t)b1+tb2b^1_1(t) = (1-t)b_1 +tb_2

b02(t)=(1t)b01+tb11b^2_0(t) = (1-t)b^1_0 +tb^1_1

b02(t)=(1t)2b0+2t(1t)b1+t2b2b^2_0(t) = (1-t)^2b_0 + 2t(1-t)b_1 + t^2b_2

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

伯恩斯坦多项式

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

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

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

Bin(t)=niti(1t)niB^n_i(t) = \begin{matrix} n\\ i \end{matrix}t^i(1-t)^{n-i}

10.jpg

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

三维空间中的贝塞尔曲线

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

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

bn(t)=b0(1t)3+b13t(1t)2+b23t2(1t)+b3t3b^n(t) = b_0(1-t)^3 + b_13t(1-t)^2 + b_23t^2(1-t)+b_3t^3

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

参考

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