图形学实验报告_第1页
图形学实验报告_第2页
图形学实验报告_第3页
图形学实验报告_第4页
图形学实验报告_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、课程设计报告实验名称:计算机图形学实验目录TOC o 1-5 h z HYPERLINK l bookmark4 o Current Document 实验目的与要求1实验任务内容与步骤1实验一1实验二3 HYPERLINK l bookmark20 o Current Document 实验结果3实验一结果3实验二结果8 HYPERLINK l bookmark28 o Current Document 心得体会8源代码9 1.1实验目的与要求:目的:利用OpenGL库,对课本的图形原理进行C语言编程,从而实现各种绘图算法。从中进一步了解计算机图形学的原理,加深对课程内容的理解,逐步掌握算法

2、原理的实现过程。另外,初步掌握OpenGL的基本使用方法,能够使用其进行简单图形、图素的绘制。实验要求:I理解glut程序框架理解窗口到视区的变换理解OpenGL实现动画的原理添加代码实现中点Bresenham算法画直线添加代码实现改进Bresenham算法画直线添加代码实现圆的绘制(可以适当对框架坐标系进行修改II.理解OpenGL中的变换过程理解透视投影与平行投影的不同添加代码实现太阳、地球和月亮的运动模型了解深度测试通过变换调整观察的位置与方向加入光照模型1.2实验一、利用各种算法实现直线与圆的扫描转换,在对应图中显示的同时,还要在控制台中打印显示像素点的坐标,以及误差d,e的值。中点B

3、resenham算法利用中点Bresenham算法画出直线,其中直线的斜率要求为:0=k=1.具体参数如下:x0,y0起点坐标x1,y1终点坐标num扫描转换时从起点开始输出的点的数目算法实现流程步骤:对斜率k以及扫描点个数进行可行性判断。2通过起始点和终点,确定最大位移方向。算出dO,以及dx,dy,由最大位移方向确定dx,dy在不同情况下的增量UpIncre,DownIncre。通过循环根据di逐步确定xi,yi,从而完成直线绘制。改进的Bresenham算法.利用改进的Bresenham算法画出直线,其中直线的斜率要求为:0二k=l.具体参数如下:x0,y0起点坐标x1,y1终点坐标nu

4、m扫描转换时从起点开始输出的点的数目.算法实现流程步骤:对斜率k以及扫描点个数进行可行性判断。通过起始点和终点,确定最大位移方向。算出dx,dy,由最大位移方向确定变化量e。通过循环根据逐步确定xi,yi,以及修改ei的值从而完成直线绘制。Bresenham算法画圆利用圆对称性八分法,以及Bresenham算法画圆。具体参数如下:x,yRnum圆心坐标圆半径扫描转换时从起点开始输出的点的数目.算法实现流程步骤:设置起点坐标,以及误差dO初始值。导出d在不同情况下的递推公式,以及x和y变化的范围(在八分之一圆弧范围内)。根据x,y的界限设置循环:按照八分法在不同位置同步显示像素点。:打印所显示像

5、素点的坐标。:由递推公式更新d以及x,y的值。实验二、根据原子核转动的模型,仔细研读代码,修改成:月球绕地球旋转,地球绕太阳旋转的地月模型。同时要求,各个天体用不同的颜色相区分,通过代码添加地球与月亮受太阳光照反射的光照效果。步骤:(1)初始化各种属性,光源颜色,材质属性,深度测试,多边形表示的方法以及背景颜色。(2)设置视区的大小尺寸,同时对空间进行修剪,确定观察空间。(3)在函数模块RenderScene中添加月亮绕地球旋转的恢复矩阵;再添加一个类似于电子的属性表,用以描述月亮;同时修改各个天体的颜色,用以区分。(4)调整各个天体的大小,同时对最大的天体太阳的显示边数进行修改,增加其边数使

6、太阳边界更为圆滑。(5)为月球绕地球的旋转添加新的旋转步长,使得月亮绕地球以及地球绕太阳旋转的速度有所区分,模拟出地月运行的效果。(6)在initial初始化函数中添加设置光照的代码,同时把光照效果中光源的坐标位置设置为与太阳坐标位置相同。(7)调试运行观察运行的情况,着重检查:天体间的运行是否具有相对独立性;光照效果中,由于太阳本身是光源因此不应该存在光照效果1.3实验结果实验一、1)DDA画线算法:图1.1各像素点坐标:n軸画线算法復各点坐标XXXXXXX1.8K00R0,9=目.7E8000,2.8K00fiti,y=l.S80000,3”y=2.2500,4.8K00fiti,y=3.

7、0tf0000,5.8K00fili,y=3.7E8000,6.8K00fili,y=4.S80000,x=,y=3x=l,y=lx=2,y=2x=3,y=2x=4,y=3x=S,y=4x=6,y=5XXXXX7.y=S,2500,4S.8K00BW,y=&-0tf0000,J;9.y=6.?E皆剧械事,耳10.000fiW0,iF=?.5B00R0,11.12.000fiW0,iF=?.8000fili,13.?E阿械恋0,14.000fiW0,iF=10.XxXX.00BtS0,iF=12.00S5ftS0,0B00,y=12.n00BtS0,iF=13.Ei8StftS0,0B00,y=

8、14.23.S00BW0,.000tftS0,图1.22)中点Bresenham算法:扫描转化情况:x=7,y=5x=8,=6x=9,y=7x=10J.y=8x=ll,y=8x=12,y=9x=13,y=10 xXXXXXXy=lly=lly=12y=13y=14y=142.y=lEi像素点机误差d的值:图1.43)改进的Bresenham算法:各点坐标及判别式的值图1.6像素点坐标及误差e:Bresenham算法画直线x=0,y=0,e=-20 x=l,iF=l,e=-30 x=2,y=l,e=0 x=3,y=2,e=-lBx=4,y=3,e=-2ex=5,y=4,e=-30 x=6,y=4

9、,e=E*x=7,y=E,e=-lE?x=8,y=6,e=-20 x=9,y=7,e=-30 x=10,y=?,e=0 x=ll,y=8,e=-lE!x=12,y=9,e=-20 x=13,x=14y=10e=0 x=15,y=ll,e=-10 x=16,iF=12,e=-20 x=17,y=13,e=-30 x=18,y=13,e=0 x=19,y=14,e=-lSx=20,/=15,e=-20(3)Bresenham算法画圆圆的扫描转化:图1.8图1.9图1.10圆的像素点坐标值及误差d:h创算法画圆:各点坐标斥判别式的值x=13,y=23,d=-9x=23,y=13,d=-9x=13,y

10、=23,d=-9x=23,y=13,d=-9x=13,y=H,d=-9x=23,y=13,d=-9x=13J.y=3,(1=-9x=23,y=13,d=-9x=14,i/=23,d=-6x=23,/=13,d=-9x=12,v=23,d=-6x=23,y=13,d=-9x=12,y=3,d=-6x=23,y=13,d=-9x=14,y=3,d=-6x=23,y=13,d=-9x=15J.i/=23,d=-lx=23,y=13,d=-9x=ll=23.d=-lx=23,y=13,d=-9x=ll,iF=3,d=-lx=23,/=13,d=-9x=15,/=3,d=-lx=23,y=13,d=-9

11、x=16,y=23,d=6x=23,y=13,d=-9x=10,y=23,d=6x=23,y=13,d=-9x=10J.i/=3,(1=6x=23,y=13,d=-9x=16J.y=3,(1=6x=23,y=13,d=-9x=17,iF=22,d=-3x=23,/=13,d=-9x=9,y=22,d=-3x=23,y=13,d=-9x=9,y=4,d=-3x=23,y=13,d=-9x=17,y=4,d=-3x=23,y=13,d=-9x=18,/=22,d=8x=23,y=13,d=-9x=8,y=22,d=8x=23,u=13,d=-9图1.11XXXXXXXXXXXXXXXXXXXXXX

12、XXXXXXXXXXXXXXXXXXXXXX戟霰霰議議議霰霰議議霰議霰議議霰議霰KK議議霰霰議議議霰霰議議議霰霰議議霰議霰議議議議霰KmnFnFnrni帀mnFnFnrni帀帀市mn帀帀帀市mnFnrnn刃帀mnFnrn4-1.1可帀mnFnrn4-1.1帀mTmn刃7,Sf=5,d=523,y=13,d=-9y=5,d=523,y=13,d=-9y=20,d=623,y=13,d=-96J.y=20,d=623,y=13,d=-96,y=6,d=623,y=13,d=-920,=6,(1=623,y=13,d=-923,y=13,d=-93,p=13,d=-93,=13,d=-923,y=1

13、3,d=-923,y=14,d=-63,y=14,d=-63,p=12,d=-623,y=12,d=-623,y=15,d=-l3,sf=15,d=-l3,y=ll,d=-l23,y=ll,d=-l23,y=16,d=63J.y=16,d=6y=10.d=623,y=10,d=622,y=17,d=-3y=17,d=-34,sf=9,d=-322,y=9.d=-322,y=18,d=84,p=18,d=8p=8,d=822-y=8.d=8y=19,d=55,sf=19,d=5=7,d=521,y=7,d=520,y=20,d=66J.y=20,d=62B,y=6,d=6图1.12实验二、地月模

14、型结果图2.1图2.21.4心得体会:本次实验,通过OpenGL的图形库实现了各种图形的扫描算法。在把用数学和自然语言描述的算法转化成C语言代码从而付诸于程序实现的过程中,也加深了对各个算法的理解。通过运行各个算法,尤其是直线扫描的各个算法的结果,可以看出各个算法的执行结果并不一致,直线不滑行在不同的情况下也有所区别,这是仅仅通过学习算法原理所不能获得的体会。而且程序运行的过程是一步步分解的过程,例如八分法画圆的算法,就可以看出从圆弧生成真个圆形的全过程,是化抽象为具体的一个很好的例子。另一方面,在OpenGL图形库的帮助下,完成了很多复杂的图形程序,如地月模型,也让我认识的这个图形库功能的强

15、大。而在助教检查验收时,对我们提出的种种问题,有时候也没法及时回答上来,这是自己对算法了解仍不够透彻的体现,希望以后多加努力。总而言之,本次实验通过化抽象为具体,使我能够直观地认识到图形学中很多算法的执行原理与效果,是对课程的一次很好的延伸与拓展。1.5源程序:实验一、#include#include#includestdio.hintm_PointNumber=0;/动画时绘制点的数目intm_DrawMode=1;/绘制模式1DDA算法画直线/2中点Bresenham算法画直线/3改进Bresenham算法画直线/4八分法绘制圆/5四分法绘制椭圆voidDrawCordinateLine(

16、void)inti=0;/坐标线为黑色glColor3f(0.0f,0.0f,0.0f);glBegin(GL_LINES);for(i=10;iabs(dy)epsl=abs(dx);elseepsl=abs(dy);xIncre=(float)dx/epsl;yIncre=(float)dy/epsl;for(k=0;k=num-1)printf(x=%f,y=%f取整后x=%d,y=%dn,x,y,(int)(x+05),(int)(y+05);break;x+=xIncre;y+=yIncre;if(x=25|y=25)break;/TOC o 1-5 h z中点Bresenham算法

17、画直线(0v=kv=1)II参数说明:x0,y0起点坐标IIIIx1,y1终点坐标IIIInum扫描转换时从起点开始输出的点的数目,用于动画IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIvoidBresenhamLine(GLsizeix0,GLsizeiy0,GLsizeix1,GLsizeiy1,GLsizeinum)glColor3f(1.0f,0.0f,0.0f);intk=0;if(num=1)printf(中点Bresenham算法画直线:各点坐标及判别式的值n);elseif(num=0)

18、return;GLsizeidx,dy,d,UpIncre,DownIncre,x,y,xend;if(x0 x1)x=x1;x1=x0;x0=x;y=y1;y1=y0;y0=y;x=x0;y=y0;dx=x1-x0;dy=y1-y0;d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(xv=x1)putpixel(x,y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,x,y,d);break;k+;x+;if(d=num-1)printf(取整后x=%d,y=%d,e=%dn,x,y,e);break;k+;put

19、pixel(x,y);x+;e=e+2*dy;if(e0)y+;e=e-2*dx;/Bresenham算法画圆/参数说明:x,y圆心坐标/R圆半径/num扫描转换时从起点开始输出的点的数目,用于动画/voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum)glColor3f(1.0f,0.0f,0.0f);if(num=1)printf(Bresenham算法画圆:各点坐标及判别式的值n);inti=1;GLsizeid,swap;x=0;y=R;d=1-R;intk=0;for(i=1;i=2;i+)x=0;y=R;d=1-R;wh

20、ile(x=num-1)printf(取整后x=%d,y=%d,d=%dn,13+x,13+y,d);break;k+;putpixel(13+x,13+y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13-x,13+y,d);break;k+;putpixel(13-x,13+y);if(k=num-1)prinf(取整后x=%d,y=%d,d=%dn,13-x,13-y,d);break;k+;putpixel(13-x,13-y);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+x,13-y,d);break;k+;putp

21、ixel(13+x,13-y);elseif(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+y,13+x,d);break;k+;putpixel(13+y,13+x);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13-y,13+x,d);break;k+;putpixel(13-y,13+x);if(k=num-1)prinf(取整后x=%d,y=%d,d=%dn,13-y,13-x,d);break;k+;putpixel(13-y,13-x);if(k=num-1)printf(取整后x=%d,y=%d,d=%dn,13+y,13

22、-x,d);break;k+;putpixel(13+y,13-x);if(d0)d+=2*x+3;elsed+=2*(x-y)+5;y-;x+;/初始化窗口voidInitial(void)/设置窗口颜色为蓝色glClearColor(1.0f,1.0f,1.0f,1.0f);/窗口大小改变时调用的登记函数voidChangeSize(GLsizeiw,GLsizeih)if(h=0)h=1;/设置视区尺寸glViewport(0,0,w,h);/重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/建立修剪空间的范围if(w=h)glOrt

23、ho(0.0f,250.0f,0.0f,250.0f*h/w,1.0,-1.0);elseglOrtho(0.0f,250.0f*w/h,0.0f,250.0f,1.0,-1.0);/在窗口中绘制图形voidReDraw(void)/用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);/画出坐标线DrawCordinateLine();switch(m_DrawMode)case1:DDACreateLine(0,0,20,15,m_PointNumber);break;case2:BresenhamLine(0,0,20,15,m_PointNumber);brea

24、k;case3:Bresenham2Line(0,0,20,15,m_PointNumber);break;case4:BresenhamCircle(0,0,10,m_PointNumber);break;default:break;glFlush();/设置时间回调函数voidTimerFunc(intvalue)if(m_PointNumber=0)value=1;m_PointNumber=value;glutPostRedisplay();glutTimerFunc(500,TimerFunc,value+1);/设置键盘回调函数voidKeyboard(unsignedcharke

25、y,intx,inty)if(key=1)m_DrawMode=1;if(key=2)m_DrawMode=2;if(key=3)m_DrawMode=3;if(key=4)m_DrawMode=4;m_PointNumber=0;glutPostRedisplay();/voidmain(void)intmain(intargc,char*argv)glutInit(&argc,argv);初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(600,600);glutInitWin

26、dowPosition(100,100);glutCreateWindow(基本图元绘制程序);glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize);glutKeyboardFunc(Keyboard);/键盘响应回调函数glutTimerFunc(500,TimerFunc,1);/窗口初始化Initial();glutMainLoop();/启动主GLUT事件处理循环return0;实验二、#include#include#include#includevoidInitial()/太阳白色光源GLfloatmat_ambient=0.2f,

27、0.2f,0.2f,0.1f;GLfloatmat_diffuse=0.9f,0.9f,0.9f,1.0f;GLfloatmat_specular=1.0f,1.0f,1.0f,1.0f;GLfloatmat_shininess=25.0f;GLfloatmat_emission=0.0f,0.0f,0.0f,1.0f;GLfloatlight0_diffuse=1.0f,1.0f,1.0f,1.0f;GLfloatlight0_position=0.0f,30.0f,-250.0f,1.0f;/GLfloatlight1_ambient=0.2f,0.2f,0.2f,1.0f;/GLfloa

28、tlight1_diffuse=0.2f,0.2f,0.2f,1.0f;/GLfloatlight1_position=0.0f,0.0f,250.0f,0.0f;GLfloatspot_direction=1.0f,1.0f,-1.0f;/定义材质属性glMaterialfv(GL_FRONT,GL_AMBIENT,mat_ambient);glMaterialfv(GL_FRONT,GL_DIFFUSE,mat_diffuse);glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular);glMaterialfv(GL_FRONT,GL_SHININESS,mat_shininess);glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission);glLightfv(GL_LIGHT0,GL_DIFFUSE,light0_diffuse);glLightfv(GL_LIGHT0,GL_POSITION,light0_position);/glLightfv(GL_LIGHT1,GL_DIFFUSE,light1_diffuse);/g

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论