




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学实验指导书张晓庆信息科学与工程学院2010年5月目录实验一 环境设置(2学时)实验二 直线和圆的生成算法(2学时)实验三 填充和裁剪算法(4学时)实验四(选择1) 二维图形的几何变换(2学时)实验四(选择2) 真实感图形的绘制(2学时)实验一 环境设置(2学时)一、实验目的1掌握图形驱动程序及图形模式的基本概念,掌握图形初始化方法;2掌握Turbo C 进行图形程序设计的基本方法;3了解Turbo C 的图形功能,了解常见的图形库函数;4初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。二、实验要求1 图形系统初始化;2 综合应用Turbo
2、 C 中图形库函数,进行图形设计与绘制;3 熟悉Turbo C 和OpenGL开发环境,要求会对程序进行编辑,编译,调试(包括分步,断点设置等调试手段)。三、实验内容1 图形系统初始化#include <graphics.h>include <stalib.h>include <stdio.h>include <conio.h>int main(void)int gdriver=DETECT,gmode=0;initgraph(&gdiver,&gmode,”C:BC31BGI”);/进行图形初始化,/图形卡的采用自动检/测模式,
3、同时/假设BC系统安装在C盘的BC31子目/录下。setcolor(4); /设定当前前景色为红色circle(300,300,100); /以点(300,300)为圆心,100为半径画/圆周。setcolor(2); /设定当前前景色为绿色line(100,100,100,600); /在点(100,100)和点(100,600)之间画一条/直线段,并和以下三句结合,画出长为/500宽为400的矩形。line(100,500,500,500);line(500,500,500,100);line(500,100,100,100);getch(); /从键盘上获取一个字符,在此表示暂停,供/操
4、作者观察图形。closegrap(); /关闭图形模式。2综合应用Turbo C 中图形库函数,进行图形设计与绘制 Turbo C的库函数见附录A3.这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C+,它对OpenGL提供了完备的支持。OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。(1)、在VC中新建项目 · 新建一个项目。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Appli
5、cation项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。· 为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:program filesMicrosoft Visual Studiovc98lib目录中。选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务
6、必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>/初始化OpenGL场景void myinit (void) glClearColor
7、 (0.0, 0.0, 0.0, 0.0);/将背景置成黑色 glShadeModel (GL_FLAT);/设置明暗处理/用户的绘图过程void CALLBACK display(void) glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);/清除缓存 glBegin(GL_LINES);/开始画一根白线 glColor3f (1.0f, 1.0f, 1.0f);/设置颜色为白色 /设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 glVertex2f(10.0f, 50.0f); glVertex2f(110.0f
8、, 50.0f); glColor3f (1.0f, 0.0f, 0.0f);/设置颜色为红色 /设置第二根线的两个端点 glVertex2f(110.0f, 50.0f); glVertex2f(110.0f, 150.0f); glEnd();/画线结束 glFlush ();/绘图结束/主过程:/初始化Windows的窗口界面/并初始化OpenGL场景,绘图int main(int argc, char* argv) auxInitDisplayMode (AUX_RGB);/初始化显示模式,采用RGB彩色系统。 auxInitPosition (0, 0, 400, 150);/初始化
9、窗口位置、大小 auxInitWindow ("Display Lists");/初始化窗口,设置标题 myinit (); auxMainLoop(display);/循环运行display过程,display由用户编写 return(0);(2)、程序说明 每个函数的具体含义在程序注释中已作了叙述,不再多说。OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:glColor3f(),字母f指明要使用浮点数。字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。OpenGL采用的是状态机的
10、方式,用户设定一种状态,程序照此运行。如:glBegin(GL_LINES)设定画线状态(GL_LINES是OpenGL已定义好的常量),glColor3f()设定绘图所用颜色。main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,我们关注的是display()函数,它是我们真正绘图的地方。函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, blue),每种颜色值在(0.0, 1.0)之间。为了能显示更多的颜色,最好把系统设置成16位真彩色模式。函数glVertex2f(x, y)设置二维顶点。函数glB
11、egin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:GL_POINTS画点GL_LINES画线,每两个顶点(Vertex)为一组GL_LINE_STRIP画线,把若干个顶点顺次连成折线GL_LINE_LOOP画线,把若干个顶点顺次连成封闭折线GL_TRIANGLES画三角形,每三个顶点为一组GL_QUADS画四边形,每四个顶点为一组GL_POLYGON画多边形还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。
12、大家可以把每一种状态都试一试。程序可以有多组glBegin()、glEnd()并列的形式,如:. .glBeing(GL_LINES);.glEnd();glBeing(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. 通过实现三种直线和圆
13、生成算法对算法原理加深理解。2. 熟悉Turbo C开发环境,要求会对程序进行编辑,编译,调试(包括分步,断点设置等调试手段)。二、实验要求在Turbo C环境下实现三种直线生成算法。三、实验内容1)对逐点比较法、DDA算法、Bresenham算法进行理解。2)画出程序流程图;3)编写程序的源程序;4)编辑源程序并进行调试;5)进行特殊模式的运行测试,并结合情况进行调整;6)打印源程序或把源程序以文件的形式提交。四、实验报告1)按实验报告册格式书写实验报告;2)提交源程序文件或打印件。五、建立工程步骤1.在visual c+.net中使用opnengl,建立项目的步骤:2、在visual c+
14、中的建立控制台项目的步骤:实验三 填充和裁剪算法(4学时)一、实验目的1. 加深对填充算法的理解。2. 综合运用以前学过数据结构和算法设计知识。2. 熟悉Turbo C开发环境,要求会对程序进行编辑,编译,调试(包括分步,断点设置等调试手段)。二、实验要求在Turbo C环境下实现扫描线种子填充算法和Y-X算法。三、实验内容1)对扫描线种子填充算法和Y-X算法、编码裁剪算法、中点分割裁剪算法进行复习理解进行复习理解。2)画出程序流程图;3)编写程序的源程序;4)编辑源程序并进行调试;5)打印源程序或把源程序以文件的形式提交。四、实验报告1)按实验报告册格式书写实验报告;2)提交源程序文件或打印
15、件。五、建立win32应用程序工程。1、visual c+6.0下的界面接下来,请按实验二中的方法给上面建立的空项目添加文件“recursion.cpp”,由于同学们初次接触WIN32编程,所以对于下文中很多代码可暂时不要求理解,重点了解红色代码。递归算法源码如下:/ INCLUDES /#define WIN32_LEAN_AND_MEAN / just say no to MFC#include <windows.h> / include all the windows headers#include <windowsx.h> / include useful ma
16、cros/ DEFINES / defines for windows #define WINDOW_CLASS_NAME "WINCLASS1"#define WINDOW_WIDTH 400#define WINDOW_HEIGHT 300/ GLOBALS /HWND main_window_handle = NULL; / globally track main windowHINSTANCE hinstance_app = NULL; / globally track hinstancevoid BoundaryFill4(HDC,int,int,COLORREF
17、,COLORREF);/ FUNCTIONS /LRESULT CALLBACK WindowProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)/ this is the main message handler of the systemHDChdc;/ handle to a device contextHPEN hnewpen;HPEN holdpen;/ what is the message switch(message)case WM_RBUTTONDOWN:hdc=GetDC(hwnd);hnewpen=Crea
18、tePen(PS_SOLID,1,RGB(0,255,0);holdpen=(HPEN)SelectObject(hdc,hnewpen);/ 构造多边形MoveToEx(hdc,30,40,NULL);LineTo(hdc,60,40);LineTo(hdc,90,100);LineTo(hdc,60,150);LineTo(hdc,30,150);LineTo(hdc,30,40);SelectObject(hdc,holdpen);DeleteObject(hnewpen);ReleaseDC(hwnd,hdc);return(0);break;case WM_LBUTTONDOWN:h
19、dc = GetDC(hwnd);BoundaryFill4(hdc,LOWORD(lParam),HIWORD(lParam),RGB(0,255,0),RGB(255,0,0); / release the dcReleaseDC(hwnd,hdc);return(0);break;case WM_DESTROY: / kill the application, this sends a WM_QUIT message PostQuitMessage(0); / return successreturn(0); break;default:break; / end switch/ proc
20、ess any messages that we didn't take care of return (DefWindowProc(hwnd, message, wParam, lParam); / end WinProc/ WINMAIN /int WINAPI WinMain(HINSTANCE hinstance,HINSTANCE hprevinstance,LPSTR lpcmdline,int ncmdshow)WNDCLASSEX winclass; / this will hold the class we createHWND hwnd; / generic win
21、dow handleMSG message; / generic message/ first fill in the window class stucturewinclass.cbSize = sizeof(WNDCLASSEX);winclass.style= CS_DBLCLKS | CS_OWNDC | CS_HREDRAW | CS_VREDRAW;winclass.lpfnWndProc= WindowProc;winclass.cbClsExtra= 0;winclass.cbWndExtra= 0;winclass.hInstance= hinstance;winclass.
22、hIcon= LoadIcon(NULL, IDI_APPLICATION);winclass.hCursor= LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);winclass.lpszMenuName= NULL;winclass.lpszClassName= WINDOW_CLASS_NAME;winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);/ save hinstance in globalhinstan
23、ce_app = hinstance;/ register the window classif (!RegisterClassEx(&winclass)return(0);/ create the windowif (!(hwnd = CreateWindowEx(NULL, / extended style WINDOW_CLASS_NAME, / class "Scanline Fill Demo", / title WS_OVERLAPPEDWINDOW | WS_VISIBLE, 0,0, / initial x,y WINDOW_WIDTH, / ini
24、tial width WINDOW_HEIGHT,/ initial height NULL, / handle to parent NULL, / handle to menu hinstance,/ instance of this application NULL)/ extra creation parmsreturn(0);/ save main window handlemain_window_handle = hwnd;while(GetMessage(&message,NULL,0,0)/ translate any accelerator keysTranslateM
25、essage(&message);/ send the message to the window procDispatchMessage(&message); / end while/ return to Windows like thisreturn(message.wParam); / end WinMain/void BoundaryFill4(HDC hdc,int x,int y,COLORREF boundarycolor,COLORREF newcolor)COLORREF color;color=GetPixel(hdc,x,y);if(color != bo
26、undarycolor) && (color !=newcolor)SetPixel(hdc,x,y,newcolor);BoundaryFill4(hdc,x,y+1,boundarycolor,newcolor);BoundaryFill4(hdc,x,y-1,boundarycolor,newcolor);BoundaryFill4(hdc,x-1,y,boundarycolor,newcolor);BoundaryFill4(hdc,x+1,y,boundarycolor,newcolor);2、中建立Win32工程更改项目中recursion.cpp文件代码:1)声明
27、函数void BoundaryFill4(HDC,int,int,COLORREF,COLORREF);2)修改LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)函数中代码,把visualc+6.0介绍的recursion.cpp中的WndProc函数体复制即可。3)在recursion.cpp文件末尾添加BoundaryFill4函数。2.下面的程序绘制的是一个简单的太阳系,其中包括一个太阳和一颗行星,它们使用线框球体绘制函数实现。当按下键盘“D”或“d”时,行星将实现自转;按下键盘“
28、Y”或“y”时,行星将绕太阳公转。请同学们认真读懂每一段代码,然后试着修改这段程序,实现1)将行星的中心倾斜;2)给行星加上卫星。#include <GL/glut.h>#include <stdlib.h>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); glPu
29、shMatrix();/ glutWireSphere中第一、二、三个参数分别表示半径,经度线数、纬度线数 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();vo
30、id reshape (int w, int h) 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 (unsig
31、ned char key, int x, int 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; glutP
32、ostRedisplay(); break; case 27: exit(0); break; default: break; int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutR
33、eshapeFunc(reshape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0;实验四二维图形的几何变换一、实验学时2学时二、实验目的和要求1、掌握二维图形的基本几何变换,如平移、旋转、缩放、对称、错切变换;2、掌握OpenGL中模型变换函数,实现简单的动画技术。三、实验内容1、下面的代码采用GLUT库,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动),请修改代码,实现矩形在窗口内沿着水平线匀速移动。/* * double.c * This is a simple double buffered program. * P
34、ressing the left mouse button rotates the rectangle. * Pressing the right mouse button stops the rotation. */#include <GL/glut.h>#include <stdlib.h>static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix(); glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.
35、0, 1.0); glRectf(-10.0, -10.0, 10.0, 10.0); glPopMatrix(); glutSwapBuffers();void spinDisplay(void) spin = spin + 2.0; if (spin > 360.0) spin = spin - 360.0; glutPostRedisplay();void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void reshape(int w, int h) glViewport (0, 0,
36、(GLsizei) w, (GLsizei) h); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(-50.0, 50.0, -50.0, 50.0, -1.0, 1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity();void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(spinDisplay)
37、; break; case GLUT_MIDDLE_BUTTON: case GLUT_RIGHT_BUTTON: if (state = GLUT_DOWN) glutIdleFunc(NULL); break; default: break; /* * Request double buffer display mode. * Register mouse input callback functions */int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_DOUBLE
38、| GLUT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMouseFunc(mouse); glutMainLoop(); return 0; /* ANSI C requires main to return int. */2、课堂教学中关于模型变化讲解时,对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图
39、。请以该例为蓝本,实现3题的代码编写。源码:#include <GL/glut.h>#include <stdlib.h>void init(void) glClearColor (0.0, 0.0, 0.0, 0.0); glShadeModel (GL_FLAT);void draw_triangle(void) glBegin (GL_LINE_LOOP); glVertex2f(0.0, 25.0); glVertex2f(25.0, -25.0); glVertex2f(-25.0, -25.0); glEnd();void display(void) glC
40、lear (GL_COLOR_BUFFER_BIT); glColor3f (1.0, 1.0, 1.0); glLoadIdentity (); glColor3f (1.0, 1.0, 1.0); draw_triangle (); glEnable (GL_LINE_STIPPLE); glLineStipple (1, 0xF0F0); glLoadIdentity (); glTranslatef (-20.0, 0.0, 0.0); draw_triangle (); glLineStipple (1, 0xF00F); glLoadIdentity (); glScalef (1
41、.5, 0.5, 1.0); draw_triangle (); glLineStipple (1, 0x8888); glLoadIdentity (); glRotatef (90.0, 0.0, 0.0, 1.0); draw_triangle (); glDisable (GL_LINE_STIPPLE); glFlush ();void reshape (int w, int h) glViewport (0, 0, (GLsizei) w, (GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity (); if (w &l
42、t;= h) gluOrtho2D (-50.0, 50.0, -50.0*(GLfloat)h/(GLfloat)w, 50.0*(GLfloat)h/(GLfloat)w); else gluOrtho2D (-50.0*(GLfloat)w/(GLfloat)h, 50.0*(GLfloat)w/(GLfloat)h, -50.0, 50.0); glMatrixMode(GL_MODELVIEW);int main(int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode (GLUT_SINGLE | GL
43、UT_RGB); glutInitWindowSize (500, 500); glutInitWindowPosition (100, 100); glutCreateWindow (argv0); init (); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0;实验结果图:3、已知某三角形的三顶点坐标为50.0,25.0,150.0,25.0,100.0,100.0。要求:(1)创建一个长宽分别为600、600的窗口,窗口的左上角位于屏幕坐标(100,100)处。(提示:请试着修改gluOrtho2D函数参数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年应对突发事件的护理措施与试题及答案
- 消防工程的科学研究方向试题及答案
- 中级会计科目交叉的试题及答案研究
- 2024高级审计师考试准备策略试题及答案
- 应对 护师考试的试题及答案
- 2024高级会计考试策略试题及答案
- 无人机飞行中的伦理责任与行业规范试题及答案
- 无人机在军事中的使用试题及答案
- 22025年护师临床实践题库及答案汇集
- 展望未来2025年一级建造师考试试题及答案
- 仿古建筑工程施工合同
- 恐动症品管圈课件
- 电商平台对用户交易纠纷的处理和解决方案
- 森林生态修复技术方案
- 婴幼儿托育服务与管理专业人才需求调研报告
- 江苏省四所百强中学2022-2023学年高二下学期6月联考生物试题含答案
- 隧道工程维护与修复技术
- 智慧社区平台运营方案
- 不良资产项目律师法律尽调报告(模板)
- 全钢子午线轮胎一次法成型机课件
- 产品借用申请表
评论
0/150
提交评论