贝塞尔曲线德卡斯特里奥(de Casteljau)算法

这篇文章比较好理解些~

P0P02P2是一条抛物线上顺序三个不同的点。过P0P2点的两切线交于P1点,在P02点的切线交P0P1P2P1P01P11,则如下比例成立:

这是所谓抛物线的三切线定理
 
P0P2固定,引入参数t令上述比值为t:(1-t),即有

t0变到1,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier曲线。将一、二式代入第三式得:
t0变到1时,它表示了由三顶点P0P1P2三点定义的一条二次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-1P1n-1的线性组合:

由此得到Bezier 曲线的递推计算公式
这就是de Casteljau算法
 
具体可参考下面网址:
http://www.cs.mtu.edu/~shene/COURSES/cs3621/NOTES/spline/Bezier/de-casteljau.html
 
 
(注:下面用 PXX 表示点, 用 LXX 表示线段)
看这个图更清晰一些,首先,P0 和 P5 在曲线上,并且 L01 和 L45 为切线;
然后要做的操作就是:
P10  =  (1-u)*P0  +  u*P1;
P11  =  (1-u)*P1  +  u*P2;
P12  =  (1-u)*P2  +  u*P3;
P13  =  (1-u)*P3  +  u*P4;
 
P20  =  (1-u)*P10  +  u*P11;
P21  =  (1-u)*P11  +  u*P12;
P22  =  (1-u)*P12  +  u*P13;
P23  =  (1-u)*P13  +  u*P14;
 
P30  =  (1-u)*P20  +  u*P21;
P31  =  (1-u)*P21  +  u*P22;
P32  =  (1-u)*P22  +  u*P23;
 
P40  =  (1-u)*P30  +  u*P31;
P41  =  (1-u)*P31  +  u*P32;
 
P50  =  (1-u)*P40  +  u*P41;
 
……
 
写递归算法的话,核心应该是:
         p(i,j) =  (1-u) * p(i-1,j)  +  u * p(i-1,j-1);
 
恩,觉得今天理解的差不多了,代码回头写写试试~~~

你可能感兴趣的:(贝塞尔曲线德卡斯特里奥(de Casteljau)算法)