




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、高级编程技术一、高级编程简介:本学期C语言的大量NOJ编程训练,都只是为了打基础,能解决一些简单的小问题,离真正的应用程序开发相差甚远,为此,还需学习高级编程技术。不同的行业需要开发不同的应用程序,高级编程技术具有很强的专业性,在C语言的发展进程中,无数科学家和程序员开发出了数量众多、性能卓越的专业函数库,充分利用好这些函数库是编写应用程序的关键。高级编程涉及内容广泛,包括界面编程、图形编程、多媒体编程、网络编程和数据库编程等方面。无论哪方面的编程,只要把开发环境配置好,就可以使用那些专业函数库。二、开发环境的配置C语言开发工具一般会自动配置好标准函数库的使用环境,使用标准函数库的C程序可以直
2、接编译和连接。但如果是使用其他的专业函数库,就需要配置开发环境。通常,一个提供给程序员使用的专业函数库有4部分内容:l 头文件(*.h):函数原型、宏常量定义等。l 库文件(*.lib):函数的二进制代码。l 动态链接库(*.dll):专业函数库的程序运行时用。l 使用手册文档所谓开发环境配置就是把这些文件放在适当的位置让编译器和连接器可以找到,或者设置编译器和连接器的搜索路径以便编译和连接时能找到它们。通常,将专业函数库的头文件*.h添加到开发工具的系统include路径,将库文件*.lib添加到开发工具的系统lib路径,将动态链接库*.dll复制到windows系统文件夹windowssy
3、stem32。下面通过图形编程的例子来说明如何进行高级编程。三、OpenGL图形编程举例 图形编程通常应用于计算机图形学中,用来绘图、动画显示、虚拟现实等。常用的图形函数库有:OpenGL、SDL、OpenCV等。开放图形库OpenGL(open graphics library)是一个功能很强大的专业图形接口,是开源自由软件,其特性:与C语言紧密结合,强大的可移植性,高性能的图形渲染。适用于三维建模、三维动画和影视软件等领域。OpenGL官方网站(英文):OpenGL中的gl库是核心库,glu是实用库,glut是实用工具库,gl是核心,glu是对gl的
4、部分封装,glut是OpenGL的跨平台工具库,gl中包含了最基本的3D函数。glut是基本的窗口界面,是独立于gl和glu的,如果不喜欢用glut可以用MFC和Win32窗口等代替,但是glut是跨平台的,这就保证了编出的程序是跨平台的,如果用MFC或者Win32只能在windows操作系统上使用。选择OpenGL的一个很大原因就是因为它的跨平台性,所以我们尽量使用glut库。Glut下载地址:/resources/libraries/glut/glutdlls37beta.zip对glutdlls37beta文件解压得到5个文件:glut.dll,
5、glut.h ,glut.lib, glut32.dll, glut32.lib。Glut开发环境配置:将glut.h复制到.codeblocksmingwincludegl文件夹中。将glut32.lib复制到.codeblocksmingwlib文件夹中。将glut32.dll复制到c:windowssystem32文件夹中。打开codeblocks,在设置编译器链接器设置为:搜索路径设置为: Glut作为OpenGL编程实用工具库,它能编写带窗口的OpenGL应用程序。Glut是以OpenGL为基础的,由于在Glut的头文件glut.h已经包含OpenGL的头文件gl.h和glu.h,因
6、此应用程序中只需要Glut的头文件。#include <glglut.h>开发环境配置好以后,就可以开始建立项目,绘制OpenGL图形。在我们的Codeblocks 13.12课堂教学版本中,已经将常用的专业函数库软件包下载好,并且已经将开发环境配置好,无需大家再下载并配置include包含和lib库连接。开发步骤如下:1、开始新建项目,选择“FreeGLUT project”。2、“请选择FreeGLUT所在的文件夹:”时如下:3、项目建立后,开始编写代码:利用Glut编写OpenGL图形程序时,可以编写带窗口的应用程序。(1)窗口管理为了完成初始化和创建窗口的任务,需要调用5个
7、Glut函数。1)glutInit函数:该函数用于初始化GLUT库,必须在调用所有其他GLUT函数之前调用该函数。2)glutInitDisplayMode函数:用来设定GLUT窗口的显示模式。3)glutInitWindowPosition函数:指定窗口左上角在屏幕上的位置。4)glutInitWindowSize函数:指定窗口大小。5)glutCreatWindow函数:创建一个窗口,在调用主循环函数glutMainLoop()前,窗口不会被显示出来。(2)显示回调函数所谓回调函数是指被Windows系统调用的用户自定义的函数。glutDisplayFunc是GLUT最重要的事件回调函数,
8、每当GLUT认为需要重新显示窗口内容时,都将调用由glutDisplayFunc注册的显示回调函数。因此,应用程序将OpenGL绘制场境的处理都放到显示回调函数中。(3)处理事件输入当指定事件发生时(比如某按键按下时,鼠标移动时),相应的回调函数可以注册到如下 glut函数:1) glutReshapeFunc函数用来注册窗口大小改变时调用的回调函数。2) glutKeyboardFunc函数用来注册当按下一个键(ASCII生成键)时调用的按键处理函数。3) glutSpecialFunc函数用来注册当按下一个非ASCII生成键时调用的按键处理函数。4) glutMouseFunc函数用来注册
9、当鼠标按下或释放时调用的按键处理函数。5) glutMotionFunc函数用来注册当鼠标移动时调用的按键处理函数。6) glutTimerFunc函数用来注册一个定时器回调函数。7) glutIdleFunc函数用来注册一个在事件循环空闲时执行的回调函数。(4)事件循环最后需要调用glutMainLoop函数,开启GLUT主事件处理循环,此时,之前创建好的窗口及窗口内容被显示出来,程序开始处理键盘、鼠标、定时器、空闲操作等事件,直到程序终止函数才返回。(5)绘制三维物体的函数GLUT提供了许多三维物体的绘制函数,举例如下:void glutWireSphere(GLdouble radius
10、, GLint slices, GLint stacks); 线框球void glutSolidSphere(GLdouble radius, GLint slices, GLint stacks); 实心球void glutWireCube(GLdouble size); 线框立方体void glutSolidCube(GLdouble size); 实心立方体void glutWireTorus(GLdouble innerRadius, GLdouble outerRadius, GLint nsides, GLint rings); 线
11、框圆环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面体void glutWireTetrahe
12、dron(void); 线框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 radiu
13、s, 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
14、_ATEXIT_HACK#include <windows.h>#include <stdio.h>#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;glView
15、port(0,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)/显示OpenGL场景static float angl
16、e=0.0; /旋转角度glClearColor(1.0,1.0,1.0,1.0); /设置清除缓冲区的颜色为白色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/清除缓冲区glPushMatrix(); /将当前矩阵压入堆栈glRotatef(angle,0.0,1.0,0.0); /旋转矩阵glColor3f(red,green,blue); /设置绘图颜色glutWireTeapot(1.5); /绘制线框茶壶glPopMatrix(); /将当前矩阵弹出堆栈glutSwapBuffers(); /交换缓冲区angle+; /旋转角度自增
17、void 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_F3
18、: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); /创建一个大小为500x240的窗口glutCreateWindow("Teapot 3D"); /创建一
19、个窗口glutDisplayFunc(RenderScene); /注册显示响应函数glutIdleFunc(RenderScene); /注册空闲响应函数,产生动画glutReshapeFunc(ChangeSize); /注册窗口大小变化响应函数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,0.0, 0.0, 1.0, 0.
21、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, 0.0, 0.0,0.0, 1.0
22、, 0.0, 0.0,0.0, 0.0, 1.0, 0.0,0.0, 0.0, 0.0, 1.0;void init(void) const 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 = 0.8, 0
23、.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; glClearColor(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); glE
25、nable(GL_LIGHTING); glEnable(GL_LIGHT0); glEnable(GL_DEPTH_TEST);void display(void) glColorMask(1.0, 1.0,1.0,1.0); glClearColor(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
26、mat16; glGetFloatv(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); glRotat
27、ef(GLfloat) big, 0.0, 1.0, 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(right
28、PersMatrix); glMultMatrixf(mat); glMatrixMode(GL_MODELVIEW); glPushMatrix(); glGetFloatv(GL_MODELVIEW_MATRIX,mat); glLoadIdentity(); glMultMatrixf(rightMatrix); glMultMatrixf(mat); glColorMask(0.0, 1.0,1.0,1.0); glRotatef(GLfloat) big, 0.0, 1.0, 0.0); glutSolidTeapot(2.0); glPopMatrix(); glMatrixMod
29、e(GL_PROJECTION); glPopMatrix(); glFlush(); glutSwapBuffers();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,
30、 R, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );void keyboard(unsigned char 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: / 按ESC键时退出程序 exit (0); break; default: break; void spinDis
31、play(void) big = (big + 1) % 360; glutPostRedisplay();int main (int argc, char* argv) glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); glutInitWindowSize(500, 500); glutInitWindowPosition(100, 100); glutCreateWindow(argv0); init(); glutDisplayFunc(display); glutRe
32、shapeFunc(reshape); glutKeyboardFunc(keyboard); glutIdleFunc(spinDisplay); glutMainLoop(); return 0;结果截图:四、SDL应用Simple DirectMedia Layer, 简称SDL,是一个自由的跨平台的多媒体开发包,主要通过OpenGL和2D视频帧缓冲(framebuffer)提供对音频、键盘、鼠标、游戏操纵杆(joystick)和3D硬件的底层访问。 它的官方站点是:/ SDL本身是针对2D图像编程的,如果使用到3D编程,那么需要将SDL和Open
33、GL结合使用。1、开始新建项目,选择“SDL Project”。2、“请选择SDL所在的文件夹:”时如下:例1:自带的例题源程序为:#include <SDL/SDL.h>#define WIDTH640 /屏幕宽#define HEIGHT480 /屏幕高#define BPP4/屏幕像素位#define DEPTH32/屏幕像素深度void setpixel(SDL_Surface *screen,int x,int y,Uint8 r,Uint8 g,Uint8 b)/用指定颜色画点Uint32 *pixmem32;Uint32 colour;colour = SDL_Map
34、RGB(screen->format,r,g,b);pixmem32 = (Uint32*)screen->pixels+y+x;*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<scree
35、n->w; x+)setpixel(screen,x,ytimesw,(x*x)/256+3*y+h,(y*y)/256+x+h,h);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_SetVideo
36、Mode(WIDTH,HEIGHT,DEPTH,SDL_FULLSCREEN|SDL_HWSURFACE);if (!(screen) /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;运
37、行结果为:例题2:#include <stdlib.h>#if defined(_MSC_VER)#include "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,
38、 ofs;/ 对窗口进行绘制yofs = 0;for (i = 0; i < 480; i+)for (j = 0, ofs = 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); / 使用SDL对窗口进行更新 SDL_UpdateRect(screen, 0, 0, 640, 480); / E
39、ntry point int main(int argc, char *argv) / 初始化SDL子系统,这里只对视频进行初始化 if ( SDL_Init(SDL_INIT_VIDEO) < 0 )fprintf(stderr, "Unable to init SDL: %sn", SDL_GetError(); exit(1); / 注册SDL_Quit,当退出时调用,使得退出时程序自动清理 atexit(SDL_Quit); / 使用32位象素创建640x480的窗口 screen = SDL_SetVideoMode(640, 480, 32, SDL_SW
40、SURFACE); / 若失败,则退出 if ( screen = NULL )fprintf(stderr, "Unable to set 640x480 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; /如果某键按下
41、后弹起的消息响应 case SDL_KEYUP: /若按下ESC键,则退出 if (event.key.keysym.sym = SDLK_ESCAPE)return 0;break;/退出消息响应case SDL_QUIT:return(0);return 0;运行结果:五、 GSL应用GNU科学计算函数库GSL(GNU Scientific Library)是一个强大的C/C+数值计算函数库,它是一个自由软件,是GNU项目软件的一个部分。 GSL是一个为C和C+程序员提供的科学数值运算库。该科学计算库异常强大,函数库提供了大量的数值计算程序,如随机函数、特殊函数和拟合函数等等,整个函数库大约有1000多个函数,几乎涵盖了科学计算的各个方面。 GSL下载地址:/software/gsl/ 1、 开始新建项目,选择“GNU Scientific application”。2、 “请选择GSL所在的文件夹:”时如下:例1、自带的例题源程序为: 使
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 三年级科技创新教育工作计划
- 单位下水维修合同范例
- 单位整修合同样本
- 医疗服务收费合同范例
- 单位装卸合同样本
- 会务包价合同样本
- 买卖纸质合同标准文本
- 内河物流运输合同范例
- 代开劳务合同样本
- 北京物业服务合同样本
- 直播佣金直播合同带货
- 初中英语译林版单词表全册词汇表打印背诵版(全6册)
- 冲击成孔灌注桩施工工艺和常见问题的处理方法
- 监控设备安装技术交底
- 杭州历史文化漫游知到章节答案智慧树2023年浙江大学
- 2023年湖南省中学生生物学奥林匹克竞赛选拔赛试题及答案
- 馒头品牌营销训练营3期第2阶段课件v3messagehouse
- GB/T 9756-2018合成树脂乳液内墙涂料
- 洛可可艺术课件
- 译林英语必修3Unit3reading(共19张)课件
- TRIZ试题库详细版
评论
0/150
提交评论