![人力资源opengl学习指导实验 计算机图形学上机_第1页](http://file4.renrendoc.com/view/3a07ab5d1c60c5f5e218d1df9e6d2b58/3a07ab5d1c60c5f5e218d1df9e6d2b581.gif)
![人力资源opengl学习指导实验 计算机图形学上机_第2页](http://file4.renrendoc.com/view/3a07ab5d1c60c5f5e218d1df9e6d2b58/3a07ab5d1c60c5f5e218d1df9e6d2b582.gif)
![人力资源opengl学习指导实验 计算机图形学上机_第3页](http://file4.renrendoc.com/view/3a07ab5d1c60c5f5e218d1df9e6d2b58/3a07ab5d1c60c5f5e218d1df9e6d2b583.gif)
![人力资源opengl学习指导实验 计算机图形学上机_第4页](http://file4.renrendoc.com/view/3a07ab5d1c60c5f5e218d1df9e6d2b58/3a07ab5d1c60c5f5e218d1df9e6d2b584.gif)
![人力资源opengl学习指导实验 计算机图形学上机_第5页](http://file4.renrendoc.com/view/3a07ab5d1c60c5f5e218d1df9e6d2b58/3a07ab5d1c60c5f5e218d1df9e6d2b585.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学实验指导书计算机科学与信息工程学院目录 TOC o 1-3 p h z u HYPERLINK l _Toc148152179 实验一OpenGL程序设计. PAGEREF _Toc148152179 h 3 HYPERLINK l _Toc148152180 实验二二维根本图元的生成 . PAGEREF _Toc148152180 h 7 HYPERLINK l _Toc148152181 实验三二维图元的填充 PAGEREF _Toc148152181 h 13 HYPERLINK l _Toc148152182 实验四二维图形的几何变换 . PAGEREF _Toc14815
2、2182 h 18 HYPERLINK l _Toc148152183 实验五 裁剪. PAGEREF _Toc148152183 h 23 HYPERLINK l _Toc148152184 实验六自由曲线. PAGEREF _Toc148152184 h 26 HYPERLINK l _Toc148152185 实验七造型技术. PAGEREF _Toc148152185 h 27 HYPERLINK l _Toc148152186 实验八交互式技术. PAGEREF _Toc148152186 h 32 HYPERLINK l _Toc148152187 实验九真实感图形的绘制. PAG
3、EREF _Toc148152187 h 37计算机图形学实验指导一、实验目的1、培养学生动手编程解决实际问题的能力。2、训练学生分析问题和调试程序的能力。3、锻炼学生撰写科技实验论文的能力。二、实验要求1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。2、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。(2)最后准备调试程序的数据及测试方案。 3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。(2)调试前,先运行一遍程序看看究竟将会发生什么。(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量
4、值等手段。4、整理实习报告 HYPERLINK :/ /cugFirst/computer_graphics/practice/0.htm l # 三、实验报告1、实验内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。3、设计:数据结构设计和核心算法设计。主要功能模块的输入,处理算法框架和输出。4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。5、心得:包括程序的改良设想,经验和体会。6、程序清单:源程序,其中包括变量说明及详细的注释。实验一OpenGL程序设计实验学时2学时实验类型学习型实验实验目的和要求初步了解Open
5、GL程序设计结构;了解OpenGL的根本数据类型、核心函数及辅助函数的使用。实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C+,它对OpenGL提供了完备的支持。OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。2、在VC中新建工程 新建一个工程。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即
6、可。VC为你创立一个工作区WorkSpace,你的工程Test就放在这个工作区里。为工程添加文件 为了使用OpenGL,我们需要在工程中参加三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:program filesMicrosoft Visual Studiovc98lib目录中。选中菜单Project-Add To Project-Files项或用鼠标右键,把这三个文件参加工程,在FileView中会有显示。这三个文件请务必参加,否那么编译时会出错。或者将这三个文件名添加到Project-Setting-Link-Object/lib
7、rary Modules 即可。点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它参加到工程中,然后就可以开始编程了。#include #include #include #include /初始化OpenGL场景void myinit (void) glClearColor (0.0, 0.0, 0.0, 0.0);/将背景置成黑色 glShadeModel (GL_FLAT);/设置明暗处理/用户的绘图过程void CALLBACK display(void) glClear (GL_COLOR_BUFFER_BIT | GL_DEP
8、TH_BUFFER_BIT);/去除缓存 glBegin(GL_LINES);/开始画一根白线 glColor3f (, , );/设置颜色为白色 /设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 glVertex2f(, ); glVertex2f(, ); glColor3f (, , );/设置颜色为红色 /设置第二根线的两个端点 glVertex2f(, ); glVertex2f(, ); glEnd();/画线结束 glFlush ();/绘图结束/主过程:/初始化Windows的窗口界面/并初始化OpenGL场景,绘图int main(int argc,
9、char* argv) auxInitDisplayMode (AUX_RGB);/初始化显示模式,采用RGB彩色系统。 auxInitPosition (0, 0, 400, 150);/初始化窗口位置、大小 auxInitWindow (Display Lists);/初始化窗口,设置标题 myinit (); auxMainLoop(display);/循环运行display过程,display由用户编写 return(0);3、程序说明 每个函数的具体含义在程序注释中已作了表达,不再多说。OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如
10、:glColor3f(),字母f指明要使用浮点数。字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。OpenGL采用的是状态机的方式,用户设定一种状态,程序照此运行。如:glBegin(GL_LINES)设定画线状态GL_LINES是OpenGL已定义好的常量,glColor3f()设定绘图所用颜色。main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,我们关注的是display()函数,它是我们真正绘图的地方。函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, b
11、lue),每种颜色值在0.0, 1.0)之间。为了能显示更多的颜色,最好把系统设置成16位真彩色模式。函数glVertex2f(x, y)设置二维顶点。函数glBegin(UINT State)、glEnd()是最根本的作图函数,下面对它作一介绍。如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:GL_POINTS画点GL_LINES画线,每两个顶点(Vertex)为一组GL_LINE_STRIP画线,把假设干个顶点顺次连成折线GL_LINE_LOOP画线,把假设干个顶点顺次连成封闭折线GL_TRIANGLES画三角形,每三个顶点为一组GL_QUADS
12、画四边形,每四个顶点为一组GL_POLYGON画多边形还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。大家可以把每一种状态都试一试。程序可以有多组glBegin()、glEnd()并列的形式,如:. .glBeing(GL_LINES);glEnd();glBeing(GL_QUADS);. .glEnd();. .除了上述的根本图元外,函数glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。glColor3f (, , );gl
13、Rectf(, , ,);实验二二维根本图元的生成一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维根本图元直线段生成的DDA算法,中点算法;2、掌握二维根本图元圆弧生成的中点算法;3、掌握对线型线宽的属性的控制。四、实验内容1、编程实现DDA、中点算法生成直线2、中点扫描转换生成圆、椭圆五、建立工程步骤1、新建一个工程。 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创立一个工作区WorkSpace,你的工程Tes
14、t就放在这个工作区里。2、为工程添加文件 为了使用OpenGL,我们需要在工程中参加三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:program filesMicrosoft Visual Studiovc98lib目录中。选中菜单Project-Add To Project-Files项或用鼠标右键,把这三个文件参加工程,在FileView中会有显示。这三个文件请务必参加,否那么编译时会出错。或者将这三个文件名添加到Project-Setting-Link-Object/library Modules 即可。点击工具条中New Te
15、xt File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它参加到工程中,然后就可以开始编程了。增量法画直线void CALLBACK dda(void) int x1=10; int x2=400; int y1=10; int y2=500; int k,i; float x, y, dx, dy; k = abs(x2-x1); if (abs(y2-y1)k) k = abs(y2-y1); dx = (float)(x2-x1)/k; dy = (float)(y2-y1)/k; x = (float)x1; y = (float)y1; glClear (GL
16、_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /去除缓存 glBegin(GL_LINES);/开始画一根白线 glColor3f(, , ); /设置颜色为白色 /设置第一根线的两个端点,请注意:OpenGL坐标系的原点是在屏幕左下角 for(i = 0; i k ; i+ ) glVertex2f(int)(x), (int)(y); glVertex2f(int)(x+dx), (int)(y+0.5+dy); /g.drawLine(int)(x+.5f), (int)(y+.5f), (int)(x+.5f), (int)(y+.5f); x =
17、 x+dx; y = y+dy;glColor3f (, , ); glEnd();/画线结束 glFlush ();/绘图结束 /中点法画直线/void CALLBACK bresenham(Graphics g, int xs, int ys, int xe, int ye)void CALLBACK bresenham(void) int xs=10; int xe=400; int ys=10; int ye=500; int i;int dx = xe-xs; int dy = ye-ys; int e = 2*dy-dx; int x = xs; int y = ys;glClea
18、r (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /去除缓存 glBegin(GL_LINES);/开始画一根白线 glColor3f(, , ); for( i= 0;i =0) y=y+1; e=e-2*dx; x=x+1; e=e+2*dy; glVertex2f(int)(x), (int)(y); /画点x, y glColor3f (, , ); glEnd();/画线结束 glFlush ();/绘图结束/中点法画圆/void bresenham_arc(Graphics g,int radius)void CALLBACK brese
19、nham_arc(void) int radius= 200; int x,y,d; x = 0; y = radius; d = 3-2*radius;glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); /去除缓存 glBegin(GL_LINES);/开始画一根白线 glColor3f(, , ); while (x y) glVertex2f(int)(x), (int)(y); if(d0) d=d+4*x+6; else d=d+4*(x-y)+10; y-; x+; glVertex2f(int)(x), (int)(y);gl
20、Color3f (, , ); glColor3f (, , ); if(x = y) glVertex2f(int)(x), (int)(y); glVertex2f(int)(x), (int)(y); glEnd();/画线结束 glFlush ();/绘图结束 /主过程:/初始化Windows的窗口界面/并初始化OpenGL场景,绘图int main(int argc, char* argv) auxInitDisplayMode (AUX_RGB);/初始化显示模式,采用RGB彩色系统。 auxInitPosition (0, 0, 400, 850);/初始化窗口位置、大小 aux
21、InitWindow (Display Lists);/初始化窗口,设置标题 myinit (); /auxMainLoop(dda);/auxMainLoop(bresenham);auxMainLoop(bresenham_arc); /auxMainLoop(display);/dda(0,0,500,600);/循环运行display过程,display由用户编写 return(0);掌握对线型宽型的控制,将以上各图传入参数中增加线宽参数,查看图形绘制效果。2、在visual c+中的建立控制台工程的步骤:实验三二维图元的填充一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1
22、、掌握二维图元填充的递归算法;2、掌握二维图元填充的种子填充算法四、实验内容构造任意一个边界表示的多边形,假定该多边形内部是四连通的。要求:1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。参照教案进行2、用种子填充扫描线算法实现多边形内部的填充。五、建立win32应用程序工程。接下来,请按实验二中的方法给上面建立的空工程添加文件“,由于同学们初次接触WIN32编程,所以对于下文中很多代码可暂时不要求理解,重点了解红色代码。递归算法源码如下:/ INCLUDES /#define WIN32_LEAN_AND_MEAN / just say no to MFC#include /
23、 include all the windows headers#include / include useful macros/ 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
24、hinstancevoid BoundaryFill4(HDC,int,int,COLORREF,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)
25、case WM_RBUTTONDOWN:hdc=GetDC(hwnd);hnewpen=CreatePen(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
26、(hwnd,hdc);return(0);break;case WM_LBUTTONDOWN:hdc = 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 successre
27、turn(0); break;default:break; / end switch/ process any messages that we didnt 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
28、the class we createHWND hwnd; / generic window 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
29、= 0;winclass.hInstance= hinstance;winclass.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_APP
30、LICATION);/ save hinstance in globalhinstance_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, / init
31、ial x,y WINDOW_WIDTH, / initial 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 acc
32、elerator keysTranslateMessage(&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)
33、;if(color != boundarycolor) & (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、更改工程中recursion.cpp文件代码:1声明函数voi
34、d BoundaryFill4(HDC,int,int,COLORREF,COLORREF);2修改LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)WndProc函数体复制即可。BoundaryFill4函数。实验四二维图形的几何变换一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图形的根本几何变换,如平移、旋转、缩放、对称、错切变换;2、掌握OpenGL中模型变换函数,实现简单的动画技术。四、实验内容1、下面的代码采用GLUT库,实现了一个矩形在窗口中匀速转动单
35、击鼠标右键停止转动,请修改代码,实现矩形在窗口内沿着水平线匀速移动。/* * This is a simple double buffered program. * Pressing the left mouse button rotates the rectangle. * Pressing the right mouse button stops the rotation. */#include #include static GLfloat spin = 0.0;void display(void) glClear(GL_COLOR_BUFFER_BIT); glPushMatrix()
36、; glRotatef(spin, 0.0, 0.0, 1.0); glColor3f(1.0, 1.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)
37、;void reshape(int w, int h) glViewport (0, 0, (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
38、 (state = GLUT_DOWN) glutIdleFunc(spinDisplay); 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
39、, argv); glutInitDisplayMode (GLUT_DOUBLE | 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、课
40、堂教学中关于模型变化讲解时,对一个三角形分别实现平移、缩放、旋转等变化的源码及效果图。请以该例为蓝本,实现3题的代码编写。源码:#include #include 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(
41、void) glClear (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, 0 xF0F0); glLoadIdentity (); glTranslatef (-20.0, 0.0, 0.0); draw_triangle (); glLineStipple (1, 0 xF00F); glLoadIdentity ();
42、glScalef (1.5, 0.5, 1.0); draw_triangle (); glLineStipple (1, 0 x8888); 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
43、(); if (w = 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
44、| GLUT_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处。提示:请试着修改gluO
45、rtho2D函数参数,使得绘制的三角形尽可能居中显示2绘制一个由上述顶点所描绘的三角形,实现该三角形进行以下的几何变化:首先使三角形沿着其中心的x轴,y轴方向缩小50%;然后沿着初始中心旋转90度;最后沿着y轴平移100个单位。实验结果如以下图所示:实验五裁剪一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图形的根本裁剪算法,如编码算法、中点分割算法、Liang-Barsky算法;2、掌握OpenGL中矩阵堆栈函数的使用,实现简单的组合变换。四、实验内容1、采用Liang-Barsky算法,编程实现教材177页6.15题。其他裁剪算法同学们可作为课后练习要求:1单击鼠标左
46、键,运行窗口出现裁剪窗口及待裁剪线段,效果图如左以下图;2单击鼠标右键,窗口呈现出裁剪后的裁剪窗口及裁剪线段,效果图如右以下图。提示:1关于鼠标的交互操作,请同学们参考实验四中的第1题;2绘制图形的函数,建议放在回调函数mouseint button,int state,int x,int y中,而display()函数中可只保存glClear (GL_COLOR_BUFFER_BIT)去除颜色缓存这个函数。3考虑到该裁剪窗口和裁剪线段的大小,建议将reshape()函数中的正交投影函数参数变为glOrtho(-5.0, 5.0, -5.0, 5.0, -1.0, 1.0);2、下面的程序绘制
47、的是一个简单的太阳系,其中包括一个太阳和一颗行星,它们使用线框球体绘制函数实现。当按下键盘“D或“d时,行星将实现自转;按下键盘“Y或“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); g
48、lColor3f (1.0, 1.0, 1.0); glPushMatrix();/ 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 */ glPop
49、Matrix(); glutSwapBuffers();void 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,
50、1.0, 0.0);void keyboard (unsigned 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; glutPostRedispl
51、ay(); 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); glutReshapeFunc(res
52、hape); glutKeyboardFunc(keyboard); glutMainLoop(); return 0;实验六自由曲线一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握Hermite曲线生成算法;2、掌握Bezier曲线的定义生成算法、离散生成算法;3、掌握B样条曲线的定义生成算法。四、实验内容假设窗口的宽高分别是600,600个像素单位,定义的裁剪窗口由函数gluOrtho2D(-50.0,50.0,-50.0,50.0)决定。1、空间点两点P0-40.0,-40.0,0.0、P110.0,-200.0,0.0及该点上的切向量分别为R030.0,240.0,0
53、.0,R130.0,-240.0,0.0。试编程实现Hermite曲线的绘制。2、空间四点P0-40.0,-40.0,0.0、P1-10.0,200.0,0.0、P210.0,-200.0,0.0、P340.0,40.0,0.0,根据Bezier曲线的定义编程绘制曲线。3、空间四点P0-40.0,-40.0,0.0、P1-10.0,200.0,0.0、P210.0,-200.0,0.0、P340.0,40.0,0.0,根据Bezier曲线的离散生成算法绘制曲线。4、空间四点P0-40.0,-40.0,0.0、P1-10.0,200.0,0.0、P210.0,-200.0,0.0、P340.0,
54、40.0,0.0,根据B样条曲线的定义绘制曲线。实验七造型技术一、实验学时2学时二、实验类型设计型实验三、实验目的和要求了解分形几何的根本概念,实现分形Cayley树、koch曲线、Sierpinski三角形、Mandelbrot集的绘制。四、实验内容下面给出了几种分形图案实现的原理或C语言代码,同学们选做其中两题,实现在VC编译器下分形图的绘制。1、Cayley树的初始生成元是一个“丫字形的几何形状,经过有限次自相似的迭代过程完成。下面的代码是在TC下实现.。#include graphics.h#include math.hvoid cayley(int n,float x0,float
55、y0,float len,int th) float x1,y1,x2,y2,x3,y3; int th1=20,th2=20; float scale=0.7,dtor=PI/180,sl=scale*len; if(n=1)return; x1=x0+len*cos(th*dtor); y1=y0-len*sin(th*dtor); x2=x1+sl*cos(th+th1)*dtor); y2=y1-sl*sin(th+th1)*dtor); x3=x1+sl*cos(th-th2)*dtor); y3=y1-sl*sin(th-th2)*dtor); line(x0,y0,x1,y1);
56、 line(x1,y1,x2,y2); line(x1,y1,x3,y3); cayley(n-1,x1,y1,sl,th+th1); cayley(n-1,x1,y1,sl,th-th2); main() float x=320.0,y=470.0; int th=90,len=120; int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); setcolor(GREEN); cayley(2,x,y,len,th); getch(); cayley(3,x,y,len,th); getch(); cayley(5,x,y,len,th)
57、; getch(); cayley(10,x,y,len,th); getch(); cayley(15,x,y,len,th); getch(); closegraph();2、KOCH曲线的生成过程是先作一条直线,然后在直线的中央作一个等边三角形;再在每一条线段的中央分别作一个等边三角形; 依照此法,无限制地进行下去,就形成了Koch曲线。下面是KOCH曲线的C语言代码。#includegraphics.h#includemath.hfloatx=80,y=420;intth=0,L=6;floatdtor=3.1415926/180;void koch(int n)float d;d=L
58、/3n;if(n=0) moveto(x,y); x+=d*cos(th*dtor); y-=d*sin(th*dtor); lineto(x,y); return; koch(n-1); th+=60; koch(n-1); th-=120; koch(n-1); th+=60; koch(n-1);main() int gdriver=DETECT,gmode; initgraph(&gdriver,&gmode,); cleardevice(); setbkcolor(0); setcolor(9); line(80,60,560,60); getch(); moveto(80,240)
59、; lineto(240,240); lineto(320,100); lineto(400,240); lineto(560,240); getch(); settextstyle(2,0,5); outtextxy(40,50,(a); outtextxy(40,230,(b); outtextxy(40,410,(c); koch(5); getch(); closegraph(); cleardevice();3、Sierpinski三角形的生成过程是:首先作一个完全填充的三角形二维;从中间移去一个三角形,然后再在剩下的三角形中分别移去一个三角形;不断地循环迭代。下面是Sierpins
60、ki三角形的C语言代码。#include graphics.h#include math.h#include stdlib.h#include conio.h#include time.h#define N 65535 /*迭代次数*/*=*/main() int GraphDriver=DETECT;int GraphMode;unsigned int k,mod;double TempX,TempY,StartX,StartY;initgraph(&GraphDriver,&GraphMode,c:bc31bgi);randomize();/*=*/*Draw triangle 用迭代函数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 门面出租协议书范本
- 数字化合作协议书范本
- 人教版地理七年级上册第一节《多变的天气》听课评课记录5
- 湘教版数学七年级上册1.5.2《有理数的除法》听评课记录
- 常州信息职业技术学院《城市规划原理》2023-2024学年第二学期期末试卷
- 商丘工学院《区域地质与矿产调查》2023-2024学年第二学期期末试卷
- 成都医学院《医学创新》2023-2024学年第二学期期末试卷
- 广西工业职业技术学院《护理教育学》2023-2024学年第二学期期末试卷
- 榆林学院《中外语言文化比较》2023-2024学年第二学期期末试卷
- 西安明德理工学院《细胞生物学专题》2023-2024学年第二学期期末试卷
- 2024黑龙江公务员考试【A类、B类、省直、笔试】四套真题及答案
- 2025年中国高价HPV疫苗行业竞争格局分析及投资规划研究报告
- 2025年春新北师大版物理八年级下册课件 第七章 运动和力 第四节 同一直线上二力的合成
- 2025年公司年会活动总结样本(3篇)
- 《肝硬化的临床表现》课件
- 村卫生室2025年初工作计划
- 派出所校园安全创新
- 22G614-1 砌体填充墙结构构造
- DL-T5153-2014火力发电厂厂用电设计技术规程
- 眼科疾病与视觉健康
- 运营维管段安全保护区环境管理实施细则(试行)
评论
0/150
提交评论