免费预览已结束,剩余18页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实 验 报 告课程名称: 计算机图形学 院 (系): 信息与控制工程学院 专业班级: 计算机0901班 姓 名: * 学 号: * 指导教师: * 2011 年 12 月 11 日实验一 熟悉Windows图形开发环境一、实验目的1. 熟悉VisualC+6.0的开发环境;2. 掌握Windows图形输出的方法;3. 理解设备环境、画笔、画刷的概念,掌握常用的绘制函数。二、实验原理原理:使用Visual C+在Windows下进行图形程序设计三、实验内容内容: 编写程序,要求如下:1. 定义一支红色画笔,绘制一个正方形;2. 用不同颜色的线条连接互不相临的两个顶点;3. 用不同颜色的画刷填充用上述方法所形成的图形的每一个区域。四、实验步骤使用Visual C+在Windows下进行图形程序设计的基本步骤是:1. 在绘制之前,创建绘图工具并设置相关的颜色、线型、线宽等属性;2. 调用相关的绘图函数选择绘图工具并进行绘图;3. 在绘制之后,恢复原有的绘图工具五、实验环境 已安装visual C+6.0的Windows XP计算机一台,u盘六、实验代码#include stdafx.h#include resource.h#define MAX_LOADSTRING 100HINSTANCE hInst;TCHAR szTitleMAX_LOADSTRING;TCHAR szWindowClassMAX_LOADSTRING;ATOMMyRegisterClass(HINSTANCE hInstance);BOOLInitInstance(HINSTANCE, int);LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);LRESULT CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)MSG msg;HACCEL hAccelTable;LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);LoadString(hInstance, IDC_FA, szWindowClass, MAX_LOADSTRING);MyRegisterClass(hInstance);if (!InitInstance (hInstance, nCmdShow) return FALSE;hAccelTable = LoadAccelerators(hInstance, (LPCTSTR)IDC_FA);while (GetMessage(&msg, NULL, 0, 0) if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg) TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;ATOM MyRegisterClass(HINSTANCE hInstance)WNDCLASSEX wcex;wcex.cbSize = sizeof(WNDCLASSEX); wcex.style= CS_HREDRAW | CS_VREDRAW;wcex.lpfnWndProc= (WNDPROC)WndProc;wcex.cbClsExtra= 0;wcex.cbWndExtra= 0;wcex.hInstance= hInstance;wcex.hIcon= LoadIcon(hInstance, (LPCTSTR)IDI_FA);wcex.hCursor= LoadCursor(NULL, IDC_ARROW);wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);wcex.lpszMenuName= (LPCSTR)IDC_FA;wcex.lpszClassName= szWindowClass;wcex.hIconSm= LoadIcon(wcex.hInstance, (LPCTSTR)IDI_SMALL);return RegisterClassEx(&wcex);BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) HWND hWnd; hInst = hInstance; hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); return TRUE;LRESULT CALLBACK WndProc(HWND hWnd, UINT message, UINT wParam, LONG lParam) PAINTSTRUCT PtStr;HDC hDC;HBRUSH hBrush; HPEN hPen;switch (message) case WM_PAINT:hDC = BeginPaint(hWnd, &PtStr);SetMapMode(hDC,MM_ANISOTROPIC);hPen=(HPEN)CreatePen(PS_INSIDEFRAME,1,RGB(255,0,0);SelectObject(hDC,hPen);Rectangle(hDC,40,40,200,200);DeleteObject(hPen);hBrush=(HBRUSH)GetStockObject(DKGRAY_BRUSH);SelectObject(hDC,hBrush);POINT p3;p0.x=40;p0.y=40;p1.x=120;p1.y=120;p2.x=200;p2.y=40; Polygon(hDC,p,3);DeleteObject(hBrush); hBrush=(HBRUSH)GetStockObject(BLACK_BRUSH); SelectObject(hDC,hBrush);p0.x=40;p0.y=40;p1.x=120;p1.y=120;p2.x=40;p2.y=200;Polygon(hDC,p,3);hBrush=CreateSolidBrush(RGB(255,0,255); SelectObject(hDC,hBrush);p0.x=200;p0.y=200;p1.x=120;p1.y=120;p2.x=200;p2.y=40;Polygon(hDC,p,3);hBrush=(HBRUSH)GetStockObject(LTGRAY_BRUSH); SelectObject(hDC,hBrush);p0.x=200;p0.y=200;p1.x=120;p1.y=120;p2.x=40;p2.y=200;Polygon(hDC,p,3); hPen=(HPEN)CreatePen(PS_INSIDEFRAME,1,RGB(0,0,255);SelectObject(hDC,hPen);MoveToEx(hDC,40,40,NULL);LineTo(hDC,200,200);DeleteObject(hPen); hPen=(HPEN)CreatePen(PS_INSIDEFRAME,1,RGB(0,255,0); SelectObject(hDC,hPen);MoveToEx(hDC,40,200,NULL);LineTo(hDC,200,40);EndPaint(hWnd, &PtStr);break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam); return 0;LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)switch (message)case WM_INITDIALOG:return TRUE;case WM_COMMAND:if (LOWORD(wParam) = IDOK | LOWORD(wParam) = IDCANCEL) EndDialog(hDlg, LOWORD(wParam);return TRUE;break; return FALSE;七、实验结果及分析运行结果如图所示局部截图:图一分析: 代码调试完毕,编译运行,按预期结果输出八、实验小结 这次实验对我来说是一次挑战也是一次新的学习机会。这是我第一次编写Windows图形程序,在编写过程中遇到了一些问题,也在这些问题的解决过程中的到了新的感受。首先我用的vc+6.0软件存在问题,导致程序总是出现一些莫名其妙的错误,比如无法打开工程,自动关闭等等。经过上网查找发现是软件和我的系统有兼容性问题,与一些软件也存在冲突。后来我换成Windows xp的虚拟机中运行,此问题得到了解决。其次,程序编写时将工程类型创建错了,导致无法连接成功。后来经过上网搜索相关内容解决了此问题。然后在调用一些画图的函数时对函数体了解不多,导致函数调用出错。实验二 创建VC6.0下 OpenGL绘图程序的基本框架一、 实验目的1. 了解使用VC6.0下 OpenGL绘图程序的基本框架2. 掌握理解简单的OpenGL程序结构;3. 掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数。二、 实验原理内容步骤新建工程,在工程设置链接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)。使用一个PIXELFORMATDESCRIPTOR结构来指定像素格式,使用wglCreateContext()函数创建绘图上下文RC。添加头文件: #include GLglu.h#include GLgl.h#include GLglaux.hOnCreate函数中具体添加代码如下:/首先定义像素存储格式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 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;CClientDC 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(cy0&cx0)glViewport(0,0,cx,cy); /视口设置成应用程序的视图的大小glMatrixMode(GL_PROJECTION);/投影矩阵模式glLoadIdentity();/if.else.语句是平行投影的实现方式/参数:左、右、下、上、近、远if(cxm_hDC,m_hRC);DrawScene(); /用户自定义函数,用来编写OpenGL绘制语句的wglMakeCurrent(pDC-m_hDC,NULL);添加成员函数:在DrawScene( )函数中编写具体的绘图程序。首先需要设置视点、视距和观看方向等场景参数,然后绘制图元。三、 实验环境安装有Visual C+ 6.0的windowXp计算机一台,u盘。四、 实验代码建立一个OpenGL工程选择File-New-Project,然后选择Win32 Console Application,选择一个名字,然后按OK。在谈出的对话框左边点Application Settings,找到Empty project并勾上,选择Finish。然后向该工程添加一个代码文件,取名为“Shapes.cpp”。并输入以下代码:五、 实验结果及分析编译并运行该程序。1、该程序的作用是在一个黑色的窗口中央画一个矩形、三角形和三个点。图2-1是示范程序的结果,添加代码,在原有结果基础上添加三条直线组成新的三角形(如图2-2所示),将增加的代码写在实验报告纸上。 图2-1 示范程序的结果 图2-2 改进后程序的结果 2、使用Visual Studio C+编译已有项目工程,并编写代码生成以下图形,如图2-3所示:图2-3 多边形3、在此基础上,修改各顶点颜色,使得每个顶点颜色不一样,多边形内部颜色渐变,如图2-4所示(该程序需使用双缓存区)。图2-4 渐变多边形 4、将代码写在实验报告纸上。分析:结果正确 六、 实验小结通过本次实验,了解使用VC6.0下 OpenGL绘图程序的基本框架,掌握理解简单的OpenGL程序结构,掌握OpenGL提供的基本图形函数,尤其是生成点、线、面的函数的使用。实验三 用OpenGL绘制基本图元(直线、多边形等)一、实验目的1. 学会使用OpenGL绘制基本图元;2. 利用OpenGL实现实线,虚线,点划线的绘制,及kock曲线。二、实验原理原理:该实验是基于实验二基础上,步骤省略。添加成员函数int DrawGLScene(GLvoid):实验代码如下:int DrawGLScene(GLvoid)/ Heres 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);glVertex2f(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 LeftglVertex3f( 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 RightglVertex3f(-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) 相关算法及原理描述 直线的绘制在OpenGL中绘制直线通过指定直线段的端点来实现,用glVertex函数指定直线段端点的坐标位置,用glBegin/glEnd函数对包含一系列的点坐标,并利用符号常量解释这些点构成直线的方式。 虚线的绘制绘制虚线需要先调用函数过了Enable(GL_LINE_STIPPLE);打开划线模式。然后,函数glLineStipple将建立用于划线的模式glLineStipple(Glint factor, GLushort pattern); Kock曲线Kock曲线的初始生成员是一条直线,生成规则是将直线段分为三等分,首尾两段保持不变,中间用两段等长且互成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/6 , (y1+y0)/2(x1-x0)3/6)(x0+2(x1-x0)/3 , y0+2(y1-y0)/3) (x1 , y1)其中,第三个点坐标公式中的正负号表示中间两条心直线段处于元直线段的哪一侧。根据这一规则迭代六次。六、实验结果及分析2) 程序调试、测试与运行结果分析 直线的绘制结果 虚线的绘制结果 Kock曲线绘制结果七、实验小结通过本次实验使我学会使用OpenGL绘制基本图元,并利用OpenGL实现实线,虚线,点划线的绘制,及对kock曲线,对直线、虚线、Kock曲线的绘制有了一定的了解与掌握。通过实验,对图形学中所用算法也有了更深的认识,并且通过从八分圆构造完整圆的过程,学会了图形学算法设计的一种思想。实验四 用OpenGL生成NURBS曲线一、实验目的 (1)理解Bzier曲线和B样条曲线的定义、性质及绘制算法。(2)理解OpenGL中窗口坐标与世界坐标的映射关系。(3)掌握OpenGL的Bzier曲线和NURBS曲线的绘制方法二、实验原理,内容及步骤OopenGL中,GLU函数库提供了一个NURBS接口。用户需要提供的数据包括控制点、节点等数据,控制点描述曲线的大致形状,节点控制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.0f, 0.0f, -0.5f, -0.5f, 0.0f, 0.0f, -2.0f, 0.0f, 0.5f, -0.5f, 0.0f, 1.0f, 1.0f, 0.0f,1.5f, -0.5f, 0.0f ;/给定控制点GLfloat knots14 = 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f ; /节点glColor3f (0.0f, 0.0f, 1.0f);GLUnurbsObj *theNurb; /创建NURBS对象 theNurb = gluNewNurbsRenderer( );gluNurbsProperty (theNurb, GLU_SAMPLING_TOLERANCE, 10.0); /属性 / GLU_SAMPLING_TOLERANCE表示边缘最大像素长度glNewList(1, GL_COMPILE); gluBeginCurve(theNurb); gluNurbsCurve(theNurb, /*NURBS曲线对象*/14, /*参数区间节点数目控制点数NURBS曲线阶数*/knots, /*节点*/3, /*曲线控制点之间的偏移量*/ (float*)controlPoints, /*控制点*/ 7, /*曲线阶数*/ GL_MAP1_VERTEX_3); /*曲线类型*/ gluEndCurve(theNurb);glEndList();glCallList(1); 三、实验环境 安装有Visual C+6.0的windowsXp计算机一台,u盘四、实验代码 #if!defined(AFX_STDAFX_H_A9DB83DB_A9FD_11D0_BFD1_444553540000_INCLUDED_)#defineAFX_STDAFX_H_A9DB83DB_A9FD_11D0_BFD1_444553540000_INCLUDED_#if_MSC_VER1000#pragmaonce#endif/_MSC_VER1000#defineWIN32_LEAN_AND_MEAN/Excluderarely-usedstufffromWindowsheaders#include#include/OpenGL32库的头文件#include/GLu32库的头文件#include/GLaux库的头文件#pragmacomment(lib,winmm.lib)#pragmacomment(lib,opengl32.lib)/OpenGL32连接库#pragmacomment(lib,glu32.lib)/GLu32连接库#pragmacomment(lib,glaux.lib)/GLaux连接库/TODO:referenceadditionalheadersyourprogramrequireshere/AFX_INSERT_LOCATION/MicrosoftVisualC+willinsertadditionaldeclarationsimmediatelybeforethepreviousline.#endif/!defined(AFX_STDAFX_H_A9DB83DB_A9FD_11D0_BFD1_444553540000_INCLUDED_)#includestdafx.hvoidmyinit(void);voidCALLBACKmyReshape(GLsizeiw,GLsizeih);voidCALLBACKdisplay(void);GLfloatctrlpoints43=-4.0,-4.0
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 诚信商户承诺书范本3篇
- 数据分析基础报表及解读工具
- 2025年冲压工高级理论知识考核试题及答案
- 2026届安徽省阜阳市颍上二中高二化学第一学期期末学业水平测试试题含答案
- 2026年高端民宿运营公司员工食堂管理制度
- 2026年高端民宿运营公司融资管理制度
- 爱瑞克森心理社会发展理论与儿童护理
- 肿瘤患者化疗期护理支持
- 疼痛管理与舒适护理考核要点
- 挖机作业合同协议书
- 妊娠合并子宫瘢痕的护理
- 【166题】2025年时事政治试题及答案
- 2026届福州屏东中学化学高一第一学期期中调研试题含解析
- 人民陪审员法深度解读
- 2025政策理论水平考核题目带答案
- 现场临电培训课件
- 2025年射线探伤工理论知识考试题库及答案(核心题)
- 2025四川成都华电抽蓄工程管理公司招聘20人笔试考试参考试题及答案解析
- 2025年云南交投集团下属公路建设公司生产人员招聘(8人)笔试考试备考试题及答案解析
- 2025年超声医学考试题及答案
- 红岩中考试题及答案
评论
0/150
提交评论