《计算机图形学》实验指导书暨实验报告
湖北汽车工业学院实验报告
班 级 课程名称
学 号
完成日期
姓 名
实验四 实现Bezier曲线的生成算法
一、实验目的
1、熟悉CDC图形程序库;
2、掌握Bezier曲线的生成算法;
3、掌握利用Bezier曲线生成复杂形状的曲线; 二、实验性质
验证性 三、实验要求
1、认真阅读本次实验的目的,了解本次实验要求掌握的内容; 2、能够根据实验指导书的要求,完成相关的内容; 四、实验内容
(一)生成绘图应用程序的框架(如下图) 具体实现见第一次实验,过程不再详细说明。
(二)在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。
《计算机图形学》实验指导书暨实验报告
(三)在应用程序中增加一个参数设置的对话框
在VC++6.0环境中打开资源视图,插入两个对话框,如图所示(具体实现过程见实验二):
《计算机图形学》实验指导书暨实验报告
(四)在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。 1、利用Bezier曲线的生成算法实现二次Bezier曲线的生成(算法的详细原理见教材)。 void CBezierView::OnBezier2() { // TODO: Add your command handler code here InputBezier2Info Dlg; Dlg.DoModal(); CDC*pDC=GetDC();//得到绘图类指针 RedrawWindow();//重绘窗口
CPen bluepen(PS_SOLID,2,RGB(0,0,255));//创建画实线、线宽为2的蓝色画笔 CPen *old=pDC->SelectObject(&bluepen); float x0,y0,x1,y1,x2,y2; float i,x,y,dt,t,n=30.0; x0=Dlg.p0_x;y0=Dlg.p0_y; x1=Dlg.p1_x;y1=Dlg.p1_y; x2=Dlg.p2_x;y2=Dlg.p2_y; dt=1/n; for(i=0;i<=n;i++) { t=i*dt; x=x0*(1-t)*(1-t)+x1*2*t*(1-t)+x2*t*t; y=y0*(1-t)*(1-t)+y1*2*t*(1-t)+y2*t*t; if(i==0)pDC->MoveTo(x,y); pDC->LineTo(x,y); }
pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); pDC->LineTo(x2,y2); pDC->SelectObject(old); ReleaseDC(pDC); }
运行效果如下:
《计算机图形学》实验指导书暨实验报告
2、利用Bezier曲线的生成算法实现三次Bezier曲线的生成(算法的详细原理见教材)。。 void CBezierView::OnBezier3() { // TODO: Add your command handler code here InputBezier3Info Dlg1; Dlg1.DoModal(); CDC*pDC=GetDC();//得到绘图类指针 RedrawWindow();//重绘窗口
CPen redpen(PS_SOLID,2,RGB(255,0,0));//创建画实线、线宽为2的红色画笔 CPen *old=pDC->SelectObject(&redpen); float x0,y0,x1,y1,x2,y2,x3,y3; float i,x,y,dt,t,n=30.0; x0=Dlg1.p0_x;y0=Dlg1.p0_y; x1=Dlg1.p1_x;y1=Dlg1.p1_y; x2=Dlg1.p2_x;y2=Dlg1.p2_y; x3=Dlg1.p3_x;y3=Dlg1.p3_y; dt=1/n; for(i=0;i<=n;i++) { t=i*dt; x=x0*(1-t)*(1-t)*(1-t)+x1*3*t*(1-t)*(1-t)+x2*3*t*t*(1-t)+x3*t*t*t; y=y0*(1-t)*(1-t)*(1-t)+y1*3*t*(1-t)*(1-t)+y2*3*t*t*(1-t)+y3*t*t*t; if(i==0)pDC->MoveTo(x,y); pDC->LineTo(x,y); }
《计算机图形学》实验指导书暨实验报告
pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); pDC->LineTo(x2,y2); pDC->LineTo(x3,y3); pDC->SelectObject(old); ReleaseDC(pDC); }
运行效果如下:
3、以上是本次实验的基本部分,能不能利用该算法,完成任意阶次Bezier曲线的生成,请同学们认真考虑,完成这部分的内容,并将具体的实现过程撰写在实验报告上。 五、思考
1、如何实现任意阶次Bezier曲线的生成;
2、如何利用Bezier曲线来实现任意复杂形状曲线的生成。 六、实验总结