




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、课 程 设 计 报 告实验名称: 计算机图形学实验 目 录1.1 实验目的与要求.11.2 实验任务内容与步骤.1实验一.1 实验二.31.3 实验结果.3实验一结果.3实验二结果.81.4 心得体会.81.5 源代码.91.1 实验目的与要求:目的: 利用OpenGL库,对课本的图形原理进行C语言编程,从而实现各种绘图算法。从中进一步了解计算机图形学的原理,加深对课程内容的理解,逐步掌握算法原理的实现过程。另外,初步掌握OpenGL的基本使用方法,能够使用其进行简单图形、图素的绘制。 实验要求:I(1)理解glut程序框架(2)理解窗口到视区的变换(3)理解OpenGL实现动画的原理(4)添
2、加代码实现中点Bresenham算法画直线(5)添加代码实现改进Bresenham算法画直线(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改II.(1)理解OpenGL中的变换过程(2)理解透视投影与平行投影的不同(3)添加代码实现太阳、地球和月亮的运动模型(4)了解深度测试(5)通过变换调整观察的位置与方向(6)加入光照模型 1.2 实验内容和实验步骤:实验一、利用各种算法实现直线与圆的扫描转换,在对应图中显示的同时,还要在控制台中打印显示像素点的坐标,以及误差d,e的值。(1)中点Bresenham算法利用中点Bresenham算法画出直线,其中直线的斜率要求为:0<=k&l
3、t;=1.具体参数如下: x0,y0 起点坐标x1,y1 终点坐标num 扫描转换时从起点开始输出的点的数目算法实现流程步骤: 1. 对斜率k以及扫描点个数进行可行性判断。 2通过起始点和终点,确定最大位移方向。 3. 算出d0,以及dx,dy,由最大位移方向确定dx,dy在不同情况下的增量UpIncre,DownIncre。 4. 通过循环根据di逐步确定xi,yi,从而完成直线绘制。(2)改进的Bresenham算法利用改进的Bresenham算法画出直线,其中直线的斜率要求为:0<=k<=1.具体参数如下: x0,y0 起点坐标x1,y1 终点坐标num 扫描转换时从起点开始
4、输出的点的数目算法实现流程步骤: 1. 对斜率k以及扫描点个数进行可行性判断。 2通过起始点和终点,确定最大位移方向。 3. 算出dx,dy,由最大位移方向确定变化量e。 4. 通过循环根据逐步确定xi,yi,以及修改ei的值从而完成直线绘制。(3)Bresenham算法画圆利用圆对称性八分法,以及Bresenham算法画圆。具体参数如下: x,y 圆心坐标 R 圆半径 num 扫描转换时从起点开始输出的点的数目 算法实现流程步骤: 1. 设置起点坐标,以及误差d0初始值。 2导出d在不同情况下的递推公式,以及x和y变化的范围(在 八分之一圆弧范围内)。 3. 根据x,y的界限设置循环: :按
5、照八分法在不同位置同步显示像素点。 :打印所显示像素点的坐标。 :由递推公式更新d以及x,y的值。实验二、根据原子核转动的模型,仔细研读代码,修改成:月球绕地球旋转,地球绕太阳旋转的地月模型。同时要求,各个天体用不同的颜色相区分,通过代码添加地球与月亮受太阳光照反射的光照效果。步骤:(1) 初始化各种属性,光源颜色,材质属性,深度测试,多边形表示的方法以及背景颜色。(2) 设置视区的大小尺寸,同时对空间进行修剪,确定观察空间。(3) 在函数模块RenderScene中添加月亮绕地球旋转的恢复矩阵;再添加一个类似于电子的属性表,用以描述月亮;同时修改各个天体的颜色,用以区分。(4) 调整各个天体
6、的大小,同时对最大的天体太阳的显示边数进行修改,增加其边数使太阳边界更为圆滑。(5) 为月球绕地球的旋转添加新的旋转步长,使得月亮绕地球以及地球绕太阳旋转的速度有所区分,模拟出地月运行的效果。(6) 在initial初始化函数中添加设置光照的代码,同时把光照效果中光源的坐标位置设置为与太阳坐标位置相同。(7) 调试运行观察运行的情况,着重检查:天体间的运行是否具有相对独立性;光照效果中,由于太阳本身是光源因此不应该存在光照效果1.3 实验结果:实验一、(1)DDA画线算法:图1.1各像素点坐标:图1.2(2) 中点Bresenham算法:扫描转化情况:图1.3像素点机误差d的值:图1.4(3)
7、 改进的Bresenham算法 扫描转化结果:图1.5像素点坐标及误差e:图1.6(3)Bresenham算法画圆圆的扫描转化: 图1.7 图1.8 图1.9 图1.10圆的像素点坐标值及误差d: 图1.11 图1.12实验二、地月模型结果:图2.1图2.21.4 心得体会: 本次实验,通过OpenGL的图形库实现了各种图形的扫描算法。在把用数学和自然语言描述的算法转化成C语言代码从而付诸于程序实现的过程中,也加深了对各个算法的理解。通过运行各个算法,尤其是直线扫描的各个算法的结果,可以看出各个算法的执行结果并不一致,直线不滑行在不同的情况下也有所区别,这是仅仅通过学习算法原理所不能获得的体会
8、。而且程序运行的过程是一步步分解的过程,例如八分法画圆的算法,就可以看出从圆弧生成真个圆形的全过程,是化抽象为具体的一个很好的例子。另一方面,在OpenGL图形库的帮助下,完成了很多复杂的图形程序,如地月模型,也让我认识的这个图形库功能的强大。而在助教检查验收时,对我们提出的种种问题,有时候也没法及时回答上来,这是自己对算法了解仍不够透彻的体现,希望以后多加努力。总而言之,本次实验通过化抽象为具体,使我能够直观地认识到图形学中很多算法的执行原理与效果,是对课程的一次很好的延伸与拓展。1.5 源程序:实验一、#include <windows.h>#include <gl/gl
9、ut.h>#include "stdio.h"int m_PointNumber = 0; /动画时绘制点的数目int m_DrawMode = 1; /绘制模式 1 DDA算法画直线 / 2 中点Bresenham算法画直线 / 3 改进Bresenham算法画直线 / 4 八分法绘制圆 / 5 四分法绘制椭圆void DrawCordinateLine(void)int i = 0 ;/坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES); for (i=10;i<=250;i=i+10)glVertex2f
10、(float)(i), 0.0f);glVertex2f(float)(i), 250.0f);glVertex2f(0.0f, (float)(i);glVertex2f(250.0f, (float)(i);glEnd();/绘制一个点,这里用一个正方形表示一个点。void putpixel(GLsizei x, GLsizei y)glRectf(10*x,10*y,10*x+10,10*y+10);/DDA画线算法 /参数说明:x0,y0 起点坐标 / / x1,y1 终点坐标 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void DDACreateLine(GL
11、sizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)/设置颜色glColor3f(1.0f,0.0f,0.0f);/对画线动画进行控制if(num = 1)printf("DDA画线算法:各点坐标n");else if(num=0)return;/画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,xIncre,yIncre;dx = x1-x0;dy = y1-y0;x = x0;y = y0;if(abs(dx) > abs(dy) epsl = abs(dx);else
12、epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; k+)putpixel(int)(x+0.5), (int)(y+0.5);if (k>=num-1) printf("x=%f,y=%f,取整后 x=%d,y=%dn", x, y, (int)(x+0.5),(int)(y+0.5);break;x += xIncre;y += yIncre;if(x >= 25 | y >= 25) break;/中点Bresenham
13、算法画直线(0<=k<=1) /参数说明:x0,y0 起点坐标 / / x1,y1 终点坐标 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);int k=0;if(num = 1)printf("中点Bresenham算法画直线:各点坐标及判别式的值n");else if(num=0)return;GLsizei dx,dy,d,UpIn
14、cre,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(x<=x1)putpixel(x,y);if (k>=num-1) printf("取整后 x=%d,y=%d,d=%dn", x, y,d);break;k+;x+;if(d<0)y+;d+=UpIncre;elsed+=DownIncre;/改进的Bresenham算
15、法画直线(0<=k<=1) /参数说明:x0,y0 起点坐标 / / x1,y1 终点坐标 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf("改进的Bresenham算法画直线:各点坐标及判别式的值n");else if(num=0)return;int k=0;GLsizei x,y,dx,dy,e
16、;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while(x<=x1)if (k>=num-1) printf("取整后 x=%d,y=%d,e=%dn", x, y,e);break;k+;putpixel(x,y);x+;e=e+2*dy;if(e>0)y+;e=e-2*dx;/Bresenham算法画圆 /参数说明:x,y 圆心坐标 / / R 圆半径 / / num 扫描转换时从起点开始输出的点的数目,用于动画 / void BresenhamCircle(GLsizei x, GLsizei y, GLsizei R, G
17、Lsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf("Bresenham算法画圆:各点坐标及判别式的值n");int i=1;GLsizei d,swap;x=0;y=R;d=1-R;int k=0;for(i=1;i<=2;i+) x=0;y=R;d=1-R;while(x<=y)if(i=1)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&
18、gt;=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) printf("取整后 x=%d,y=%d,d=%dn", 13+x, 13-y,d);break;k+;putpixel(13+x,13-y);elseif
19、 (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) printf("取整后 x=%d,y=%d,d=%dn", 13-y, 13-x,d);break;k+;putpixel(13-y,13-x);if
20、 (k>=num-1) printf("取整后 x=%d,y=%d,d=%dn", 13+y, 13-x,d);break;k+;putpixel(13+y,13-x);if(d<0)d+=2*x+3;elsed+=2*(x-y)+5;y-;x+;/初始化窗口void Initial(void) / 设置窗口颜色为蓝色 glClearColor(1.0f, 1.0f, 1.0f, 1.0f);/ 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h)if(h = 0)h = 1;/ 设置视区尺寸 glViewpor
21、t(0, 0, w, h);/ 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 建立修剪空间的范围 if (w <= h) glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0); else glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);/ 在窗口中绘制图形void ReDraw(void)/用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);/画出坐标线DrawCordinateLine();swi
22、tch(m_DrawMode)case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,20,15,m_PointNumber);break;case 3:Bresenham2Line(0,0,20,15,m_PointNumber);break;case 4:BresenhamCircle(0,0,10,m_PointNumber);break;default:break; glFlush();/设置时间回调函数void TimerFunc(int value)if(m_PointNumber =
23、 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);/设置键盘回调函数void Keyboard(unsigned char key, int x, int y) if (key = '1') m_DrawMode = 1;if (key = '2') m_DrawMode = 2;if (key = '3') m_DrawMode = 3;if (key = '4') m_DrawMode =
24、4;m_PointNumber = 0;glutPostRedisplay();/void main(void)int main(int argc, char* argv)glutInit(&argc, argv);/初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowSize(600,600);glutInitWindowPosition(100,100);glutCreateWindow("基本图元绘制程序"); glutDisplayFunc(ReDra
25、w); glutReshapeFunc(ChangeSize); glutKeyboardFunc(Keyboard);/键盘响应回调函数glutTimerFunc(500, TimerFunc, 1); / 窗口初始化 Initial();glutMainLoop(); /启动主GLUT事件处理循环return 0;实验二、#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>void Initial()/太阳白色光源GLfloat mat_am
26、bient=0.2f,0.2f,0.2f,0.1f;GLfloat mat_diffuse=0.9f,0.9f,0.9f,1.0f;GLfloat mat_specular=1.0f,1.0f,1.0f,1.0f;GLfloat mat_shininess=25.0f;GLfloat mat_emission=0.0f,0.0f,0.0f,1.0f;GLfloat light0_diffuse=1.0f,1.0f,1.0f,1.0f;GLfloat light0_position=0.0f,30.0f,-250.0f,1.0f;/GLfloat light1_ambient=0.2f,0.2f
27、,0.2f,1.0f;/GLfloat light1_diffuse=0.2f,0.2f,0.2f,1.0f;/GLfloat light1_position=0.0f,0.0f,250.0f,0.0f;GLfloat spot_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
28、(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);/glLightfv(GL_LIGHT1,GL_POSITION,light1_position);/glLightModefv(GL_LI
29、GHT_AMBIENT,1.0f,1.0f,1.0f,1.0f);glColorMaterial(GL_FRONT_AND_BACK,GL_EMISSION);glEnable(GL_COLOR_MATERIAL);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);/ 启用深度测试glFrontFace(GL_CCW);/ 指定逆时针绕法表示多边形正面glClearColor(1.0f, 1.0f, 1.0f, 1.0f );/背景为白色void ChangeSize(int w, int h)if(h = 0)
30、h = 1;/ 设置视区尺寸 glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();/ 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45.0, fAspect, 1.0, 500.0);/* if (w <= h) glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);else glOrtho (-nRange*w/h,
31、nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f);*/gluPerspective(45.0,(double)w/(double)h,0,0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();void RenderScene(void)/ 绕原子核旋转的角度static float fElect1 = 0.0f; static float fElect11 = 0.0f;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ 重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();/将图形沿z轴负向移动glTranslatef(0.0f, 30.0f, -250.0f);/ 绘制红色的原子核glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(20.0f, 55, 55);/ 当前绘制颜色变为lan色glColor3f(0.0f, 0.0f, 1.0f);/绘制第一个ear
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 微型热电制冷机温度场分析及性能优化
- 2025至2030年中国管盖市场分析及竞争策略研究报告
- 2024年安徽阜阳市明珲阳光电力维修服务有限公司招聘33人(第一批次)笔试参考题库附带答案详解
- 2025至2030年中国硫氰酸红霉素市场现状分析及前景预测报告
- 施工现场极端大风天气安全防范措施1
- 2025至2030年中国直柄六角尖尾扳手行业投资前景及策略咨询报告
- 农资器械租赁合同标准文本
- 加强市场定位与品牌策略的计划
- 建立良好的工作氛围的年度措施计划
- 增强品牌传播的营销计划
- 中药的道地药材课件
- 《跋傅给事帖》2020年浙江嘉兴中考文言文阅读真题(含答案与翻译)
- 幼儿园《3-6岁儿童学习与发展指南》健康领域知识试题及答案
- 国家职业技能标准 (2021年版) 婴幼儿发展引导员
- 幼儿园小班科学:《小鸡和小鸭》 PPT课件
- 伯努利方程-ppt课件
- 银行从业资格考试题库附参考答案(共791题精心整理)
- 年产20吨阿齐沙坦原料药生产车间的设计和实现材料学专业
- 电子公章模板
- 第3章轨道车辆牵引计算
- 基于JSP的校园网站的设计与实现论文
评论
0/150
提交评论