《计算机图形学》实验指导书主讲:宋春花教材:计算机图形学适应专业:软件工程总学时:40学时实验学时:102011-5-201前言随着计算机科学与技术的迅猛发展,特别是大规模集成电路和超大规模集成电路技术的飞速发展,计算机已经成为一种高速、费用低的生成图形的有效工具。计算机图形学作为利用计算机生成图形的技术,已经越来越广泛地在各个领域得到应用。随着计算机图形学应用领域的拓宽和应用水平的提高,人们越来越重视对该项技术的研究和利用。当今,计算机图形学已经成为了计算机科学技术领域的一个重要研究方向,并被广泛的应用于科学计算、工程设计、医药、工业、艺术、娱乐业、广告业、教育与培训、商业和政府部门等。鉴于计算机图形学的重要性和应用的广泛性,计算机科学与技术专业将其设置为专业必选的选修课。它主要是研究用计算机及其图形设备来输入、表示、变换、运算和输出图形的原理、算法及系统。通过对本课程的学习,使学生对计算机图形学有一个完整的了解,并为进行计算机图形学应用和研究打下扎实基础。由于本课程实践性较强,计划中安排10学时实验。通过实验,使学生更加深入的理解计算机图形系统的工作机理和基本图形生成和处理算法。在实验过程中,能够培养学生的自学能力、团队协作能力、解决问题能力、软件开发能力等多种能力。培养学生的算法设计能力和编程能力,能够应用计算机来解决在科学研究、工程设计与制造中有关图形处理的能力;在图形学理论与算法方面的科研能力;应用高级绘图软件及对其进行二次开发的能力,并具有开发大型通用或专用绘图软件的能力。为学生毕业设计、和毕业后从事计算机绘图、计算机辅助设计、图形生成、图像处理等打下基础。培养学生的算法设计能力和编程能力,2目录一、实验目的和要求...........................................错误!未定义书签。二、实验环境........................................................错误!未定义书签。三、实验项目........................................................错误!未定义书签。实验1二维基本图形生成的算法实现..........................................3实验2图形的裁剪...........................................................................8实验3几何图形变换.....................................................................11实验4BEZIER曲线和B样条曲线的绘制...................................14实验5基于OPENGL的实体建模..................................................15第四章参考文献...............................................................................151一、实验目的和要求《计算机图形学》是计算机专业本科生的一门理论性、技术性、应用性较强的专业课程。实验目的是:通过上机实践,让学生更好地了解和掌握计算机图形学的基本图形生成的各种算法、对各种算法加以比较,同时在实践中发现问题、解决问题,给学生以新的启迪,培养学生的创新能力和实际动手能力。实验要求:1、采用VC++程序开发环境和OpenGL图形库进行课程实验,通过实验掌握基本图元-直线和圆弧生成算法;掌握曲线和曲面的基本绘制方法;掌握图形变换算法;掌握规则和不规则实体的建模技术;掌握真实感绘图技术;能够综合利用上述技术,进行一定复杂虚拟场景的设计。为后续的课程奠定良好的基础。2、上机实验前,要求完成实验报告的实验目的、理论基础、算法设计及源程序初稿。实验程序调试过程中,可以互相讨论、检查程序中存在的问题。实验完成之后,应思考算法与源程序的评价与改进及对结果的影响等分析,提交实验源程序和实验报告。并要求用正规的实验报告纸和封面装订整齐,按时上交。2二、实验环境实验环境要求:硬件:普通PC386以上微机;软件:操作系统:Windows98/2000;开发语言:TurboC、VisualC++6.0、OpenGl,或其它学生掌握的高级语言。三、实验项目为加强学生对计算机图形学理论知识的进一步理解,本实验设计了五次实验,实验内容力求理论性和实用性的紧密结合。实验一、二、三、四为基础性实验,通过编程实现图形生成及处理变换的各种基本算法,从而使学生进一步理解和牢固掌握图形学中重要的理论知识,同时使用当前流行的图形和游戏开发工具OPENGL,实现相应的功能,让学生理解图形理论的实际应用;实验五为应用性实验,采用OPENGL对规则实体和不规则实体进行建模。该实验旨在提高学生的综合动手能力和创新能力,为以后从事图形、游戏及软件开发工作打下良好的基础。实验一:二维基本图形生成的算法实现实验二:图形的裁剪实验三:几何图形变换实验实验四:BEZIER曲线和B样条曲线的绘制实验五:采用OPENGL进行实体建模3实验一、二维基本图形生成的算法实现实验目的1、通过实验,进一步理解和掌握DDA和中点算法,Bresenham算法;2、掌握DDA和中点算法,中点算法,Bresenham算法算法生成直线段的基本过程。掌握中点画圆的算法。3、通过编程,会在VC++环境下完成用DDA、中点算法实现直线段的绘制和中点算法实现圆的绘制。实验属性该实验为验证性实验。实验学时2学时,必做实验。实验内容1、用DDA算法或中点(Besenham)算法实现直线段的绘制。2、用中点(Besenham)算法实现椭圆或圆的绘制。实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用VC++语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。原理分析DDA算法分析假设直线的起点坐标为P1(x1,y1),终点坐标为P2(x2,y2),x方向的增量为△x=x2-x1;y方向上增量为△y=y2-y1,直线的斜率为k=△y/△x当△x>△y时,让x从x1到x2变化,每步递增1,那么,x的变化可以表示为xi+1=xi+1,y的变化可以表示为yi+1=yi+k用上式可求得图中直线P1P2和y4向网格线的交点,但显示时要用舍入找到最靠近交点处的象素点耒表示。当△x△y时,让y递增1,x作相应变化。综合考虑,按照从(x1,y1)到(x2,y2)方向不同,分8个象限。对于方向在第1a象限内的直线而言,取增量值Dx=1,Dy=m。对于方向在第1b象限内的直线而言,取增量值Dy=1,Dx=1/m。直线Bresenham算法分析设直线从起点(x1,y1)到终点(x2,y2)。直线可表示为:方程y=mx+b,其中b=y1-m*x1,m=(y2-y1)/(x2-x1)=dy/dx;此处的讨论先将直线方向限于1a象限,在这种情况下,当直线光栅化时,x每次都增加1个单元,即xi+1=xi+1而y的相应增加值应当小于1。为了光栅化,yi+1只可能选择右图中两种位置之一。yi+1的位置选择yi+1=yi或者yi+1=yi+1,选择的原则是看精确值y与yi及yi+1的距离d1及d2的大小而定。计算公式为y=m(xi+1)+b(1)d1=y-yi(2)d2=yi+1-y(3)如果d1-d20,则yi+1=yi+1,否则yi+1=yi。将式(1)、(2)、(3)代入d1-d2,再用dx乘等式两边,并以Pi=(d1-d2)dx代入上述等式,得Pi=2xidy-2yidx+2dy+(2b-1)dxd1-d2是用以判断符号的误差。由于在1a象限,dx总大于0,所以Pi仍旧可以用作判断符号的误差。Pi+1为Pi+1=Pi+2dy-2(yi+1-yi)dx求误差的初值P1,可将x1、y1和b代入式(2.4)中的xi、yi而得到P1=2dy-dx综述上面的推导,第1a象限内的直线Bresenham算法思想如下:⒈画点(x1,y1),dx=x2-x1,dy=y2-y1,计算误差初值P1=2dy-5dx,i=1;⒉求直线的下一点位置xi+1=xi+1如果Pi0,则yi+1=yi+1,否则yi+1=yi;⒊画点(xi+1,yi+1);⒋求下一个误差Pi+1,如果Pi0,则Pi+1=Pi+2dy-2dx,否则Pi+1=Pi+2dy;⒌i=i+1;如果idx+1则转步骤2;否则结束操作。附注说明:有关的源码:DDA算法:voidCmyView::OnDdaline(){CDC*pDC=GetDC();//获得设备指针intxa=,ya=,xb=,yb=,c=RGB(255,0,0);intx,y;floatdx,dy,k;dx=(float)(xb-xa),dy=(float)(yb-ya);k=dy/dx;y=ya;if(abs(k)1){for(x=xa;x=xb;x++){pDC-SetPixel(x,int(y+0.5),c);y=y+k;}else{for(y=ya;y=yb;y++){pDC-SetPixel(int(x+0.5),y,c);x=x+1/k;}ReleaseDC(pDC);}//中点生成直线算法voidCmyView::OnMidPointline(){CDC*pDC=GetDC();//获得设备指针intxa=,ya=,xb=,yb=,c=RGB(255,0,0);floata,b,d1,d2,d,x,y;a=ya-yb,b=xb-xa,d=2*a+b;d1=2*a,d2=2*a+b;x=xa,y=ya;pDC-SetPixel(x,y,c);while(xxb){if(d0){x++,y++,d+=d2;}else{x++,d+=d1;}pDC-SetPixel(x,y,c);}ReleaseDC(pDC);}//Bresenham直线算法voidCmyView::OnBresenhamline(){CDC*pDC=GetDC();//获得设备指针intx1=,y1=,x2=,y2=,c=RGB(255,0,0);ints1,s2,interchange;elseinterchage=0;f=2*deltay-deltax;pDC-SetPixel(x,y,c);for(i=1;i=deltax;i++){if(f=0){if(interchange==1)x+=s1;6floatx,y,deltax,deltay,f,temp;x=x1;y=y1;deltax=abs(x2-x1);dletay=abs(y2-y1);if(x2-x1=0)s1=1;elses1=-1;if(y2-y1=0)s2=1;elses2=-1;if(deltaydeltax){temp=deltax;deltax=deltay;deltay=temp;interchange=1;}elsey+=s2;pDC-SetPixel(x,y,c);f=f-2*deltax;}else{if(interchange==1)y+=s2;elsex+=s1;f=f+2*deltay;}}ReleaseDC(pDC);}圆的Bresenham算法设圆的半径为r。先考虑圆心在(0,0),并从x=0、y=r,开始的顺时针方向的1/8圆周的生成过程。在这种情况下,x每步增加1,从x=0开始,到x=y结束。即有xi+1=xi+1相应的yi+1则在两种可能中选择:yi+1=yi或者yi+1=yi-1选择的原则是考察精确值y是靠近yi还是靠近yi-1(如右图),计算式为y2=r2-(xi+1)2d1=yi2-