《计算机图形学》实验指导书暨实验报告
湖北汽车工业学院实验报告
班 级 课程名称
学 号
完成日期
姓 名
实验三 实现圆的生成算法
一、实验目的
1、熟悉CDC图形程序库; 2、掌握中点画圆生成算法; 3、掌握Bresenham画圆算法; 二、实验性质
验证性 三、实验要求
1、认真阅读本次实验的目的,了解本次实验要求掌握的内容; 2、能够根据实验指导书的要求,完成相关的内容; 四、实验内容
(一)生成绘图应用程序的框架(如下图) 具体实现见第一次实验,过程不再详细说明。
(二)在应用程序中增加菜单
完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。
《计算机图形学》实验指导书暨实验报告
(三)在应用程序中增加一个圆参数设置的对话框
在VC++6.0环境中打开资源视图,插入一个对话框,如图所示(具体实现过程见
实验二):
(四)在绘图函数中添加代码
通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。 1、利用中点画圆算法实现圆的生成(算法的详细原理见教材)。 void CDraw_CirView::OnMid() { // TODO: Add your command handler code here InputCircleInfo Dlg; Dlg.DoModal(); //打开圆参数设置对话框 CDC*pDC=GetDC();//得到绘图类指针 RedrawWindow();//重绘窗口
《计算机图形学》实验指导书暨实验报告
int x,y,x0,y0;//圆的圆心为(x0,y0),半径为r float r,d; x0=Dlg.yuanxin_x; y0=Dlg.yuanxin_y; r=Dlg.yuan_r; x=0; y=r; d=1.25-r;
pDC->SetPixel(x+x0,y+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); while(x<=y) { if(d<0) { d=d+2*x+3; x++; } else { d=d+2*(x-y)+5; x++; y--;} pDC->SetPixel(x+x0,y+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0)); pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0)); pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0)); } }
2、利用Bresenham算法生成圆(算法的详细原理见教材)。 void CDraw_CirView::OnBre() { // TODO: Add your command handler code here InputCircleInfo Dlg; Dlg.DoModal(); //打开圆参数设置对话框
《计算机图形学》实验指导书暨实验报告
CDC*pDC=GetDC();//得到绘图类指针 //RedrawWindow();//重绘窗口 int x,y,x0,y0,r;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction; x0=Dlg.yuanxin_x; y0=Dlg.yuanxin_y; r=Dlg.yuan_r; x=0;y=r; delta=2*(1-r); while(y>=0) {
pDC->SetPixel(x+x0,y+y0,RGB(0,0,255)); pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255)); pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255)); pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255)); if(delta<0) { delta1=2*(delta+y)-1; if(delta<=0)direction=1; else direction=2; } else if(delta>0) { delta2=2*(delta-x)-1; if(delta2<=0)direction=2; else direction=3; } else direction=2; switch(direction) { case 1:x++; delta+=2*x+1; break; case 2:x++;y--; delta+=2*(x-y+1); break; case 3:y--; delta+=(-2*y+1); break; } } }
程序运行效果如下:
《计算机图形学》实验指导书暨实验报告
3、以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,并将具体的实现过程撰写在实验报告上。 五、思考
1、如何实现圆心为任意位置的圆的绘制; 2、两种画圆算法的比较。 六、实验总结