您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 建筑制度 > Bezier曲线的算法实现
实验六:Bezier曲线的算法实现(1)算法描述根据Q(t)=∑Pi•Bi,n(t)=∑Pi•Cinti(1-t)n-i并且Cin=C(n,k)=C(n,k-1)在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。程序实现步骤:(工程名:BezierCurve)(ⅰ)Cmn的函数实现,定义成成员函数,命名为Multiply_n。Cmn==intMultiply_n(intm,n){inti,j,a;if(m!=0){a=1;for(i=m+1;i=n;i++)//求(m+1)(m+2)…(n-1).na=a*i;for(j=1;j=n-m;j++)//求(n-m)!和Cmna=a/j;returna;}elsereturn1;}(ⅱ)伯恩斯坦多项式Bm,n(t)的函数实现Bm,n(t)=Cmntm(1-t)n-mDoubleBernstein(intm,intn,doublet){inti,j;doublesum;sum=Multiply_n(m,n);//求Cmnfor(i=1;i=m;i++)sum=sum*t;//Cmntmfor(j=1;j=n-m;j++)sum=sum*(1-t);//Cmntm(1-t)n-mreturnsum;}ni=0ni=0nn-k+1n!m!(n-m)!(n-m)!(m+1)(m+2)…(n-1).n(ⅲ)在OnDraw(CDC*pDC)函数中添加如下代码:inti,j,k,n=3;//n=3表示三次Bezier曲线doublecurx,cury,t,b;doubledt=0.01;intarray[4][2]={{30,100},{100,30},{50,150},{200,40}};CPenPenRed(PS_SOLID,1,RGB(255,0,0));//定义红色笔CPenPenBlue(PS_SOLID,1,RGB(0,0,255));//定义蓝色笔//首先绘出特征多边形pDC-SelectObject(&PenBlue);pDC-MoveTo(array[0][0],array[0][1]);for(i=0;i=n;i++)pDC-LineTo(array[i][0],array[i][1]);//绘制Bezier曲线pDC-MoveTo(array[0][0],array[0][1]);//回到起点pDC-SelectObject(&PenRed);t=0.0;for(i=0;i=(int)1/dt;i++){curx=0;cury=0;for(j=0;j=n;j++){b=Bernstein(j,n,t);curx=curx+array[j][0]*b;cury=cury+array[j][1]*b;}pDC-LineTo(curx,cury);t=t+dt;}(2)编译、运行后查看结果,如图1所示。图1Bezier曲线程序结果这时Bezier曲线的通用程序设计。通过这个程序,我们绘出二次、三次甚至高次Bezier曲线。(3)思考下面情况的程序实现:取样点数改变,例如:改为50或者80或者120等;高次Bezier曲线,例如:顶点个数为5个、6个或者更多个;
本文标题:Bezier曲线的算法实现
链接地址:https://www.777doc.com/doc-2900180 .html