`
wgcode
  • 浏览: 576954 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • C++
阅读更多

 

 

 

贝塞尔曲线德卡斯特里奥(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://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;

}

 

  • 大小: 5.7 KB
  • 大小: 6.8 KB
  • 大小: 6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics