您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 华中科技大学计算机图形学实验报告——画直线、日地月模型
计算机图形学基础实验报告专业:班级:姓名:学号:日期:OpenGL简介(1)OpenGL作为一个性能优越的图形应用程序设计界面(API),它独立于硬件和窗口系统,在运行各种操作系统的各种计算机上都可用,并能在网络环境下以客户/服务器模式工作,是专业图形处理、科学计算等高端应用领域的标准图形库。它具有以下功能。1.模型绘制2.模型观察在建立了三维景物模型后,就需要用OpenGL描述如何观察所建立的三维模型。3.颜色模式的指定OpenGL应用了一些专门的函数来指定三维模型的颜色。4.光照应用用OpenGL绘制的三维模型必须加上光照才能更加与客观物体相似。5.图象效果增强OpenGL提供了一系列的增强三维景观的图象效果的函数,这些函数通过反走样、混合和雾化来增强图象的效果。6.位图和图象处理OpenGL还提供了专门对位图和图象进行操作的函数。7.纹理映射8.实时动画9.交互技术图1.1OpenGL图形处理系统的层次结构(2)OpenGL的操作步骤在OpenGL中进行的图形操作直至在计算机屏幕上渲染绘制出三维图形景观的基本步骤如下:1.根据基本图形单元建立景物模型,得到景物模型的数学描述(OpenGL中把点、线、多边形、图像和位图都作为基本图形单元);2.把景物模型放在三维空间中的合适的位置,并且设置视点(Viewpoint)以观察所感兴趣的景观;3.计算模型中所有物体的色彩,同时确定光照条件、纹理粘贴方式等;4.把景物模型的数学描述及其色彩信息转换至计算机屏幕上的像素,这个过程也就是光栅化(rasterization)。在这些步骤的执行过程中,OpenGL可能执行其他的一些操作,例如自动消隐处理等。另外,景物光栅化之后被送入帧缓冲器之前还可以根据需要对象素数据进行操作。(3)OpenGL的组成OpenGL不是一种编程语言,而是一种API(应用程序编程接口),它实际上是一种图形与硬件的接口,包括了多个图形函数。OpenGL主要由以下函数库组成。1.OpenGL核心库OpenGL核心库中包含了115个最基本的命令函数,它们都是以“gl”为前缀,可以在任何OpenGL的工作平台上应用。这部分函数用于常规的、核心的图形处理,如建立各种各样的几何模型,产生光照效果,进行反走样以及进行纹理映射,以及进行投影变换等等。由于许多函数可以接收不同数据类型的参数,因此派生出来的函数原形有300多个。2.OpenGL实用程序库OpenGL的实用程序库包含有43个函数,以“glu”为前缀,在任何OpenGL平台都可以应用。这部分函数通过调用核心库的函数,来实现一些较为复杂的操作,如纹理映射、坐标变换、网格化、曲线曲面以及二次物体(圆柱、球体等)绘制等。3.OpenGL编程辅助库OpenGL的辅助库包含31个函数,以“aux”为前缀,但它们不能在所有的OpenGL平台上使用。OpenGL的辅助库的函数主要用于窗口管理、输入输出处理以及绘制一些简单的三维形体。4.OpenGL实用程序工具包OpenGL实用程序工具包(OpenGLutilitytoolkit,GLUT)包含30多个函数,函数名前缀是“glut”。其中的函数主要提供基于窗口的工具,如窗口系统的初始化,多窗口管理,菜单管理,字体以及一些较复杂物体的绘制等。由于glut库中的窗口管理函数是不依赖于运行环境的,因此OpenGL中的工具库可以在所有的OpenGL平台上运行,在后面的示例中,我们均使用glut库建立OpenGL程序运行框架。5.Windows专用库Windows专用库函数包含有6个,每个函数以wgl开头,用于连接OpenGL和WindowsNT,这些函数用于在WindowsNT环境下的OpenGL窗口能够进行渲染着色,在窗口内绘制位图字体以及把文本放在窗口的某一位置等这些函数把Windows和OpenGL揉合在一起。6.Win32API函数库这部分函数没有专用的前缀,主要用于处理像素存储格式和双帧缓存。实验一一、实验目的理解glut程序框架;理解窗口到视区的变换;理解OpenGL实现动画的原理理解所学的画直线以及圆的各种算法,利用所学的算法,绘制基本的直线以及圆。二、实验内容1.添加代码实现中点Bresenham算法画直线2.添加代码实现改进Bresenham算法画直线3.添加代码实现圆的绘制(可以适当对框架坐标系进行修改)三、实验算法分析1.中点Bresenham算法:根据直线的斜率确定或选择变量在x或y方向上每次递增一个单位,而另一方向的增量为1或0,它取决于实际直线与相邻象素点的距离,这一距离称为误差项。判别式:则有:误差项的递推:d0:d=0:)1(5.0)5.0,1(),(bxkyyxFyxFdiiiiMM)0()0(1111dydyyxxiiiiibxkyyxFdiiii)1(5.0)5.0,1(1bxkyyxFdiiii)2(5.1)5.1,2(2kdkbxkydii11)1(5.012bxkyyxFdiiii)1(5.0)5.0,1(1bxkyyxFdiiii)2(5.0)5.0,2(2kdkbxkydii12)1(5.0初始值d的计算:则有:0≤k≤1时Bresenham算法的算法步骤为:(1)输入直线的两端点P0(x0,y0)和P1(x1,y1)。(2)计算初始值△x、△y、d=0.5-k、x=x0、y=y0;(3)绘制点(x,y)。判断d的符号;若d0,则(x,y)更新为(x+1,y+1),d更新为d+1-k;否则(x,y)更新为(x+1,y),d更新为d-k。(4)当直线没有画完时,重复步骤3。否则结束。2.改进Bresenham算法:原理如下;误差项的计算d初=0,每走一步:d=d+k一旦y方向上走了一步,d=d-1改进1:令e=d-0.5误差项的计算d初=0,e初=-0.5,每走一步:d=d+k每走一步有e=e+k。if(e0)thend=d-1if(e0)thene=e-1改进2:用E=2e△x来替换e;e初=-0.5E初=-0.5*2△x=-△x每走一步有e=e+k每走一步有E=(e+k)*2△x=E+2△yif(e0)thene=e-1if(e0)thenE=(e-1)*2△x=E-2△x算法步骤:(1)输入直线的两端点P0(x0,y0)和P1(x1,y1)。(2)计算初始值△x、△y、e=-△x、x=x0、y=y0。(3)绘制点(x,y)。(4)e更新为e+2△y,判断e的符号。若e0,则(x,y)更新为(x+1,y+1),同时将e更新为e-2△x;否则(x,y)更新为(x+1,y)。(5)当直线没有画完时,重复步骤3和4。否则结束。3.画圆算法:kkbkxybxkyyxFd5.05.0)1(5.0)5.0,1(00000000.5)(d0.5)(d1111iiiiiyyyxx0.5)(d0.5)(d1111iiiiiyyyxx0)(e0)(e1111iiiiiyyyxx八分画圆法中点Bresenham画圆:构造判别式:当d≤0时,下一点取Pu(xi+1,yi);当d0时,下一点取Pd(xi+1,yi-1)。d0:d≤0:初始值:用d-0.25代替d则:025.0025.0dddd算法步骤:(1)输入圆的半径R。(2)计算初始值d=1-R、x=0、y=R。(3)绘制点(x,y)及其在八分圆中的另外七个对称点。(x,y)yy=-xy=x222)5.0()1()5.0,1(),(RyxyxFyxFdiiiiMM2222)5.1()2()5.1,2(RyxyxFdiiii5)(25)(2)5.0()1(1)5.0(2)5.0(32)1()15.0()11(1222222222iiiiiiiiiiiiyxdyxyxRyyxxRyxd2222)5.0()2()5.0,2(RyxyxFdiiii32)5.0(32)1()5.0()11(12222222iiiiiixdRyxxRyxdRRRRFyxFd25.1)5.0(1)5.0,1()5.0,1(22000Rddyxdddxddiii125.05)(225.0320(4)判断d的符号。若d0,则先将d更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1)。(5)当xy时,重复步骤3和4。否则结束。四、运行结果中点Bresenham算法画直线:改进的Bresenham算法画直线:画圆:五、心得体会这次试验有很大收获,首先加深了对书上几种算法画直线、画圆的理解;其次,对OpenGL的运用熟练了很多,清楚了OpenGL写程序的大致框架,一些典型OpenGL语句的意义及运用都熟悉了很多。可以说,这次试验还是比较简单的几乎没有遇见任何难处,只是开始的时候没有理解题目的要求,画了四分之一个圆,助教指出错误后,把对称画圆的圆心改变后就成功的画出了一个圆。最后,感谢助教的指导和老师的教诲。六、源程序#includewindows.h#includegl/glut.h#includestdio.hintm_PointNumber=0;//动画时绘制点的数目intm_DrawMode=4;//绘制模式1DDA算法画直线//2中点Bresenham算法画直线//3改进Bresenham算法画直线//4八分法绘制圆//5四分法绘制椭圆//绘制坐标线voidDrawCordinateLine(void){inti=0;//坐标线为黑色glColor3f(0.0f,0.0f,0.0f);glBegin(GL_LINES);for(i=10;i=250;i=i+10){glVertex2f((float)(i),0.0f);glVertex2f((float)(i),250.0f);glVertex2f(0.0f,(float)(i));glVertex2f(250.0f,(float)(i));}glEnd();}//绘制一个点,这里用一个正方形表示一个点。voidputpixel(GLsizeix,GLsizeiy){glRectf(10*x,10*y,10*x+10,10*y+10);}///////////////////////////////////////////////////////////////////////////DDA画线算法////参数说明:x0,y0起点坐标////x1,y1终点坐标////num扫描转换时从起点开始输出的点的数目,用于动画//////////////////////////////////////////////////////////////////////////voidDDACreateLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum){//设置颜色glColor3f(1.0f,0.0f,0.0f);//对画线动画进行控制if(num==1)printf(DDA画线算法:各点坐标\n);elseif(num==0)return;//画线算法的实现GLsizeidx,dy,epsl,k;GLfloatx,y,xIncre,yIncre;dx=x1-x0;dy=y1-y0;x=x0;y=y0;if(abs(dx)abs(dy))epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/epsl;yIncr
本文标题:华中科技大学计算机图形学实验报告——画直线、日地月模型
链接地址:https://www.777doc.com/doc-5570567 .html