宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:9实验项目名称:自由曲线绘制算法学号姓名专业、班实验地点指导教师时间一、实验目的1.掌握曲线的表示形式、曲线的连续性条件、拟合和逼近的基本概念2.掌握Bezier曲线的性质3.编程实现Bezier曲线生成算法二、实验内容与步骤绘制三次Bezier曲线,可以采用公式法或德卡斯特里奥(DeCasteliau)算法绘制在空间给定1n个点012,,,,nPPPP,称下列参数曲线为n次Bezier曲线:,0()(),01niiniPtPBtt其中,()inBt是Bernstein基函数,其表达式为:,!()(1)!()!iniinnBtttini,接着我们讨论3次Bezier曲线,我们也采用将表达式改写为矩阵形式的方法,我们得到:3303!()(1)!(3)!iiiiPtPttii32230123(1)3(1)3(1)tPttPttPtP01323232323331,363,33,PPtttttttttPP三、源程序1)//TestView.hclassCTestView:publicCView{…….protected:boolFlag;//标志CPoint*pt;//顶点intCtrlPoint;//控制多边形顶点……..}2)//TestView.cpp#includemath.h//数学头文件#defineN_MAX_POINT10//控制多边形的最大顶点数#defineROUND(a)int(a+0.5)//四舍五入。。。。。。CTestView::CTestView(){Flag=false;}voidCTestView::OnMENUBezierCurve(){//TODO:AddyourcommandhandlercodehereRedrawWindow();AfxGetMainWnd()-SetWindowText(三次Bezier曲线);//显示标题MessageBox(单击左键绘制控制多边形,单击右键绘制曲线,提示,MB_OK);pt=newCPoint[N_MAX_POINT];Flag=true;CtrlPoint=0;}voidCTestView::DrawBezier()//绘制Bezier曲线{CClientDCdc(this);doublex,y;intrate=800,n;n=CtrlPoint-1;for(doublet=0;t=1;t+=1.0/rate){x=0;y=0;for(inti=0;i=n;i++){x+=pt[i].x*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);y+=pt[i].y*Cnk(n,i)*pow(t,i)*pow(1-t,n-i);}dc.SetPixel(ROUND(x),ROUND(y),RGB(255,0,255));//曲线颜色}}doubleCTestView::Cnk(constint&n,constint&i)//Bernstein第一项{returndouble(Factorial(n)/(Factorial(i)*Factorial(n-i)));}intCTestView::Factorial(intm)//阶乘函数{intf=1;for(inti=1;i=m;i++)f*=i;returnf;}voidCTestView::DrawCharPolygon()//绘制控制多边形{CClientDCdc(this);CPenMyPen,*pOldPen;MyPen.CreatePen(PS_SOLID,3,RGB(0,255,0));//控制多边形pOldPen=dc.SelectObject(&MyPen);for(inti=0;iCtrlPoint;i++){if(i==0){dc.MoveTo(pt[i]);dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);}else{dc.LineTo(pt[i]);dc.Ellipse(pt[i].x-2,pt[i].y-2,pt[i].x+2,pt[i].y+2);}}dc.SelectObject(pOldPen);MyPen.DeleteObject();}voidCTestView::OnLButtonDown(UINTnFlags,CPointpoint)//获得屏幕控制点坐标{//TODO:Addyourmessagehandlercodehereand/orcalldefaultCView::OnLButtonDown(nFlags,point);if(Flag){pt[CtrlPoint].x=point.x;pt[CtrlPoint].y=point.y;if(CtrlPointN_MAX_POINT)CtrlPoint++;elseFlag=false;DrawCharPolygon();}}voidCTestView::OnRButtonDown(UINTnFlags,CPointpoint)//调用绘制函数{//TODO:Addyourmessagehandlercodehereand/orcalldefaultFlag=false;DrawBezier();CView::OnRButtonDown(nFlags,point);}四、运行结果六、教师评语签名:日期:年月日成绩