资源描述:
《Bezier曲线的算法实现.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、实验六:Bezier曲线的算法实现n(1)算法描述ni=0i=0根据Q(t)=∑Pi•Bi,n(t)=∑Pi•Cinti(1-t)n-in-k+1n并且Cin=C(n,k)=C(n,k-1)在主程序中提供特征多边形的各个顶点坐标放入controls[]数组中,ncontrols为顶点的个数,m为曲线上取的样点数,比如m=100表示取100个样点。计算出曲线上的各个样点坐标放入curve[]数组中,这样可以通过相邻点连线绘出生成的Bezier曲线。程序实现步骤:(工程名:BezierCurve)(ⅰ)Cmn的函数实现,定义成成员函数,命名为Multiply_n。(m+1)
2、(m+2)…(n-1).nn!(n-m)!m!(n-m)!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=Multi
3、ply_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;}(ⅲ)在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,
4、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
5、)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)思考下面情况的程序实现:l取样点数改变,例如:改为50或者80或者120等;l高次Bezier曲线,例如:顶点个数为5个、6
6、个或者更多个;