




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级编程技术一、高级编程简介:本学期C语言的大量NO程训练,都只是为了打基础,能解决 一些简单的小问题,离真正的应用程序开发相差甚远, 为此,还需学 习高级编程技术。不同的行业需要开发不同的应用程序,高级编程技术具有很强的 专业性,在C语言的发展进程中,无数科学家和程序员开发出了数量 众多、性能卓越的专业函数库,充分利用好这些函数库是编写应用程 序的关键。高级编程涉及内容广泛,包括界面编程、图形编程、多媒体编程、 网络编程和数据库编程等方面。无论哪方面的编程,只要把开发环境 配置好,就可以使用那些专业函数库。二、开发环境的配置C语言开发工具一般会自动配置好标准函数库的使用环境,使用标准函数库的
2、C程序可以直接编译和连接。但如果是使用其他的专业 函数库,就需要配置开发环境。通常,一个提供给程序员使用的专业函数库有 4部分内容: 头文件(*.h ):函数原型、宏常量定义等。库文件(*.lib ):函数的二进制代码。动态链接库(*.dll ):专业函数库的程序运行时用使用手册文档所谓开发环境配置就是把这些文件放在适当的位置让编译器和连 接器可以找到,或者设置编译器和连接器的搜索路径以便编译和连接 时能找到它们。通常,将专业函数库的头文件*.h添加到开发工具的系统include 路径,将库文件*.lib 添加到开发工具的系统lib路径,将动态链接 库* dll 复制到 windows 系统文
3、件夹 windowssystem32。下面通过图形编程的例子来说明如何进行高级编程。三、OpenGLS形编程举例图形编程通常应用于计算机图形学中,用来绘图、动画显示、虚 拟现实等。常用的图形函数库有:OpenGL SDL OpenC停。开放图形库 OpenGL(open graphics library )是一个功能很强 大的专业图形接口,是开源自由软件,其特性:与 C语言紧密结合, 强大的可移植性,高性能的图形渲染。适用于三维建模、三维动画和 影视软件等领域。OpenGUt方网站(英文) :OpenGL的gl库是核心库,glu是实用库,glut是实用工
4、具库, gl是核心,glu是对gl的部分封装,glut是OpenGL勺跨平台工具 库,gl中包含了最基本的3D函数。glut是基本的窗口界面,是独立 于gl和glu的,如果不喜欢用glut可以用MFGD Win32窗口等代替, 但是glut是跨平台的,这就保证了编出的程序是跨平台的,如果用MFCM者Win32只能在windows操作系统上使用。选择 OpenGL勺一个很大原因就是因为它的跨平台性,所以我们尽量使用glut库。Glut下载地址:/resources/libraries/glut/glutdlls37beta.zip对 glutdlls37b
5、eta文件解压得到 5 个文件:glut.dll , glut.h ,glut.lib , glut32.dll , glut32.lib 。Glut开发环境配置:将 glut.h 复制到.codeblocksmingwincludegl文件夹中。将 glut32.lib 复制到.codeblocksmingwlib文件夹中。将 glut32.dll 复制到 c:windowssystem32 文件夹中。打开codeblocks ,在设置编译器链接器设置为:搜索路径设置为:Glut作为OpenG牖程实用工具库,它能编写带窗口的OpenG应 用程序。Glut是以OpenG的基础的,由于在 Glu
6、t的头文件glut.h 已经包含OpenGL勺头文件gl.h和glu.h ,因此应用程序中只需要 Glut的头文件。#include <glglut.h>开发环境配置好以后,就可以开始建立项目,绘制OpenGLS形。在我们的Codeblocks 13.12课堂教学版本中,已经将常用的专业 函数库软件包下载好,并且已经将开发环境配置好,无需大家再下载 并配置include包含和lib库连接。开发步骤如下:1、开始新建项目,选择“ FreeGLUT project ”。2、"请选择FreeGLUT所在的文件夹:”时如下:3、项目建立后,开始编写代码:利用Glut编写OpenG
7、唱形程序时,可以编写带窗口的应用程序。(1)窗口管理为了完成初始化和创建窗口的任务,需要调用5个Glut函数。1) glutInit 函数:该函数用于初始化 GLUTS,必须在调用所有 其他GLUT1数之前调用该函数。2) glutInitDisplayMode函数:用来设定GLUTS 口的显示模式3) glutInitWindowPosition 函数:指定窗口左上角在屏幕上的 位置。4) glutInitWindowSize 函数:指定窗口大小。5) glutCreatWindow函数:创建一个窗口,在调用主循环函数 glutMainLoop ()前,窗口不会被显示出来。(2)显示回调函数
8、所谓回调函数是指被 Windows系统调用的用户自定义的函数。glutDisplayFunc 是GLUTt重要的事件回调函数,每当 GLUTA 为需要重新显示窗口内容时,都将调用由glutDisplayFunc 注册的显 示回调函数。因此,应用程序将 OpenGL制场境的处理都放到显示 回调函数中。(3)处理事件输入当指定事件发生时(比如某按键按下时,鼠标移动时),相 应的回调函数可以注册到如下 glut函数:1) glutReshapeFunc 函数用来注册窗口大小改变时调用的回调函数。2) glutKeyboardFunc 函数用来注册当按下一个键(ASCII生成键)时调用的按键处理函数。
9、3) glutSpecialFunc 函数用来注册当按下一个非ASCII生成键时调用的按键处理函数。4) glutMouseFunc 函数用来注册当鼠标按下或释放时调用的按键处理函数。5) glutMotionFunc 函数用来注册当鼠标移动时调用的按键处理函数。6) glutTimerFunc 函数用来注册一个定时器回调函数。7) glutIdleFunc 函数用来注册一个在事件循环空闲时执行的回调函数。(4)事件循环最后需要调用glutMainLoop函数,开启GLU住事件处理循 环,此时,之前创建好的窗口及窗口内容被显示出来,程序开始 处理键盘、鼠标、定时器、空闲操作等事件,直到程序终止
10、函数 才返回。(5)绘制三维物体的函数GLUTI供了许多三维物体的绘制函数,举例如下:线框球实心球void glutWireSphere(GLdouble radius, GLint slices, GLint stacks);void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks);void glutWireCube(GLdouble size);线框立方体void glutSolidCube(GLdouble size);实心立方体void glutWireTorus(GLdouble innerRadius, GL
11、double outerRadius, GLint nsides, GLint rings);框圆环void glutSolidTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings);心圆环void glutWireIcosahedron(void); 线框 20 面体void glutSolidIcosahedron(void); 实心 20 面体void glutWireOctahedron(void); 线框 8 面体void glutSolidOctahedron(void);实心 8 面
12、体void glutWireTetrahedron(void);线卞I 4 面体void glutSolidTetrahedron(void); 实心 4 面体void glutWireDodecahedron(GLdouble radius);线框 12 面体void glutSolidDodecahedron(GLdouble radius);实心 12 面体void glutWireCone(GLdouble radius, GLdouble height, GLint slices, GLint stacks);线框圆锥体void glutSolidCone(GLdouble radi
13、us, GLdouble height, GLint slices, GLint stacks);实心圆锥体void glutWireTeapot(GLdouble size); 线框茶壶void glutSolidTeapot(GLdouble size); 实心茶壶函数中,radius表示球体的半径,slices表示球体围绕z轴分割的数目,stacks表示球体沿着z轴分割 的数目。绘制中心在模型坐标原点,半径为radius的球体,球体围绕z轴分割slices次,球体沿着z轴分割stacks次程序举例:例1、制作茶壶旋转动画#define GLUT_DISABLE ATEXIT HACK#i
14、nclude <windows.h>#include <stdio.h> I#include <stdlib.h>#include <glglut.h> /GLUT 、GL GLU库头文件float red=0.0, blue=0.0, green=0.0; /绘制颜色void InitScene() /初始化OpenGL>示场景void ChangeSize(int w, int h) /OpenGL视区缩放GLfloat fAspect;fAspect = (h=0) ? 1.0f : (GLfloat)w/h;glViewport(0
15、,0,w,h); /定义视区glMatrixMode(GL_PROJECTION); 指定投影矩阵定义修剪空间glLoadIdentity(); / 加载单位矩阵gluPerspective(45,fAspect,1,1000); /定义透视投影矩阵glMatrixMode(GL_MODELVIEW); / 指定模型视图矩阵glLoadIdentity(); / 加载单位矩阵gluLookAt(0.0,0.0,5.0,0.0,0.0,-1.0,0.0f,1.0f,0.0f); /视图变换void RenderScene(void) /显示OpenG场景static float angle=0.
16、0; / 旋转角度glClearC010r(1.0,1.0,1.0,1.0); 设置清除缓冲区的颜色为白色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BlT)(/徐缓冲区glPushMatrix(); /将当前矩阵压入堆栈glRotatef(angle,0.0,1.0,0.0); /旋转矩阵glColor3f(red,green,blue); 设置绘图颜色glutWireTeapot(1.5); /绘制线框茶壶glPopMatrix(); / 将当前矩阵弹出堆栈glutSwapBuffers(); / 交换缓冲区angle+; /旋转角度自增void
17、 NormalKeysProc(unsigned char key, int x, int y) /处理ASCII生成键if (key=27) exit(0); / 按 Esc 键退出程序void SpecialKeysProc(int key, int x, int y) /处理非ASCII生成键|switch(key) / 按F1 F2 F3键调整茶壶颜色case GLUT_KEY_F1:red=1.0;green=0.0;blue=0.0;break; /红case GLUT_KEY_F2:red=0.0;green=1.0;blue=0.0;break; /绿case GLUT_KEY
18、_F3:red=0.0;green=0.0;blue=1.0;break; /int main(int argc, char *argv)glutInit(&argc, argv); / 初始化 GLUT?glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGBA); /初始化显示模式glutInitWindowPosition(100,100); / glutInitWindowSize(500,240); glutCreateWindow("Teapot 3D"); / glutDisplayFunc(RenderS
19、cene); / glutIdleFunc(RenderScene); / glutReshapeFunc(ChangeSize); /初始化窗口的位置创建一个大小为500x240的窗口创建一个窗口注册显示响应函数注册空闲响应函数,产生动画注册窗口大小变化响应函数glutKeyboardFunc(NormalKeysProc); / 注册 ASCII 按键响应函数glutSpecialFunc(SpecialKeysProc); / 注册非 ASCII 按键响应函数 InitScene(); / 初始化 OpenGL#示场景glutMainLoop(); /主循环处理return 0;显示结果
20、截图:修改本程序,试着改变窗口大小、改变窗口标题、改变三维图形、 改变颜色等等。例2、另一个更漂亮的茶壶程序代码:#include "GL/glut.h"#include "stdlib.h"#include "stdio.h"#include "math.h" static int big = 0;#define PI 3.1415926const GLfloat R = 8.0;static GLfloat leftMatrix16 = 1.0, 0.0, 0.0, 0.0,0.0, 1.0, 0.0, 0.0
21、,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0;static GLfloat rightMatrix16 = 1.0, 0.0, 0.0, 0.0,0.0, 1.0, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0;static GLfloat leftPersMatrix16 = 1.0, 0.0, 0.0, 0.0,0.0, 1.0, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0;static GLfloat rightPersMatrix16 = 1.0, 0.0,
22、 0.0, 0.0,0.0, 1.0, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0;void init(void) Iconst GLfloat SD = 0.06;GLfloat n = SD*R/2.0;/要是转秩/n=0;leftMatrix12 = n;rightMatrix12 = -n;/这里假设眼到屏幕为一米,以米为单位 GLfloat p = SD/(2*1*tan(PI/6)*1);/p = 0.0;leftPersMatrix12 = -p;rightPersMatrix12 = p;GLfloat mat_specular
23、 = 0.8, 0.8, 0.0, 1.0;GLfloat mat_shininess = 50.0;GLfloat light_position = 1.0, 1.0, 1.0, 0.0;GLfloat white_light = 1.0, 1.0, 1.0, 1.0;GLfloat yellow_light = 1.0, 1.0, 0.0, 1.0;GLfloat lmodel_ambient = 0.0, 0.7, 0.5, 1.0;glClearC010r(1.0, 1.0, 1.0, 0.0);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT
24、, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_DIFFUSE, yellow_light);/主体的颜色glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);/高光的颜色glLightModelfv(GL_LIGHT_MODEL AMBIENT, lmodel ambient);glEnable
25、(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL DEPTH TEST);void display(void) |glColorMask(1.0, 1.0,1.0,1.0);glClearC010r(0.0,0.0,0.0,1.0);glClearDepth(1.0);glClear(GL_COLOR_BUFFER BIT | GL DEPTH BUFFER BIT); glColor3f(1.0, 1.0, 1.0);/ 画左眼glMatrixMode(GL_PROJECTION);glPushMatrix();float mat16;glGetFl
26、oatv(GL_PROJECTION MATRIX,mat);glLoadIdentity();glMultMatrixf(leftPersMatrix);glMultMatrixf(mat);glMatrixMode(GL_MODELVIEW);glPushMatrix();glGetFloatv(GL_MODELVIEW MATRIX,mat);glLoadIdentity();glMultMatrixf(leftMatrix);glMultMatrixf(mat);glColorMask(1.0, 0.0,0.0,1.0);glRotatef(GLfloat) big, 0.0, 1.0
27、, 0.0);glutSolidTeapot(2.0);glPopMatrix();glMatrixMode(GL PROJECTION);glPopMatrix();glFlush();/画右眼glClearDepth(1.0);glClear(GL_DEPTH_BUFFER_BIT);glMatrixMode(GL_PROJECTION);glPushMatrix();glGetFloatv(GL_PROJECTION_MATRIX,mat);glLoadIdentity();glMultMatrixf(rightPersMatrix);glMultMatrixf(mat);glMatri
28、xMode(GL_MODELVIEW);glPushMatrix();glGetFloatv(GL_MODELVIEW_MATRIX,mat);glLoadIdentity();glMultMatrixf(rightMatrix);glMultMatrixf(mat);glColorMask(0.0, 1.0,101.0);glRotatef(GLfloat) big, 0.0, 1.0, 0.0);glutSolidTeapot(2.0);glPopMatrix();glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush();glutSwapBuf
29、fers(); .void reshape(int w, int h)(glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60, (GLfloat)w/(GLfloat)h, 0.01,20.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0.0, 0.0, R, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );void keyboard(unsigned ch
30、ar key, int x, int y)(switch (key)(case 'b':big = (big + 1) % 360;glutPostRedisplay();break;case 'B':big = (big - 1) % 360;glutPostRedisplay();break;case 27: / 按ESC1时退出程序exit (0);break;default:break;void spinDisplay(void) big = (big + 1) % 360;glutPostRedisplay();int main (int argc,
31、char* argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT RGB | GLUT DEPTH);glutInitWindowSize(500, 500);glutInitWindowPosition(100, 100);glutCreateWindow(argv0);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutIdleFunc(spinDisplay);glutMainLo
32、op();return 0;结果截图:四、SDL应用Simple DirectMedia Layer,简称SDL是一个自由的跨平台的多媒体开发包,主要通过OpenGLffi 2D视频帧缓冲(framebuffer) 提 供对音频、键盘、鼠标、游戏操纵杆(joystick) 和3D硬件的底层访问。它的官方站点是:/SDL本身是针对2D图像编程的,如果使用到3D编程,那么需要 将SDL和OpenGL吉合使用。1、开始新建项目,选择“ SDL Project2、"请选择SDL所在的文件夹:”时如下:例1:自带的例题源程序为:#include <
33、SDL/SDL.h>#define WIDTH 640 / 屏幕宽#define HEIGHT 480 / 屏幕高#define BPP 4 /屏幕像素位#define DEPTH 32 /屏幕像素深度void setpixel(SDL_Surface *screen,int x,int y,Uint8 r,Uint8 g,Uint8 b)/用指定颜色画点Uint32 *pixmem32;Uint32 colour;colour = SDL_MapRGB(screen->format,r,g,b);pixmem32 = (Uint32*)screen->pixels+y+x;
34、*pixmem32= colour;void DrawScreen(SDL_Surface* screen,int h)int x, y, ytimesw;if (SDL_MUSTLOCK(screen) if (SDL_LockSurface(screen)<0) return;for(y=0; y<screen->h; y+) ytimesw = y*screen->pitch/BPP;for(x= 0; x<screen->w; x+)setpixel(screen,x,ytimesw,(x*x)/256+3*y+h,(y*y)/256+x+h,h);
35、if (SDL_MUSTLOCK(screen) SDL_UnlockSurface(screen);SDL_Flip(screen);int main(int argc, char* argv)SDL_Surface *screen;SDL_Event event;int keypress=0;int h=0;if (SDL_Init(SDL_INIT_VIDEO)<0 ) return 1; /SDL 初始化screen=SDL_SetVideoMode(WIDTH,HEIGHT,DEPTH,SDL_FULLSCREEN|SDL_HWS URFACE);if (!(screen) /
36、SDL创建屏幕SDL_Quit();return 1;while(!keypress) DrawScreen(screen,h+); / 绘图while(SDL_PollEvent(&event) /检测事件switch (event.type) / 事件类型case SDL_QUIT:keypress = 1;break;case SDL_KEYDOWN:keypress = 1;break;)SDL_Quit(); /SDL 结束处理 return 0;)运行结果为:例题2:#include <stdlib.h>#if defined(_MSC_VER)#include
37、 "SDL.h"#else#include "SDL/SDL.h"#endifSDL_Surface *screen;void render()/ 独占资源,将surface锁定if (SDL_MUSTLOCK(screen)if (SDL_LockSurface(screen) < 0) return;/获取当前时间,以毫秒计时int tick = SDL_GetTicks();/声明变量int i, j, yofs, ofs;/对窗口进行绘制yofs = 0;for (i = 0; i < 480; i+) for (j = 0, ofs
38、 = yofs; j < 640; j+, ofs+)(unsigned int*)screen->pixels)ofs = i * i + j * j + tick; yofs += screen->pitch / 4;/解除锁定if (SDL_MUSTLOCK(screen) SDL_UnlockSurface(screen);/ 使用SDLM窗口进行更新SDL_UpdateRect(screen, 0, 0, 640, 480);/ Entry pointint main(int argc, char *argv)/初始化SDL子系统,这里只对视频进行初始化if ( S
39、DL_Init(SDL_INIT_VIDEO) < 0 )fprintf(stderr, "Unable to init SDL: %sn", SDL_GetError();exit;)/注册SDL_Quit,当退出时调用,使得退出时程序自动清理 atexit(SDL_Quit);/ 使用32位象素创建640x480的窗口screen = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);/若失败,则退出if ( screen = NULL )fprintf(stderr, "Unable to set 640x48
40、0 video: %sn",SDL_GetError();exit(1);)/主循环while (1)/ Render stuffrender();/ SDL中的事件轮询机制SDL_Event event;while (SDL_PollEvent(&event)/对消息进行处理switch (event.type)/如果按下某键的消息响应case SDL_KEYDOWN: break;/如果某键按下后弹起的消息响应case SDL_KEYUP:/若按下ESC键,则退出if (event.key.keysym.sym = SDLK_ESCAPE)return 0;break;/
41、退出消息响应case SDL_QUIT:return(0);) return 0;)运行结果:五、GSL应用GNIM学计算函数库 GSL(GNU Scientific Library )是一个强 大的C/C+啜值计算函数库,它是一个自由软件,是 GNU®目软件的 一个部分。GSL是一个为C和C+播序员提供的科学数值运算库。该科学计算库异常强大,函数库提供了大量的数值计算程序, 如随机函数、特殊函数和拟合函数等等,整个函数库大约有1000多个函数,几乎涵盖了科学计算的各个方面。GSL下载地址:/software/gsl/1、开始新建项目,选择 “ GN
42、U Scientific application2、 "请选择GSSff在的文件夹:”时如下:GNU Scientific application国家级规划教材软件系列清选择G5L所在的文件夹(如C0de:Bloc幽Sk/gR .这里给出的文件夹是GSL的安装文件夹,它必须包含子目录: " include"和肋二请选择G5L所在的文件夹:_C:DevCodeBlock5sdkgslmGNU科学计算GSL- GNU ScientificLibrary©2007-2014 茎修招|,后退出)下一步陋) 取消例1、自带的例题源程序为:使用LU分解法求解如下线性方程组。求解 x0,18 0.60 0.57 0.96 x0 1.00,41 0.24 0.99 0.58 x1 = 2.00,14 0.30 0.97 0.66 x2 3,00,51 0.13 0.19 0.85 x3 4,0程序代码如下:#include <stdio.h>#include <gsl/gsl_linalg.h>int main (void)(int s;double a_data
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业领域中智能教室解决方案的商业价值与实施
- 政策分析技术在教育领域的应用前景
- 专题06 读后续写校园生活类话题(讲义)原卷版-2025年高考英语二轮复习
- 情感智力驱动学业成功的关键要素
- 技术推动教育变革的正面伦理视角
- 中职教育自我管理课件
- 2025届河北省沧州盐山中学物理高二下期末检测试题含解析
- 中职教师课件
- 未来职业教育的趋势基于情感智商的培养策略分析
- 教育技术法规实施中的难点与对策研究
- 中小学校长招聘考试试题
- 大报告厅EASE声场模拟分析
- (完整版)土的参数换算(计算饱和重度)
- 境外汇款申请书样板
- 抗焦虑药和抗抑郁药教学课件
- 2023年浙江温州技师学院招聘教师(共500题含答案解析)高频考点题库参考模拟练习试卷
- 抚养费纠纷答辩状
- 压铸行业面临的挑战分析
- 河南暴雨参数计算表
- 产品质量证明书
- RB/T 034-2020测量设备校准周期的确定和调整方法指南
评论
0/150
提交评论