谷萌计算机图形学实验_第1页
谷萌计算机图形学实验_第2页
谷萌计算机图形学实验_第3页
谷萌计算机图形学实验_第4页
谷萌计算机图形学实验_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、实验报告 题 目: 计算机图形学 院 (系):信息与控制工程学院专业班级: 计算机1202 姓 名: 谷萌 学 号: 120620218 指导教师: 周方晓 2015年12月 12日实验一 熟悉Windows图形开发环境一、实验目的 1. 熟悉VisualC+6.0的开发环境; 2. 掌握Windows图形输出的方法; 3. 理解设备环境、画笔、画刷的概念,掌握常用的绘制函数。 二、实验原理 原理:使用Visual C+在Windows下进行图形程序设计 三、实验内容 内容: 

2、;编写程序,要求如下: 1. 定义一支红色画笔,绘制一个正方形; 2. 用不同颜色的线条连接互不相临的两个顶点; 3. 用不同颜色的画刷填充用上述方法所形成的图形的每一个区域。四、实验步骤使用Visual C+在Windows下进行图形程序设计的基本步骤是:(1)在绘制之前,创建绘图工具并设置相关的颜色、线型、线宽等属性;(2)调用相关的绘图函数选择绘图工具并进行绘图;(3)在绘制之后,恢复原有的绘图工具。五、实验环境  已安装visual C+6.0的Windows XP计算机一台,u盘

3、60;六、实验结果及分析 运行结果如图所示 分析: 代码调试完毕,编译运行,按预期结果输出。七、实验小结   对我来说这次实验既是一次挑战也是一次全新的学习机会。当然这也是我第一次编写Windows图形程序,所以在编写过程中发现了许多问题,比如说vc+6.0软件存在问题,导致程序总是出现一些莫名其妙的错误,像无法打开工程,自动关闭等等。后来,经过询问老师和上网查询,才发现是软件和我的系统有兼容性问题,与一些软件也存在冲突。后来在网上的建议,我换成Windows xp的虚拟机中运行,此问题得到了解决。 除此之外,程序编写时将工程类型创建

4、错了,导致无法连接成功。后来经过上网搜索相关内容解决了此问题。然后在调用一些画图的函数时对函数体了解不多,导致函数调用出错。实验二 创建VC6.0下 OpenGL绘图程序的基本框架一、 实验目的 1. 了解使用VC6.0下 OpenGL绘图程序的基本框架 2. 掌握理解简单的OpenGL程序结构; 3. 掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数。二、 实验环境 安装有Visual C+ 6.0的windowXp计算机一台,u盘。三、 实验原理内容步骤 新建工程,在

5、工程设置链接L对象库模版中添加OPENGL库,即opengl32.lib glu32.lib glaux.lib如图所示:在Visual C+中,修改视图类成员函数代码实现OpenGL绘图的过程如下:在(文件名.view)视图类中改造PreCreateWindow函数:将窗口的客户区设置为OpenGL能够支持的风格。具体添加代码如下:cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;在工具栏的视图类向导中添加并改造OnCreate函数:定义像素存储格式,并创建一个OpenGL操作所必须的绘图上下文RC(Rendering Context)。使用一个PIXELF

6、ORMATDESCRIPTOR结构来指定像素格式,使用wglCreateContext()函数创建绘图上下文RC。添加头文件: #include "GLglu.h"#include "GLgl.h"#include "GLglaux.h"OnCreate函数中具体添加代码如下:/首先定义像素存储格式PIXELFORMATDESCRIPTOR pfd= sizeof(PIXELFORMATDESCRIPTOR), / pfd的大小 1, /结构的版本号 PFD_DRAW_TO_WINDOW| /支持window PFD_SUPPORT_

7、OPENGL| /支持OpenGL PFD_DOUBLEBUFFER, /双缓存 PFD_TYPE_RGBA, /RGBA颜色模式 24, /24位颜色深度缓存 0,0,0,0,0,0, /color bits ignored 0, /no alpha buffer0, /shift bit ignored0, /不使用累积缓存0,0,0,0, /accum bits ignored32, /32位z缓冲0, /不使用模板缓存0, /no auxiliary bufferPFD_MAIN_PLANE, /选择主层面0, /保留0,0,0 /layer masks ignored;CClient

8、DC dc(this);int pixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);BOOL success=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);/创建绘图上下文RCHGLRC m_hRC=wglCreateContext(dc.m_hDC);在工具栏的视图类向导中添加并改造OnSize函数:当视图尺寸变化是,应及时将新的客户区尺寸通知OpenGL,方能够正确在窗口客户区域显示二维场景,通过命令glViewport完成这项工作:glViewport(0,0,cx,cy);具体添加代码如下:if

9、(cy>0&&cx>0)glViewport(0,0,cx,cy); /视口设置成应用程序的视图的大小glMatrixMode(GL_PROJECTION);/投影矩阵模式glLoadIdentity();/if.else.语句是平行投影的实现方式/参数:左、右、下、上、近、远if(cx<=cy) /原先是3.0 左,右,下,上,近,远glOrtho(-4.0,4.0,-4.0*(GLfloat)cx/(GLfloat)cy, 4.0*(GLfloat)cx/(GLfloat)cy,-10.0,10.0);elseglOrtho(-4.0,4.0,-4.0*(

10、GLfloat)cy/(GLfloat)cx, 4.0*(GLfloat)cy/(GLfloat)cx,-10.0,10.0);/elseglFrustum(-2.0,2.0,-2.0*cy/double(cx),2.0*cy/double(cx),2.0,6.0);/*可以乘一个自定义的投影矩阵实现投影: double ProjectMatrix44; . 计算投影矩阵ProjectMatrixglMultMatrixd(&ProjectMatrix00);*/glMatrixMode(GL_MODELVIEW);/以下是模型变换矩阵模式glTranslatef(0.0,0.0,-4

11、.0); /拉开视点和物体glRotated(20,0.5,1.0,0.5);在工具栏的视图类向导中添加并改造OnEraseBkgnd函数:重载视图类的OnEraseBkgnd成员,使之返回TRUE值可以阻止Windows重画窗口背景,因为OpenGL自己会设置窗口背景,这样可以防止窗口频繁刷新(如移动窗口)时产生的闪烁现象。在工具栏的视图类向导中添加并改造OnDestroy函数:在OnDestroy成员中需要释放OnCreate成员中RC所占用的资源,命令wglDeleteContext可以完成这个工作,但在释放RC之前,还需要使用命令wglMakeCurrent()断开RC与设备描述表DC

12、的连接。具体代码如下:wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hRC);添加成员变量:改造OnDraw:根据当前的视点、视距、观看方向等参数,设置合适的OpenGL视景体属性,使用户能够看到预期的场景外观。添加的代码如下:wglMakeCurrent(pDC->m_hDC,m_hRC);DrawScene(); /用户自定义函数,用来编写OpenGL绘制语句的wglMakeCurrent(pDC->m_hDC,NULL);添加成员函数:在DrawScene( )函数中编写具体的绘图程序。首先需要设置视点、视距和观看方向等场景参数,然

13、后绘制图元。四、 实验结果编译并运行该程序1. 该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点。图2-1是示范程序的结果,添加代码,在原有结果基础上添加三条直线组成新的三角形(如图2-2所示),将增加的代码写在实验报告纸上。 2. 使用Visual Studio C+编译已有项目工程,并编写代码生成以下图形,如图2-3所示。 3. 在此基础上,修改各顶点颜色,使得每个顶点颜色不一样,多边形内部颜色渐变,如图2-4所示(该程序需使用双缓存区)。  3、在此基础上,修改各顶点颜色,使得每个顶点颜色不一样,多边形内部颜色渐变,如图2-4所示(该程

14、序需使用双缓存区)。 五、实验小结 通过本次实验,使我对VC6.0下 OpenGL绘图程序的基本框架有了许多的理解,同时也掌握了一些简单的OpenGL程序结构,对OpenGL提供的基本图形函数,有了许多了解,其中尤其是生成点、线、面的函数的使用,有了非常多的理解。实验三 用OpenGL绘制基本图元(直线、多边形等)一、 实验目的 1. 学会使用OpenGL绘制基本图元; 2. 利用OpenGL实现实线,虚线,点划线的绘制,及kock曲线。二、 实验原理该实验是基于实验二基础上,步骤省略。添加成员函数int DrawGLSce

15、ne(GLvoid):实验代码如下:int DrawGLScene(GLvoid)/ Here's Where We Do All The DrawingglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/ Clear Screen And Depth BufferglLoadIdentity();/ Reset The Current Modelview Matrix/Draw lineglBegin(GL_LINES);glColor3f(1.0,0.0,0.0);/设置颜色为红色glVertex2f(0,0);glVertex2

16、f(1,1);glColor3f(0.0,1.0,0.0);/设置颜色为绿色glVertex2f(0.2,0);glVertex2f(1.2,1);glEnd();glTranslatef(-1.5f,0.0f,-6.0f);/ Move Left 1.5 Units And Into The Screen 6.0 / Drawing TrianglesglBegin(GL_TRIANGLES);/ Drawing Using TrianglesglVertex3f( 0.0f, 1.0f, 0.0f);/ TopglVertex3f(-1.0f,-1.0f, 0.0f);/ Bottom L

17、eftglVertex3f( 1.0f,-1.0f, 0.0f);/ Bottom RightglEnd();/ Finished Drawing The TriangleglTranslatef(3.0f,0.0f,0.0f);/ Move Right 3 Units / Draw QuadglBegin(GL_QUADS);/ Draw A QuadglVertex3f(-1.0f, 1.0f, 0.0f);/ Top LeftglVertex3f( 1.0f, 1.0f, 0.0f);/ Top RightglVertex3f( 1.0f,-1.0f, 0.0f);/ Bottom Ri

18、ghtglVertex3f(-1.0f,-1.0f, 0.0f);/ Bottom LeftglEnd();/ Done Drawing The Quadreturn TRUE;/ Keep Going三、实验内容 1. 用OpenGL程序绘制实现,虚线和点划线 2. 用OpenGL程序,分别以直线和正三角形为初始生成员,实现迭代次数在6次以内的kock曲线,要求用键盘交互控制迭代次数。 四、实验环境  安装有Visual C+6.0的windowXp计算机一台,u盘 五、实验步骤 1)相关算法

19、及原理描述 直线的绘制 在OpenGL中绘制直线通过指定直线段的端点来实现,用glVertex函数指定直线段端点的坐标位置,用glBegin/glEnd函数对包含一系列的点坐标,并利用符号常量解释这些点构成直线的方式。  虚线的绘制 绘制虚线需要先调用函数过了Enable(GL_LINE_STIPPLE);打开划线模式。然后,函数glLineStipple将建立用于划线的模式 glLineStipple(Glint factor, GLushort pattern); Kock曲线 Kock曲线的初始生成

20、员是一条直线,生成规则是将直线段分为三等分,首尾两段保持不变,中间用两段等长且互成60°角的直线段代替。这样,直线段被分成四段,每段长度都只有原来的1/3。Kock曲线的分形维数为D=ln4/ln31.26186 假设原直线的首尾点是P0(x0,y0),P1(x1,y1),则新的四段直线段的五个端点坐标分别为 (x0 , y0)      (x0+(x1-x0)/3 , y0+(y1-y0)/3)  (x1+x0)/2±(y0-y1)3

21、/6 , (y1+y0)/2±(x1-x0)3/6) (x0+2(x1-x0)/3 , y0+2(y1-y0)/3)  (x1 , y1) 其中,第三个点坐标公式中的正负号表示中间两条心直线段处于元直线段的哪一侧。根据这一规则迭代六次。六、实验结果及分析 程序调试、测试与运行结果分析:  直线的绘制结果 虚线的绘制结果 Kock曲线绘制结果 六、实验小结 通过本次实验使我学会使用OpenGL绘制基本图元,并利用OpenGL实现实线,虚线,点划线的绘制,及对

22、kock曲线,对直线、虚线、Kock曲线的绘制有了一定的了解与掌握。通过实验,对图形学中所用算法也有了更深的认识,并且通过从八分圆构造完整圆的过程,学会了图形学算法设计的一种思想实验四 用OpenGL生成NURBS曲线一、实验目的   (1)理解Bézier曲线和B样条曲线的定义、性质及绘制算法; (2)理解OpenGL中窗口坐标与世界坐标的映射关系; (3)掌握OpenGL的Bézier曲线和NURBS曲线的绘制方法。二、实验原理,内容及步骤在OopenGL中,GLU函数库提供了一个NURBS接口。用户需要提供的数据包括控

23、制点、节点等数据,控制点描述曲线的大致形状,节点控制B样条函数的形状。绘制一条NURBS曲线的步骤:(1)提供控制点序列和节点序列;(2)创建一个NURBS对象,设置NURBS对象属性;(3)绘制曲线; 创建一个NURBS对象,用如下两条语句: GLUnurbsObj *theNurbs; theNurbs=gluNewNurbsRender( );创建对象后,用如下函数设置NURBS对象属性:void gluNurbsProperty(GLUnurbsObj * nobj,GLenum property,Glfloat value); 曲线的绘制是在gluBeginCurve( )/gluEndCurve( )函数对中完成。绘制曲线的函数为:void gluNurbsCurve (GLUnurbsObj * nobj,GLint nknots,GLfloat * knot,GLint stride,GLfloat *ctlarray,GLint order,GLenum type);具体参数含义在下面程序实现中解释。添加成员函数DrawNurbsCurve( ):void CView:DrawNurbsCurve( )GLfloat controlPoints73 = -1.5f, -0.5f, 0.0f, -1.0f

温馨提示

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

评论

0/150

提交评论