版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学实验指导 一、实验目的 1、培养学生动手编程解决实际问题的能力。 2、训练学生分析问题和调试程序的能力。 3、锻炼学生撰写科技实验论文的能力。 二、实验要求 1、问题分析 充分地分析和理解问题本身,弄清要求做什么,用什么算法。 2、程序设计 (1) 根据所采用的算法,设计数据结构,画出流程图并编程。 (2) 最后准备调试程序的数据及测试方案。 3、上机调试 (1) 对程序进行编译,纠正程序中可能出现的语法错误。 (2) 调试前,先运行一遍程序看看究竟将会发生什么。 (3) 如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观 察窗输出中间变量值等手段
2、。 4、整理实习报告 三、实验报告 1、实习内容:采用的算法名称 2、问题描述:包括目标、任务、条件约束描述等。 3、设计:数据结构设计和核心算法设计。主要功能模块的输入,处理(算法框架)和输出。 4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。 5、心得:包括程序的改进设想,经验和体会。 6、程序清单:源程序,其中包括变量说明及详细的注释。 实验一 OpenGL程序设计 一、实验学时 2 学时 二、实验类型 学习型实验 三、实验目的和要求 初步了解 OpenGL 程序设计结构;了解 OpenGL 的基本数据类型、核心函数及辅助函数的 使用。 四、实验内容 1、综
3、述 这次试验的目的主要是使大家初步熟悉Ope nG这一图形系统的用法,编程平台是Visual C+ , 它对Ope nGL提供了完备的支持。 OpenG提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集 中到图形编程上,这次试验的程序就采用这些辅助函数。 2、试验步骤 1) 在VC中新建项目 2) .OpenGL基础库设置 ? 更改头文件(在视图类的头文件中引用 glgl.h glglu.h) ? 连接 OpenGL库(工程 设置 General/Use MFC in a Library, Link/OpenGL32.lib glu32.lib) 3) . 添
4、加变量和函数 ? 添加变量并初始化 ? CClientDC * MyDC; ? 视图类的构造函数中 MyDC=NULL; ? 添加消息映射函数 ? OnCreate() ? OnSize() ? OnDestroy() 4) .在PreCreateWindow函数中将窗口的客户区设置为OpenGL能够支持的风格 cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS; 5) .在On Create函数中 ? 定义像素存储格式 ? PIXELFORMATDESCRIPTOR勾 ? 创建绘图上下文 RC(Rendering Cont
5、ext )并使之当前化 ? wglCreateContext() 函数创建绘图上下文 RC。 PIXELFORMATDESCRIPTOR pfd= sizeof(PIXELFORMATDESCRIPTOR), / pfd 的大小 1, / 结勾的版本号 PFD_DRAW_TO_WINDOW| /支持 window PFD_SUPPORT_OPENGL| /支持 OpenGL PFD_DOUBLEBUFFER, / 双缓存 PFD_TYPE_RGBA, /RGBA色模式 24, /24 位颜色深度缓存 0,0,0,0,0,0, /color bits ignored 0, /no alpha b
6、uffer 0, /shift bit ignored 0, / 不使用累积缓存 0,0,0,0, /accum bits ignored 32, 32 位z缓冲 0, / 不使用模板缓存 0, /no auxiliary buffer PFD_MAIN_PLANE,/ 选择主层面 0, / 保留 0,0,0 /layer masks ignored ; MyDC=new CClientDC(this); / 设置像素格式 int pixelFormat=ChoosePixelFormat(MyDC-GetSafeHdc(), SetPixelFormat(MyDC-GetSafeDC(),p
7、ixelFormat, m_hRC=wglCreateContext(MyDC-m_hDC); wglMakeCurrent(MyDC-GetSafeHdc(),m_hRC); 6) .在On Size函数中设置视场和视口 If(cy0) glMatrixMode(GL_PROJECTION); glLoadIdentity(); glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,9.0); glViewport(0,0,cx,cy); 7) .在On Destroy函数:在On Destroy成员中需要释放On Create成员中RC所占用的资 源 HG
8、LRC m_hRC; m_hRC=wglGetCurrentContext(); wglMakeCurrent(NULL,NULL); wglDeleteContext(m_hRC); MyDC-DeleteDC(); 8) 在On EraseBKg n(中将原来的返回语句换成返回 TRUE; 9) .在OnDraW根据当前的视点、视距、观看方向等参数,设置合适的OpenG视景 体属性,使用户能够看到预期的场景外观 glClearColor(1.0f,1.0f,0.0f,1.0f);/背景为黄色 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)
9、glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0.0f,0.0f,-6.0f); glBegin(GL_LINES); /OpenGL 绘制直线命令 glColor3f(1.0,0.0,0.0); / 设置当前颜色为红色 glVertex2f(0,0); glVertex2f(1,1); glColor3f(0.0,1.0,0.0); / 设置当前颜色为绿色 glVertex2f(0.2f,0.0f);/ glVertex2f(1.2f,1.0f); glEnd(); glFinish(); SwapBuffers(wgl
10、GetCurrentDC(); 3、程序说明 每个函数的具体含义在程序注释中已作了叙述,不再多说。 OpenGLl勺函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指岀所用的数据类型, 如:glColor3f(),字母f指明要使用浮点数。字母前的数字指明参数个数或指明二维还是三维,如: glVertex2f() 是要设置二维的点。 OpenGl采用的是状态机的方式,用户设定一种状态,程序照此运行。如:glBeg in (GL_LINES)设定画 线状态(GL_LINES是OpenG已定义好的常量),glColor3f() 设定绘图所用颜色。 main()函数中的几个aux前缀函数
11、是OpenG提供的辅助库,用以初始化窗口,大家不必深究,我们关 注的是 display() 函数,它是我们真正绘图的地方。 函数glColor3f()以RG方式设置颜色,格式为:glColor3f(red ,green ,blue),每种颜色值在(0.0, 1.0) 之间。为了能显示更多的颜色,最好把系统设置成16位真彩色模式。 函数glVertex2f(x, y)设置二维顶点。 函数glBegin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。 如上所述,Ope nGL是个状态机,glBeg in (UINT State)可以设定如下状态: GL_POINTS
12、画点 GL_LINES 画线,每两个顶点 (Vertex) 为一组 GL_LINE_STRIP 画线,把若干个顶点顺次连成折线 GL_LINE_LOOP画线,把若干个顶点顺次连成封闭折线 GL_TRIANGLES画三角形,每三个顶点为一组 GL_QUADS画四边形,每四个顶点为一组 GL_POLYGOI画多边形 还有 GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN,GL_QUADS_STRlP等等。大家可以把每一种状态都试一 试。 程序可以有多组 glBegin() 、 glEnd() 并列的形式,如: glBeing(GL_LINES); glEnd(); glBein
13、g(GL_QUADS); glEnd(); 除了上述的基本图元外,函数 glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在 glBegin() 和 glEnd() 之间,下面的两句程序是画一个蓝色的矩形。 glColor3f (0.0f, 0.0f, 1.0f); glRectf(10.0f, 10.0f, 50.0f,50.0f); 实验二 二维基本图元的生成 一、实验学时 2 学时 二、实验类型 设计型实验 三、实验目的和要求 1、掌握二维基本图元直线段生成的DDA 算法, Brehension 算法; 2、掌握二维基本图元圆弧生成的中点画圆算法; 3、掌握对
14、线型线宽的属性的控制。 四、实验内容 1、编程实现 DDA 、 Brehension 算法生成直线 2、中点扫描转换生成圆、椭圆 五、实验步骤 1) 在VC中新建项目 2) 添加菜单及相应的菜单命令函数(画线、画圆) 3) 编码实现(参考书中相关代码); 实验三 二维图元的填充 一、实验学时 2 学时 二、实验类型 设计型实验 三、实验目的和要求 1、掌握二维图元填充的递归算法; 2、掌握二维图元填充的种子填充算法 四、实验内容 构造任意一个边界表示的多边形,假定该多边形内部是四连通的。要求: 1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。 2、用种子填充扫描线算法实现多边形
15、内部的填充。 五、建立 win32 应用程序工程。 1、请在实验二中建立的项目基础上,添加填充的菜单项,建立相应的菜单命令寒暑,实现种子 填充。 2. void BoundaryFill4(HDC,int,int,COLORREF,COLORREF); void BoundaryFill4(HDC hdc,int x,int y,COLORREF boundarycolor,COLORREF newcolor) COLORREF color; color=GetPixel(hdc,x,y); if(color != boundarycolor) BoundaryFill4(hdc,x,y+1,
16、boundarycolor,newcolor); BoundaryFill4(hdc,x,y-1,boundarycolor,newcolor); BoundaryFill4(hdc,x-1,y,boundarycolor,newcolor); BoundaryFill4(hdc,x+1,y,boundarycolor,newcolor); 实验四 二维图形的几何变换 一、实验学时 2 学时 二、实验类型 设计型实验 三、实验目的和要求 1、掌握二维图形的基本几何变换,如平移、旋转、缩放; 2、掌握 OpenGL 中模型变换函数。 四、实验内容 1.在实验三的基础上,再添加一个主菜单项(几何变
17、换) 2.在主菜单下添加子菜单项(平移、旋转、缩放) 3. 建立相应的菜单命令函数 4. 实现基本的几何变换 代码如下: /平移 mx=1+mx; my=4; mz=-13; Invalidate(FALSE);( mx,my,mz为三方向的平移量) / 旋转 if (r330) r=r+30; else r=0; Invalidate(FALSE); ( r 为旋转角度) / 放缩 sx=sx+1; sy=sy+1; sz=sz+1; Invalidate(FALSE); ( sx,sy,sz 分别为三方向的放缩系数) 在绘图部分(On Draw函数中),添加几何变换代码(建议将绘图代码编写
18、为自定义函数) glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); / 画点 glPushMatrix(); glPointSize(4); glTranslatef (-5+mx, 3,-13); glRotatef(r,1.0,1.0,1.0); glScalef(sx,sy,sz); glColor3f(1.0f, 0.0f, 0.0f); glBegin(GL_POINTS);/ glVertex3f( 0.0f, 1.0f,-1.0f);/a点
19、glVertex3f(-1.0f,-1.0f, 0.0f);/b点 glVertex3f( 1.0f,-1.0f, 0.0f);/c点 glEnd(); glPopMatrix(); / 画三角形 glPushMatrix(); glTranslatef ( -1+mx, 3,-13); glRotatef(r,1.0,1.0,1.0); glScalef(sx,sy,sz); glColor3f(0.0f, 1.0f, 0.0f); glBegin(GL_LINE_LOOP); / glVertex3f( 0.0f, 1.0f,-1.0f);/a点 glVertex3f(-1.0f,-1.0
20、f, 0.0f);/b点 glVertex3f( 1.0f,-1.0f, 0.0f);/c点 glEnd(); glPopMatrix(); / 画三角形面 glPushMatrix(); glTranslatef ( 4+mx, 3,-13); glRotatef(r,1.0,1.0,1.0); glScalef(sx,sy,sz); glColor3f(0.0f, 0.0f, 1.0f); glBegin(GL_POLYGON);/ glVertex3f( 0.0f, 1.0f,-1.0f);/a点 glVertex3f(-1.0f,-1.0f, 0.0f);/b点 glVertex3f(
21、 1.0f,-1.0f, 0.0f);/c点 glEnd(); glPopMatrix(); / 画四边形面 glPushMatrix(); glTranslatef (-5+mx, -3,-13); glRotatef(r,1.0,1.0,1.0); glScalef(sx,sy,sz); glColor3f(1.0f, 1.0f, 0.0f); glBegin(GL_POLYGON);/ glVertex3f(0.0f,0.0f ,0.0f);/a点 glVertex3f(1.0f,0.0f, 0.0f);/b点 glVertex3f(1.0f,0.0f,-1.0f);/c点 glVert
22、ex3f(0.0f,0.0f,-1.0f);/d点 glEnd(); glPopMatrix(); / 画正方体 glPushMatrix(); glTranslatef ( 0+mx, -3,-13); glRotatef(r,1.0,1.0,1.0); glScalef(sx,sy,sz); glColor3f(0.0f, 1.0f, 1.0f); glBegin(GL_QUAD_STRIP);/ glVertex3f(0.0f,0.0f ,0.0f);/a0点 glVertex3f(0.0f,1.0f ,0.0f);/a1点 glVertex3f(1.0f,0.0f, 0.0f);/b0
23、点 glVertex3f(1.0f,1.0f, 0.0f);/b1点 glVertex3f(1.0f,0.0f,-1.0f);/c0点 glVertex3f(1.0f,1.0f,-1.0f);/c1点 glVertex3f(0.0f,0.0f,-1.0f);/d0点 glVertex3f(0.0f,1.0f,-1.0f);/d1点 glVertex3f(0.0f,0.0f ,0.0f);/a0点 glVertex3f(0.0f,1.0f ,0.0f);/a1点 / 更新窗口 glEnd(); glFlush(); SwapBuffers(wglGetCurrentDC(); 实验五、实验六任选
24、一个。 实验五 二维裁剪 一、实验学时 2 学时 二、实验类型 设计型实验 三、实验目的和要求 1、掌握二维图形的基本裁剪算法,如cohen-sutheland 算法、 Liang-Barsky 算法; 2、掌握 OpenGL 中矩阵堆栈函数的使用,实现简单的组合变换。 四、实验内容 1、采用 Liang-Barsky 算法 要求: 1)单击鼠标左键,运行窗口出现裁剪窗口及待裁剪线段; 2)单击鼠标右键,窗口呈现出裁剪后的裁剪窗口及裁剪线段。 2、下面的程序绘制的是一个简单的太阳系,其中包括一个太阳和一颗行星, 它们使用同球体绘 制函数实现。当按下键盘“D或“d”,行星将实现自转;按下键盘“Y
25、或 “y时,行星将绕太阳 公转。 请同学们认真读懂每一段代码,然后试着修改这段程序,实现 1)将行星的中心倾斜; 2)给行星加上卫星。 #include #include static int year = 0, day = 0; void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT); void display(void) glClear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glPushMatrix(); / glutWireSphere
26、 中第一、二、三个参数分别表示半径,经度线数、纬度线数 glutWireSphere(1.0, 20, 16); /* draw sun */ glRotatef (GLfloat) year, 0.0, 1.0, 0.0); glTranslatef (2.0, 0.0, 0.0); glRotatef (GLfloat) day, 0.0, 1.0, 0.0); glutWireSphere(0.2, 10, 8); /* draw smaller planet */ glPopMatrix(); glutSwapBuffers(); void reshape (int w, int h)
27、 glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0); void keyboard (unsigned char key, int x, int
28、 y) switch (key) case d: day = (day + 10) % 360; glutPostRedisplay(); break; case D: day = (day - 10) % 360; glutPostRedisplay(); break; case y: year = (year + 5) % 360; glutPostRedisplay(); break; case Y: year = (year - 5) % 360; glutPostRedisplay(); break; case 27: exit(0); break; default: break; int main(int argc, char* argv) glutInit( glutInitDisp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苏教版五年级上册数学《小数加法和减法》常考易错题专项汇编(含解析)
- 竹溪县事业单位招聘考试真题2025
- 2025年温州市瑞安市中小学招聘事业编制教师真题
- 2025年德州夏津县教育系统招聘备案制高中教师真题
- 临床治疗血糖升高中成药物适应症、禁忌症及用法
- 水上交通“三无”船舶专项整治方案
- 术后伤口护理技术操作常见并发症的预防和处理规范
- 教师班级常规管理自查问题及整改措施
- 机关事业单位保密工作管理制度
- DB12-T 3055-2026 京津冀碳普惠项目减排量核算技术规范油改电小客车
- 2026年交安c证考试试卷及答案
- 2026-2030中国姜汁汽水市场经营效益及投资可行性专项调研报告
- 钢结构构件试验检测方案
- 医疗人工智能伦理规范
- 湘钢岗前培训考试试题及答案
- DB15∕T 3937-2025 典型地物遥感智能解译技术规程
- GB/T 191-2025包装储运图形符号标志
- 桥梁施工夏季施工方案
- 防锈处理工作业指导书
- 婴幼儿常备药品家庭管理指南
- 公司内部质量管理制度
评论
0/150
提交评论