本文已参与[新人创作礼]活动,一起开启掘金创作之路
转载请注明出处.
图形学的数学基础(三十八):贝塞尔曲线
贝塞尔曲线(Beˊziercurve)
用一些列的控制点定义曲线,如下图所示:曲线由四个控制点定义(三阶贝塞尔曲线),从P0开始,沿着P0−P1切线方向行进,结束时沿着
P2−P3方向,结束于P3点。

参数方程-deCasteljauAlgorithm
首先考虑由三个控制点组成的二维的贝塞尔曲线( quadraticBeˊzier):

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

求解步骤:
1> 三个控制点b0,b1,b2组成了两条线段,假设时间为t,分别去计算两条线段b0−b1和b1−b2在时间t上的位置(实际上是线性插值)。得到b01和b11.

2> 将b01和b11连成一条线,在该线段上继续找t的位置,得到b02 :

3> 最终收敛的点b02即是我们要找的在时间t球体在曲线上的位置。
由此可见,deCasteljau算法是一个递归的线性插值的过程,每次递归将减少一个控制点,最终收敛到一个点,即是我们要寻找的答案。
三阶贝塞尔曲线(cubicBeˊziercurve)
套用二阶贝塞尔曲线的思路,三阶贝塞尔曲线无非是多了一个控制点而已,每次计算多了一次递归而已。

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

拿二阶贝塞尔曲线举例:

b01(t)=(1−t)b0+tb1
b11(t)=(1−t)b1+tb2
b02(t)=(1−t)b01+tb11
b02(t)=(1−t)2b0+2t(1−t)b1+t2b2
由此可见,二阶贝塞尔曲线在时间t上的点,是b0,b1,b2和时间t的某种组合。类似于二项式(a+b)2=a2+2ab+b2的展开形式。
伯恩斯坦多项式
由n+1个控制点组成的n阶贝塞尔曲线,在时间t上点的位置是一个跟时间有关的多项式,由以下公式定义:
bn(t)=b0n(t)=j=0∑nbjBjn(t)
其中bj代表第j个控制点,Bjn(t)正是伯恩斯坦多项式。
Bin(t)=niti(1−t)n−i

总结:n阶贝塞尔曲线是由伯恩斯坦多项式对每个控制点的加权。
三维空间中的贝塞尔曲线
假设在三维空间中,我们有4个控制点b0=(0,2,3),b1=(2,3,5),b2=(6,7,9),b3=(3,4,5)
有这些控制点定义的三维贝塞尔曲线仍然满足以上定律:
bn(t)=b0(1−t)3+b13t(1−t)2+b23t2(1−t)+b3t3
贝塞尔曲线的多项式公式不局限于二维的情况。
参考
GAMES101 -现代计算机图形学入门-闫令琪