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

 

 

 

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

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



  

这是所谓抛物线的三切线定理。 

塞尔曲线德卡斯特里奥(de Casteljau)算法及程序
 
P0 P 2 固定,引入参数 t 令上述比值为 t:(1- t) ,即有:


 
t 0 变到1 ,第一、二式就分别表示控制二边形的第一、二条边,它们是两条一次Bezier 曲线。将一、二式代入第三式得:
t 0 变到1 时,它表示了由三顶点 P0 P1P2三点定义的一条二次Bezier曲线。并且表明:这二次Bezier曲线P0 2 可以定义为分别由前两个顶点(P0,P1)和后两个顶点(P1 ,P2)决定的一次Bezier曲线的线性组合。依次类推,由四个控制点定义的三次Bezier曲线P0 3 可被定义为分别由(P0,P1,P2)和(P 1 ,P2,P3)确定的二条二次Bezier曲线的线性组合,由(n+1)个控制点Pi(i=0,1,...,n)定义的n次Bezier曲线P0n可被定义为分别由前、后n个控制点定义的两条(n-1)次Bezier曲线P0n-1P1n-1的线性组合:

由此得到Bezier 曲线的递推计算公式
这就是 de Casteljau算法
__________________________________
|下面网址 有关计算机图形学网上教程           |
|   北京大学信息科学学院本科生课程      |
http://graphics.pku.edu.cn/courses/CG/      |
|                                                                     |
|                                                                     |
|   http://www.lnnu.edu.cn/xdjyjx/tuxing/           |
|_________________________________   |

代码如下:

/*************

* pDC                设备

* flArrayx             组成点x坐标序列

* flArrayy             组成点y坐标序列

**************/

int  deCasteljau(CDC *pDC,CArray<float,float>& flArrayx,CArray<float,float>& flArrayy)

{

                 if(flArrayx.GetSize()!=flArrayy.GetSize())

                        return 0;  

                 float *pflX,*pflY;

                 float flTempx,flTempy,flU;//flu-------u参数(和上面t表示意思相同)

                 int i,n,j;  

                 n=flArrayx.GetSize();    

                 if(n<2) return 0;

                 pflX=new float[n];

                 pflY=new float[n];

                 flTempx=flArrayx.GetAt(0);

                 flTempy=flArrayy.GetAt(0);

                 for(i=0;i<n;i++){

                        pflX[i]=flArrayx.GetAt(i);

                        pflY[i]=flArrayy.GetAt(i);

                 }     

                 for(flU=0;flU<=1;flU+=0.05/n){

                        for(i=1;i<n;i++){

                               for(j=0;j<n-i;j++){

                                      pflX[j]=(1-flU)*pflX[j]+flU*pflX[j+1];

                                      pflY[j]=(1-flU)*pflY[j]+flU*pflY[j+1];

                               }

                        }

                        pDC->MoveTo(flTempx,flTempy);

                        pDC->LineTo(pflX[0],pflY[0]);

                        flTempx=pflX[0];

                        flTempy=pflY[0];

                 }

                 delete[] pflX;

                 delete[] pflY;

                 return 1;

}

 

你可能感兴趣的:(算法,J#)