计算Bezier曲线上的点,可用Bezier曲线方程,但使用de Casteljau提出的递推算法则要简单得多。
如图3.1.10所示,设P0、P02、P2是一条抛物线上顺序三个不同的点。过P0和P2点的两切线交于P1点,在P02点的切线交P0P1和P2P1于P01和P11,则如下比例成立:
这是所谓抛物线的三切线定理。
图3.1.10 抛物线三切线定理
当P0,P2固定,引入参数t,令上述比值为t:(1-t),即有:
t从0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。将一、二式代入第三式得:
当t从0变到1时,它表示了由三顶点P0、P1、P2三点定义的一条二次Bezier曲线。并且表明:这二次Bezier曲线P02可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1,P2)决定的一次Bezier曲线的线性组合。依次类推,由四个控制点定义的三次Bezier曲线P03可被定义为分别由(P0,P1,P2)和(P1,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,...,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1与P1n-1的线性组合:
由此得到Bezier曲线的递推计算公式:
这便是著名的de Casteljau算法。用这一递推公式,在给定参数下,求Bezier曲线上一点P(t)非常有效。上式中:Pi0=Pi是定义Bezier曲线的控制点,P0n即为曲线P(t)上具有参数t的点。de Casteljau算法稳定可靠,直观简便,可以编出十分简捷的程序,是计算Bezier曲线的基本算法和标准算法。
当n=3时,de casteljau算法递推出的Pik呈直角三角形,对应结果如图3.1.11所示。从左向右递推,最右边点P03即为曲线上的点。
图3.1.11 n=3时,Pin的递推关系
长度为t:(1-t)的两段。依次对原始控制多边形每一边执行同样的定比分割,所得分点就是第一级递推生成的中间顶点Pi1(i=0,1,...,n-1),对这些中间顶点构成的控制多边形再执行同样的定比分割,得第二级中间顶点Pi2(i=0,1,...,n-2)。重复进行下去,直到n级递推得到一个中间顶点P0n即为所求曲线上的点P(t),如图3.1.12所示。
图3.1.12 几何作图法求Bezier曲线上一点(n=3,t=1/4)