VC++6.0基于OpenGL等值线颜色填充图
- 格式:doc
- 大小:117.00 KB
- 文档页数:17
如何在vc++6.0里面使用openGl?你既可以建立Win32项目使用API,也可以建立MFC工程(一般不用MFC框架直接用API)我给你一个例子吧,建立Win32空项目,添加一个cpp文件,编译执行就行了(这是一个经典的opengl框架了)代码如下:#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")#pragma comment(lib,"glaux.lib")#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glaux.h>HDC hDC=NULL;HGLRC hRC=NULL;HWND hWnd=NULL;HINSTANCE hInstance;BOOL keys[256];BOOL active=TRUE;BOOL fullscreen=TRUE;GLfloat rtri;GLfloat rquad;LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);GLvoid ResizeGLScene(GLsizei width,GLsizei height){if(height==0)height=1;glViewport(0,0,width,height);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}int InitGL(GLvoid){glShadeModel(GL_SMOOTH);glClearColor(0.0f,0.0f,0.0f,0.5f);glClearDepth(1.0f);glEnable(GL_DEPTH_TEST);glDepthFunc(GL_LEQUAL);glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); return TRUE;}int DrawGLScene(GLvoid){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,-1.0f); glColor3f(0.0f,1.0f,0.0f); glVertex3f(-1.0f,-1.0f,1.0f); glEnd();glLoadIdentity(); glTranslatef(1.5f,0.0f,-7.0f); glRotatef(rquad,1.0f,1.0f,1.0f); glBegin(GL_QUADS); glColor3f(0.0f,1.0f,0.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(1.0f,1.0f,1.0f);glColor3f(1.0f,0.5f,0.0f); glVertex3f(1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f); glVertex3f(1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,-1.0f,1.0f); glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,1.0f,0.0f);//glVertex3f(1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,-1.0f,-1.0f); //glVertex3f(-1.0f,1.0f,-1.0f); //glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(1.0f,1.0f,-1.0f); glVertex3f(1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f); glVertex3f(-1.0f,1.0f,1.0f); glVertex3f(-1.0f,1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,-1.0f); glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glEnd();rtri+=0.2f;rquad-=0.15f;return TRUE;}GLvoid KillGLWindow(GLvoid){if(fullscreen){ChangeDisplaySettings(NULL,0);ShowCursor(TRUE);}if(hRC){if(!wglMakeCurrent(NULL,NULL))MessageBox(NULL,"释放DC或RC失败","关闭错误",MB_OK|MB_ICONINFORMA TION);if(!wglDeleteContext(hRC))MessageBox(NULL,"释放RC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hRC=NULL;}if(hDC && !ReleaseDC(hWnd,hDC)){MessageBox(NULL,"释放DC失败","关闭错误",MB_OK|MB_ICONINFORMATION); hDC=NULL;}if(hWnd && !DestroyWindow(hWnd)){MessageBox(NULL,"释放窗口句柄失败","关闭错误",MB_OK|MB_ICONINFORMA TION); hWnd=NULL;}if(!UnregisterClass("OpenG",hInstance)){MessageBox(NULL,"不能注销窗口类","关闭错误",MB_OK|MB_ICONINFORMATION); hInstance=NULL;}}BOOL CreateGLWindow(char* title,int width,int height,int bits,BOOL fullscreenflag){GLuint PixelFormat;WNDCLASS wc;DWORD dwExStyle;DWORD dwStyle;RECT WindowRect;WindowRect.left=(long)0;WindowRect.right=(long)width;WindowRect.top=(long)0;WindowRect.bottom=(long)height;fullscreen=fullscreenflag;hInstance=GetModuleHandle(NULL);wc.style=CS_HREDRAW|CS_VREDRAW|CS_OWNDC;wc.lpfnWndProc=(WNDPROC)WndProc;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hInstance=hInstance;wc.hIcon=LoadIcon(NULL,IDI_WINLOGO);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=NULL;wc.lpszMenuName=NULL;wc.lpszClassName="OpenG";if(!RegisterClass(&wc)){MessageBox(NULL,"注册窗口失败","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(fullscreen){DEVMODE dmScreenSettings;memset(&dmScreenSettings,0,sizeof(dmScreenSettings));dmScreenSettings.dmSize=sizeof(dmScreenSettings);dmScreenSettings.dmPelsWidth=width;dmScreenSettings.dmPelsHeight=height;dmScreenSettings.dmBitsPerPel=bits;dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;if(ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCE SSFUL){if(MessageBox(NULL,"全屏模式设置失败!\n使用窗口模式?","OpenGL 3D游戏编程",MB_YESNO|MB_ICONEXCLAMA TION)==IDYES){fullscreen=FALSE;}else{MessageBox(NULL,"程序将被关闭","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}}}if(fullscreen){dwExStyle=WS_EX_APPWINDOW;dwStyle=WS_POPUP;ShowCursor(FALSE);}else{dwExStyle=WS_EX_APPWINDOW|WS_EX_WINDOWEDGE;dwStyle=WS_OVERLAPPEDWINDOW;}AdjustWindowRectEx(&WindowRect,dwStyle,FALSE,dwExStyle);if(!(hWnd=CreateWindowEx(dwExStyle,"OpenG",title,dwStyle|WS_CLIPSIBLINGS|WS_CLIPCHILDREN,0,0,WindowRect.right-WindowRect.left,WindowRect.bottom-WindowRect.top,NULL,NULL,hInstance,NULL))){KillGLWindow();MessageBox(NULL,"窗口创建失败","错误",MB_OK|MB_ICONINFORMATION);return FALSE;}static PIXELFORMA TDESCRIPTOR pfd={sizeof(PIXELFORMA TDESCRIPTOR),1,PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,PFD_TYPE_RGBA,bits,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,PFD_MAIN_PLANE,0,0,0,0};if(!(hDC=GetDC(hWnd))){KillGLWindow();MessageBox(NULL,"不能创建一个窗口设备描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!(PixelFormat=ChoosePixelFormat(hDC,&pfd))){KillGLWindow();MessageBox(NULL,"不能创建一个匹配的像素格式","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!SetPixelFormat(hDC,PixelFormat,&pfd)){KillGLWindow();MessageBox(NULL,"不能设置像素格式","错误",MB_OK|MB_ICONINFORMATION); return FALSE;}if(!(hRC=wglCreateContext(hDC))){KillGLWindow();MessageBox(NULL,"不能创建OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}if(!wglMakeCurrent(hDC,hRC)){KillGLWindow();MessageBox(NULL,"不能激活当前的OpenGL渲染描述表","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}ShowWindow(hWnd,SW_SHOW);SetForegroundWindow(hWnd);SetFocus(hWnd);ResizeGLScene(width,height);if(!InitGL()){KillGLWindow();MessageBox(NULL,"初始化失败","错误",MB_OK|MB_ICONINFORMA TION);return FALSE;}return TRUE;}LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){switch(uMsg){case WM_ACTIV ATE:{if(!HIWORD(wParam))active=TRUE;elseactive=FALSE;return 0;}case WM_SYSCOMMAND:{switch(wParam){case SC_SCREENSA VE:case SC_MONITORPOWER:return 0;}break;}case WM_CLOSE:{PostQuitMessage(0);return 0;}case WM_KEYDOWN:{keys[wParam]=TRUE;return 0;}case WM_KEYUP:{keys[wParam]=FALSE;return 0;}case WM_SIZE:{ResizeGLScene(LOWORD(lParam),HIWORD(lParam));return 0;}}return DefWindowProc(hWnd,uMsg,wParam,lParam);}int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){MSG msg;BOOL done=FALSE;if(MessageBox(NULL,"你想在全屏模式下运行吗?","设置全屏模式",MB_YESNO|MB_ICONQUESTION)==IDNO){fullscreen=FALSE;}if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;while(!done){if(PeekMessage(&msg,NULL,0,0,PM_REMOVE)){if(msg.message==WM_QUIT)done=TRUE;else{TranslateMessage(&msg);DispatchMessage(&msg);}}else{if(active){if(keys[VK_ESCAPE])done=TRUE;else{DrawGLScene();SwapBuffers(hDC);}}if(keys[VK_F1]){keys[VK_F1]=FALSE;KillGLWindow();fullscreen=!fullscreen;if(!CreateGLWindow("Win32 SDK风格OpenGL程序框架",640,480,16,fullscreen)) return 0;}}}KillGLWindow();return msg.wParam;}。
收稿日期:2018-04-15作者简介:杨薇(1983-),女,云南保山人,讲师,研究方向为多媒体及图形图像应用。
openGL 中基于位图填充的图案掩模分析与设计杨薇李燕(保山学院信息学院,云南保山678000)[摘要]openGL 中多边形的填充主要包括色彩填充、纹理插值图案填充和位图图案填充,主要对位图图案的填充方式进行讨论,掩模的设计是位图填充中的关键,重点讨论掩模的构成,并以实例介绍的掩模的设计方法,分析了图案填充的应用效果。
[关键词]位图填充;图案掩模[中图分类号]TP3[文献标识码]Adoi:10.3969/j.issn.1674-9340.2018.02.020[文章编号]1674-9340(2018)02-073-041openGL 的应用前景分析openGL 作为一种开放的3D图形程序接口规范,在智能手机移动终端领域有着卓越的成就。
苹果手机的IOS 平台和Aandroid 平台的3D 标准都是openGL ES ,而移动通讯领域的霸主高通在其移动显示芯片GPUAdreno 也全部内置支持openGL ES [1]。
尽管现在的智能手机运行速度越来越快,可运行的资源也越来越多,处理能力超强,但考虑到减少能耗,程序员们仍然需要在开发过程中尽量优化程序以减少或降低资源开销[1]。
2openGL 中的多边形填充模式分析利用openGL 绘制场景时,基本上就是对组成场景的多边形进行处理。
在计算机图形学中,多边形的填充是最基本的知识点,主要包括镂空、单色填充、插值填充、纹理填充及图案填充。
镂空或者单色填充都比较简单,且效果单一。
在绘制场景时,为了产生真实效果,通常需要给多边形区域加上纹理光照等效果,就会消耗很多的软硬件资源,我们在设计场景时就尽量要降低其能耗,常用方法就是在简单场景设计时用图案填充代替纹理贴图,这就需要我们提前定义好所需图案。
图案掩模的定义是多边形填充的重要知识点,详细分析了掩模的设计、定义及应用。
首先,我们需要在Visual C++ 中创建一个工程。
假如你不知道怎么做的话,我想你应该先学习Visual C++ 而不是OpenGL。
可供下载的代码是用Visual C++ 6.0 写成的。
在某些版本的VC++ 中,需要把bool 改为BOOL,true 改为TRUE,false 改为FALSE。
做了上述修改之后,代码可以在Visual C++ 4.0和5.0 中编译通过。
在Visual C++ 中当你创建了一个新的Win32 程序(并非控制台程序) 之后,你还需要链接OpenGL 的库文件。
操作步骤是:Project-> Settings,点击LINK 标签,在“Object/Library Modules” 下面那一行的开始处(在kernel32.lib之前) 增添OpenGL32.lib,GLu32.lib 和GLaux.lib,完成之后点击OK 按钮。
现在你已经准备好来书写一个OpenGL 视窗程序了。
代码的前4行包含了我们所需库的头文件,如下:#include <windows.h> // Header File For Windows#include <gl\gl.h> // Header File For The OpenGL32 Library#include <gl\glu.h> // Header File For The GLu32 Library#include <gl\glaux.h> // Header File For The GLaux Library然后我们需要初始化所有要用的变量。
因为这个程序仅仅创建一个空的OpenGL 窗口,所以需要初始化的变量并不多。
一些变量的初始化工作是十分重要的,它们将在以后的每个OpenGL 程序中被沿用。
下面第一行代码设置一个Rendering Context (渲染描述表,着色描述表,渲染上下文),每一个OpenGL 程序都会连接一个Rendering Context,Rendering Context 将OpenGL调用连接到Device Context (设备描述表,设备上下文)。
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
基于M FC和OpenGL的快速填充等值线实现孙晓燕1,伍增贵2(1.石油大学计算机与通信工程学院,山东东营257061;2.石油大学石油工程学院,山东东营257061)摘 要:通过等值线的绘制与填充过程分离的编程思想,先用OpenG L硬件加速的光栅化技术实现区域快速填充,然后利用MFC下的G D I绘图功能在相同的区域上绘制等值线。
该方法不涉及到复杂的算法,用很简单的代码就能实现与商业软件视觉效果相媲美的等值线填充效果,且适用于离散区域为任意形状的多边形网格系统。
关键词:等值线填充;OpenG L;可视化;MFC;调色板中图法分类号:TP391141 文献标识码:A 文章编号:100123695(2005)0320169202 Realizati on of Fast Filling Cont ours Based on MFC and OpenG LS UN Xiao2yan1,WU Zeng2gui2(1.College of Co m puter&Co mm unication Engineering,U niversity of Petroleum(East China),D ongying Shandong257061,China;2.College of Petroleum Engineering,U niversity of Petroleum(East China),D ongying Shandong257061,China)Abstract:This paper p resents a p r ogra mm ing idea of dra wing and filling cont ours res pectively.First the zone is filled by ta2 king advantage of rap id raster dis p lay of OpenG L,then on the sa me zone cont ourlines are generated by using G D I functi ons of MFC.W ithout any comp licated algorith m,the p r ogra m is easily realized,but p r ovides excellent visual effects comparable with commercial s oft w are.I n additi on,the method can be app lied t o vari ous grid syste m s.Key words:Cont ours Fill;OpenG L;V isualizati on;M FC;Palette 在工程计算分析中常常涉及到大量的参数场,如温度场、压力场、浓度场、速度场、应力场等数据场的分析和处理。
基于MFC和OpenGL的快速填充等值线实现
孙晓燕;伍增贵
【期刊名称】《计算机应用研究》
【年(卷),期】2005(022)003
【摘要】通过等值线的绘制与填充过程分离的编程思想,先用OpenGL硬件加速的光栅化技术实现区域快速填充,然后利用MFC下的GDI绘图功能在相同的区域上绘制等值线.该方法不涉及到复杂的算法,用很简单的代码就能实现与商业软件视觉效果相媲美的等值线填充效果,且适用于离散区域为任意形状的多边形网格系统.【总页数】3页(P169-170,172)
【作者】孙晓燕;伍增贵
【作者单位】石油大学,计算机与通信工程学院,山东,东营,257061;石油大学,石油工程学院,山东,东营,257061
【正文语种】中文
【中图分类】TP391.41
【相关文献】
1.基于OpenGL的等值线图填充算法 [J], 郑凯东
2.在MapInfo中实现等值线图区域填充的快速算法 [J], 李井冈;姚运生;李贤华;董曼;李胜乐
3.基于MFC和OpenGL的虚拟人体经络穴位模型实现方法 [J], 许玉龙;张佩江;王忠义;盛梦园;赵玉梅;王兵营
4.基于OpenGL的三维等值线绘制实现 [J], 成诗明;杨光
5.基于OpenGL的自适应网格法的等值线绘制与填充实现 [J], 邓枚;周汝良
因版权原因,仅展示原文概要,查看原文内容请购买。
第二章VC6.0简单绘图说明许多学编程的都是从C 语言开始入门的,而目前的现状是:有些学校以Turbo C 为环境讲C 语言,只是Turbo C 的环境实在太老了,复制粘贴都很不方便。
有些学校直接拿VC 来讲C 语言,因为VC 的编辑和调试环境都很优秀,并且VC 有适合教学的免费版本。
可惜在VC 下只能做一些文字性的练习题,想画条直线画个圆都很难,还要注册窗口类、建消息循环等等,初学者会受严重打击的。
初学编程想要绘图就得用TC,很是无奈。
还有计算机图形学,这门课程的重点是绘图算法,而不是Windows 编程。
所以,许多老师不得不用TC 教学,因为Windows 绘图太复杂了,会偏离教学的重点。
新的图形学的书有不少是用的OpenGL,可是门槛依然很高。
要给初学者一个简单的学习平台,就要VC的开发平台和TC的简单的绘图功能,于是就有了这个EasyX 库,我们需要在VC下下载安装EasyX库,下载地址:http:///。
下面是VC下简单绘图函数的基本说明。
1.系统支持操作系统版本:Windows 2000 及以上系统。
编译环境版本:Visual C++ 6.0 / 2008(x86 & x64) / 2010(x86 & x64)。
2.安装请先将下载的压缩包解压缩,然后执行Setup.hta,并跟随提示安装。
安装程序会检测已经安装的VC 版本,并根据选择将对应的.h 和.lib 文件安装至VC 的include 和lib 文件夹内。
安装程序不会修改注册表或者本机的任何文件。
如果需要手动安装,请根据下面的文件列表说明将安装包里的相关文件分别复制到VC 对应的include 和lib 文件夹内,或者将include 和lib 文件夹放到任意位置,然后修改VC 中的Lib 和Include 的引用路径。
3.卸载由于安装程序并不改写注册表,因此在“添加删除程序”中不会看到EasyX 的卸载项。
山西电子技术2011年第1期软件技术收稿日期:2010-12-03作者简介:王正强(1986-),男,青海互助县人,硕士研究生,专业是信号与信息处理。
文章编号:1674-4578(2011)01-0066-01OpenGL 在VC++6.0开发环境下的编程实现王正强(中北大学信息与通信工程学院,山西太原030051)摘 要:近年来,由于三维技术的飞速发展和广泛应用,许多原来采用V is ua l C ++作为基础语言创建应用程序的领域,都有了虚拟现实、科学计算可视化等三维仿真处理的应用要求。
基于此介绍了O pen GL 的工作方式、VC ++下的Open GL 的程序框架、O pen GL 绘制过程以及双缓存技术。
最后给出工程上某个时刻的效果图。
关键词:VC++;O penGL ;三维技术中图分类号:TP311.5 文献标识码:A0 引言O penGL 是一个优秀的专业化的3D AP I 。
它最早是SG I 为图形工作站开发的。
随着Open GL 成为高性能图形与交互式视景处理的工业标准,目前几乎所有的3D 图形显示卡都已经支持OpenGL 。
O pen GL 的应用范围已经从游戏开发、三维设计等逐步扩展到3D 图形、图形处理、广告、动画、虚拟实现、科学计算可视化、仿真等多种领域多个层面。
可以说OpenGL 在三维领域的霸主地位是毋庸置疑的。
1 OpenGL 工作方式O penGL 指令模型是C /S(C li ent/Server ,客户、服务器)模型,通常用户程序(客户)发出命令提交给内核程序(服务器),内核程序再对各种指令进行解释,并初步处理,之后交给操作系统服务而转交给硬件[1]。
上述过程可以在同一台计算机上完成,也可以在网络环境中,由不同的计算机合作完成,OpenGL 通过上述合作实现网络透明。
简单的工作流程如图1所示。
图1 Op enGL 工作流程O penGL 库函数被封装在动态链接库O peng l 32.dll 中,应用程序发出O pen GL 命令后,O pen GL 函数调用被动态链接库Openg l 32.dll 处理。
用OpenGL绘制物化探数据等值线叶娜;许惠平;赵彧;覃如府【期刊名称】《世界地质》【年(卷),期】2004(023)001【摘要】在Visual C++6.0环境下调用OpenGL库用网格法绘制标准物化探数据等值线,以图示形式给出数据集的二维和三维方式的等值线图,并给出相应的数字高程模型图,方便用户分析和理解数值分布情况.用线性内差法计算所有网格边上的等值点,横边上的等值点到前一个最近网格点的距离存放在二维数组X中,纵边上的等值点到下一个最近网格点的距离存放在二维数组Y中.调用自编的搜索函数在网格边上搜索等值线的线头,用追踪函数对这个线头所在线上的点进行追踪,并把追踪到的等值点的坐标按顺序存放在二维数组DW中,用OpenGL中绘制Bezier曲线的方法分段连接DW数组中的等值点,并按颜色从红到蓝递变的顺序在屏幕上绘制等值线.【总页数】6页(P79-84)【作者】叶娜;许惠平;赵彧;覃如府【作者单位】吉林大学,地球探测与信息技术学院,吉林,长春,130026;同济大学,教育部海洋地质重点实验室,上海,200092;中国国家信息安全测评认证中心,东北测评中心,吉林,长春,130061;吉林大学,地球探测与信息技术学院,吉林,长春,130026【正文语种】中文【中图分类】P631.84;TP391【相关文献】1.用Surfer软件绘制等值线图中地质数据的处理方法 [J], 陈练武;牛菲2.基于LiDAR点云数据的等值线绘制方法 [J], 何睦;李梦珍3.多种物化探数据等值线投影分层图程序 [J], 杨生;朱添宝4.基于OpenGL的三维等值线绘制实现 [J], 成诗明;杨光5.基于OpenGL的自适应网格法的等值线绘制与填充实现 [J], 邓枚;周汝良因版权原因,仅展示原文概要,查看原文内容请购买。
OpenGL入门学习——写给想用计算机画图的朋友OpenGL作为当前主流的图形API之一,它在一些场合具有比DirectX更优越的特性。
1、与C语言紧密结合。
OpenGL命令最初就是用C语言函数来进行描述的,对于学习过C语言的人来讲,OpenGL是容易理解和学习的。
如果你曾经接触过TC的graphics.h,你会发现,使用OpenGL作图甚至比TC更加简单。
2、强大的可移植性。
微软的Direct3D虽然也是十分优秀的图形API,但它只用于Windows系统。
而OpenGL不仅用于Windows,还可以用于Unix/Linux等其它系统,它甚至在大型计算机、各种专业计算机(如:医疗用显示设备)上都有应用。
并且,OpenGL 的基本命令都做到了硬件无关,甚至是平台无关。
3、高性能的图形渲染。
OpenGL是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对OpenGL提供强力支持,激烈的竞争中使得OpenGL性能一直领先。
OpenGL官方网站(英文)下面将对Windows下的OpenGL编程进行简单介绍。
学习OpenGL前的准备工作第一步,选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builder,Dev-C++等,它们都是支持OpenGL的。
这里我们选择VC++6.0作为学习OpenGL的环境。
第二步,安装GLUT工具包GLUT下载地址:(大小约为150k)/resources/libraries/glut/glut_downloads.php /glutdlls37beta.zipWindows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件(glut.h glut.lib glut32.lib glut.dll glut32.dll)2、把解压得到的glut.h复制到VC的“include\gl”文件夹下。
3、把解压得到的glut.lib和glut32.lib复制到静态函数库所在文件夹“VC\lib”文件夹。
使用Windows标准控件我们在前面曾提到过,控件是一些行为标准化了的窗口,一般用于对话框或其它窗口中充当与用户交互的元素。
在Visual C++中,可以使用的控件分成三类:(1) Windows标准控件Windows标准控件由Windows操作系统提供,在Windows 95中还提供了一些新增的控件。
所有这些控件对象都是可编程的,我们可以使用Visual C++提供的对话框编辑器把它们添加到对话框中。
Microsoft基础类库(MFC)提供了封装这些控件的类,它们列于表6.1。
表6.1 Windows标准控件控件 MFC类 描述动画 CAnimateCtrl 显示连续的AVI视频剪辑按钮 CButton 用来产生某种行为的按钮,以及复选框、单选钮和组框组合框 CComboBox 编辑框和列表框的组合编辑框 CEdit 用于键入文本标题头 CHeaderCtrl 位于某一行文本之上的按钮,可用来控制显示文件的宽度热键 CHotKeyCtrl 用于通过按下某一组合键来很快的执行某些常用的操作图象列表 CImageList 一系列图象(典型情况下是一系列图标或位图)的集合。
图象列表本身不是一种控件,它常常是和其它控件一起工作,为其它控件提供所用的图象列表列表 CListCtrl 显示文本及其图标列表的窗口列表框 CListBox 包括一系列字符串的列表进度 CProgressCtrl 用于在一较长操作中提示用户所完成的进度多格式文本编辑 CRichEditCtrl 提供可设置字符和段落格式的文本编辑的窗口滚动条 CScrollBar 为对话框提供控件形式的滚动条滑块 CSliderCtrl 包括一个有可选标记的滑块的窗口旋转按钮 CSpinButtonCtrl 提供一对可用于增减某个值的箭头静态文本 CStatic 常用于为其它控件提供标签状态条 CStatusBarCtrl 用于显示状态信息的窗口,同MFC类CStatusBar类似续表6.1 控件 MFC类 描述选项卡 CTabCtrl 在选项卡对话框或属性页中提供具有类似笔记本中使用的分隔标签的外观的选项卡工具条 CToolBarCtrl 具有一系列命令生成按钮的窗口,同MFC类CToolBar类似工具提示 CToolTipCtrl 一个小的弹出式窗口,用于提供对工具条按钮或其它控件功能的简单描述树 CTreeCtrl 用于显示一系列的项的继承结构前面提到过,在MFC中,类CWnd是所有窗口类的基类,很自然的,它也是所有控件类的基类。
效果展示1.新建一个MyEdit类,该类继承自CEdit类,并添加相关变量和函数;在MyEdit类的头文件(.h)中定义如下变量和函数:private:COLORREF m_BackgroundColor;//背景颜色COLORREF m_TextColor;//文本颜色CBrush m_brushBk;//笔刷public:void SetBackgroundColor(COLORREF color);//设置背景颜色void SetTextColor(COLORREF color);//设置文本颜色COLORREF GetBackgroundColor() const;//获取背景颜色COLORREF GetTextColor() const;//获取文本颜色在MyEdit类的源文件(.cpp)中给变量赋初值,并书写函数体如下:MyEdit::MyEdit()//构造函数{m_BackgroundColor=RGB(0,0,0);m_TextColor=RGB(250,250,250);}MyEdit::~MyEdit()//析构函数{m_brushBk.DeleteObject();//释放笔刷}void MyEdit::SetBackgroundColor(COLORREF color)//设置背景颜色{m_BackgroundColor=color;}void MyEdit::SetTextColor(COLORREF color)//设置文本颜色{m_TextColor=color;}COLORREF MyEdit::GetBackgroundColor() const//获取背景颜色{return m_BackgroundColor;}COLORREF MyEdit::GetTextColor() const//获取文本颜色{return m_TextColor;}打开类向导,给MyEdit类添加=WM_CTLCOLOR消息反射在MyEdit类的源文件中的CtlColor()中添加如下代码:HBRUSH MyEdit::CtlColor(CDC* pDC, UINT nCtlColor){// TODO: Change any attributes of the DC herem_brushBk.DeleteObject();m_brushBk.CreateSolidBrush(m_BackgroundColor);pDC->SetBkColor(m_BackgroundColor);pDC->SetTextColor(m_TextColor);// TODO: Return a non-NULL brush if the parent's handler should not be calledreturn (HBRUSH)m_brushBk.GetSafeHandle();}2.新建一个ColorMatch类,该类继承于CDialog类,设置对话框页面布局,添加变量和函数;设置对话框所需要的控件,并进行布局打开类向导为控件绑定变量在ColorMatch类的头文件中加入如下代码:public:CFont m_Font;//字体对象void SetColor();//设置颜色函数打开类向导为ColorMatch类添加如下消息映射在ColorMatch类的源文件中加入如下代码:BOOL CColorMatch::OnInitDialog()// 初始化函数{CDialog::OnInitDialog();// TODO: Add extra initialization herem_slider_red.SetRange(0,255,false);//设置滑动控件的范围m_slider_green.SetRange(0,255,false);//设置滑动控件的范围m_slider_blue.SetRange(0,255,false);//设置滑动控件的范围m_Font.CreateFont(50,0,0,0,0,FALSE,FALSE,0,ANSI_CHARSET,OUT_D EFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FF_SWISS,LPCTSTR("A rial"));m_EE.SetFont(&m_Font);//设置显示的字体大小m_red.SetBackgroundColor(RGB(255,0,0));m_green.SetBackgroundColor(RGB(0,255,0));m_blue.SetBackgroundColor(RGB(0,0,255));return TRUE; // return TRUE unless you set the focus to a control// EXCEPTION: OCX Property Pages should return FALSE }void CColorMatch::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) /*滑动条被滑动时触发*/{// TODO: Add your message handler code here and/or call defaultSetColor();CDialog::OnHScroll(nSBCode, nPos, pScrollBar);}void CColorMatch::SetColor()//设置颜色函数{int red=m_slider_red.GetPos();//获取红色值int green=m_slider_green.GetPos();//获取绿色值int blue=m_slider_blue.GetPos();//获取黄色值COLORREF color=RGB(red,green,blue);//合成RGB值m_EE.SetBackgroundColor(color);//设置背景颜色m_EE.SetTextColor(16777215-color);//设置字体颜色CString colorstr,redstr,greenstr,bluestr;colorstr.Format("%d",color);//颜色字符串化SetDlgItemText(IDC_EDIT,colorstr);redstr.Format("%d",red);greenstr.Format("%d",green);bluestr.Format("%d",blue);SetDlgItemText(IDC_EDIT_RED,redstr);//修改各种颜色的数值SetDlgItemText(IDC_EDIT_GREEN,greenstr);SetDlgItemText(IDC_EDIT_BLUE,bluestr);}3.编译、链接生成可执行文件进行测试。
VC6.0中OpenGL开发环境配置(整opengl必看)第一步:选择一个编译环境现在Windows系统的主流编译环境有Visual Studio,Broland C++ Builde r,Dev-C++等,它们都是支持OpenGL的。
但这里我们选择VC++ 6.0作为学习OpenGL的环境。
第二步:安装GLUT工具包GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装。
Windows环境下的GLUT下载地址:(大小约为150k)/resources/libraries/glut/glutdlls37beta.zip无法从以上地址下载的话请使用下面的连接:/upfile/200607311626279.zip Windows环境下安装GLUT的步骤:1、将下载的压缩包解开,将得到5个文件2、以我的安装目录为例:(1)“d:\Program Files\Microsoft Visual Studio\VC98\include\GL文件夹”。
把解压得到的glut.h放到这个GL文件夹里。
没有GL文件夹可以自己建一个,一般都有的。
(2)“d:\Program Files\Microsoft Visual Studio\VC98\lib文件夹”)。
把解压得到的glut.lib和glut32.lib放到静态函数库所在文件夹,即lib文件夹。
(3)把解压得到的glut.dll和glut32.dll放到操作系统目录下面的system32文件夹内。
(典型的位置为:C:\Windows\System32)这是非常重要的动态链接库设置!第三步,创建工程,其步骤如下:(1)创建一个Win32 Console Application。
(以我创建的为例,工程名为s impleGL)(2)链接OpenGL libraries:在Visual C++中先单击Project,再单击Settin gs,再找到Link单击,最后在Object/library modules 的最前面加上openg l32.lib Glut32.lib Glaux.lib glu32.lib 。
计算机图形学课程设计--基于四叉树算法绘制颜色填充等值线图姓名:***学号:************学院:信息科学与技术学院指导老师:黄地龙老师一、问题提出与需求分析1、问题及目标问题:基于四叉树算法绘制颜色填充等值线图。
目标:利用四叉树思想用所给文件中的数据绘制等值线图,并绘出坐标系及颜色标识码。
通过本次实验提高学生编程能力,加深对OpenGL的理解,加深对VC++6.0的认识。
2、问题概念及算法原理等值线是一组值相等的序列连线组成的图形。
等值线图在实际中应用广泛,如等高线图、等气压图等等。
等值线的表达形式有两类:一类是画线等值线图;另一类是颜色填充等值线图。
依据数据分部不同,等值线图的绘制有两类方法:三角网法和矩形网格法。
三角网法是针对数据分布不规则的环境下的一种绘制方法。
矩形网格法是一种针对数据分布规则的等直线图绘制方法。
它是设平面区域按一定大小的网格距划分的矩形网格。
由于所给数据时矩形网格数据,所以本程序采用矩形网格法,并采用颜色填充。
改程序采用基于四叉树的颜色填充等值线图绘制方法。
四叉树的基本算法思想是:当网格四个节点的颜色值相等时,则用该颜色值填充该矩形,否则将矩形网格等分四个小网格,并用插值方法计算每个小网格的颜色值,递归使用网格四个节点的颜色值是否相等,由此依次建立一棵四叉树。
当细分至四个节点的颜色值全部都小于或等于一个像素时,则将其视为等值线上的点,用来画等值线。
在该程序中,对于等值线处理比较粗糙,采用的是描点的方式,当四个节点的颜色值全部都小于或等于一个像素时,对其进行描点处理,这样处理的结果导致等值线不够光滑,且颜色级数不能过大,否则效果比较难看。
一般来说颜色级数为11最佳,主要是本人能力有限。
二、绘图程序设计的技术思路1、程序总体设计利用四叉树思想绘制等颜色填充等值线图,首先应从数据文件中读取数据,用二级指针**a来存放,并求出最大值max及最小值min,接收键盘输入的颜色级数Ncolor,并求出等值颜色域的间距Dc,Dc=(max-min)/Ncolor。
为了填充颜色得先建立颜色填充表,可以采用颜色类的方式,本程序中采用三个浮点型数组r、g、b来建立颜色填充表,由函数void Color(int m)来构造。
准备工作做好了开始构建四叉树,采用递归思想循环调用四叉树算法填充矩形网格的颜色值,当x增量和y增量都小于1个像素点时则可认为该点为等值区域的边界点,即等值线上的点,作为描绘等值线的点。
填充完毕后建立平面坐标系并绘制色码标识。
根据以上所述,程序设计步骤可分为以下几步:(1)读入网格数据值,并求全区网格的最大值max和最小值min。
(2)给定等值线的级数Ncolor,求得等值线的间距Dc=(max-min)/Ncolor。
(3)建立填充颜色表r[],g[],b[]。
(4)循环递归调用四叉树算法填充网格矩形颜色值。
(5)等值线检测(6)绘制平面坐标系(7)绘制色码标识2、详细设计及各函数主要算法原理(1)void TreeMath(float x,float y,float dx,float dy,int z1,int z2,intz3,int z4);递归调用四叉树算法填充网格矩形颜色值由下列式子分别计算z1、z1、z3、z4、的颜色索引值Ic1、Ic2、Ic3、Ic4,Ic1=int((z1-min)/Dc),Ic2=int((z2-min)/Dc),Ic3=int((z3-min)/Dc),Ic4=int((z4-min)/Dc)(Dc为等值颜色域的间距,min为数据最小值)。
当它们颜色索引值相等时则说明它们位于一个等值区域(该区域是以点(x,y)和(x+dx,y+dy)为对角顶点的矩形),调用函数glColor3f(r[Ic1],g[Ic1],b[Ic1])对该区域设置对应的颜色。
若dx,dy都小于1,则说明(x,y)位于等值域的边界上。
否则循环递归调用该函数直到满足上面两个条件之一。
(2)void gltRasterText(float x, float y, const char *text, void *font)采用光栅思想在(x,y)处输出text的值,输出字体为font,用于描绘坐标系,输出X轴和Y 轴的坐标。
(3)void DrawCoordinate(float x,float y)绘制坐标系,(x,y)为图片开始的坐标,即图片坐标系的原点,由于对OpenGL不是很熟悉,所以在本程序中采用的是画网格的方法绘制图片的坐标系。
在边缘部分都延长出去5个像素点,从原点开始每隔20个单位分别在X轴方向和Y轴方向画一条直线,X轴方向画column(数据文件中数据的列数)条,Y轴方向画row(数据文件中数据的行数)条,再调用gltRasterText(float x, float y, const char *text, void *font)在相应的地方输出坐标轴的坐标值。
网格画好了再将图贴上去则把中间的网格覆盖,只留坐标轴。
由于是先画网格后画图,所以部分坐标轴会被覆盖,所以外围四条线单独在绘图完成后再画。
(4)void DrawCodeIdentifier(float x,float y);色码标识绘制函数,从点(x,y)开始沿X、Y的正向绘制色码标识,色码标识由Ncolor(颜色级数)个小矩形构成,其颜色是由红色到绿色连续变化的,代表值的从小到大并调用函数gltRasterText(float x, float y, const char *text, void *font)在相应地方标出其所代表的值的大小,最小值min(数据最小值),按步长Dc(等值颜色域的间距)从红色到绿色依次递增。
(5)void display(void);窗口的显示回调函数。
调用以上函数绘制完整的等值线图,循环调用TreeMath(float x,float y,float dx,float dy,int z1,int z2,int z3,int z4)函数对整个数据网格进行填充,绘制完整的颜色填充等值线图。
三、主要程序设计的说明1、变量说明下列变量因为要多个函数共用,为了方便,所以将其声明为全局变量。
int max,min; max用来记录网格数据中的最大值,min用来记录网格数据中的最小值。
int Ncolor;用来设置颜色的级数,动态设置,接收键盘的输入。
int Dc;用来记录等值颜色域的间距,Dc=(max-min)/Ncolor。
float *r,*g,*b;用于构建颜色填充表,其大小由颜色级数Ncolor来进行动态分配。
分别代表RGB三种颜色的颜色值。
int row,column; row用于记录网格数据的行数,column用于记录网格数据的列数。
int **a;用于存放网格数据值。
其大小由行数row和列数column动态分配。
2、函数说明这里只对各函数做功能上的说明,具体实现的源程序请见附录后的源代码。
(1)void ReadData();无参函数,用于从数据文件“网格数据.txt”中读取数据到a[row][column]里面,计算最大值max和最小值min及数据的行数row 和列数column,并将文件中的数据和最大、最小值输出到屏幕。
(2)void Initial(void);初始化窗口,设置窗口背景颜色为白色,指定设置投影参数。
指定使用正投影将一个x坐标在0.0~400.0,y坐标在0.0~350.0的矩形坐标区域投影到窗口内。
(3)void gltLine2d(float x0, float y0, float x1, float y1);用于绘制直线,直线的端点坐标分别为(x0,y0),(x1,y1),参数x0,y0,x1,y1用于从外界接收直线的端点坐标。
(4)void Color(int m);建立填充颜色表,为颜色数组r、g、b赋值,是颜色呈连续变化。
形参m用于设置颜色级数,接收其它函数中的值传递。
(5)void TreeMath(float x,float y,float dx,float dy,int z1,int z2,int z3,int z4);用于建立四叉树,并填充一个网格的颜色,形参x、y分别为x、y轴的坐标,形参dx、dy分别x、y轴方向的增量,参数z1、z2、z3、z4分别为网格四个顶点的高度值,即文件中数据传入的接口。
(6)void gltRasterText(float x, float y, const char *text, void *font)采用光栅化思想定位输出text中的值,输出字体由font指定,参数x、y为定位坐标。
(7)void DrawCoordinate(float x,float y)绘制以(x,y)为原点的平面坐标系。
(8)void DrawCodeIdentifier(float x,float y),在图片的右边绘制以(x,y)为起点的沿X、Y的正向绘制色码标识,其颜色是连续变化的。
(9)void display(void),窗口显示回调函数,在窗口中绘制完整的颜色填充等值线图,即最终呈现的结果。
(10)int main(int argc,char*argv[]),程序运行的主函数。
其中接收键盘输入的Ncolor设置颜色级数,利用公式max=(int(max/10)+1)*10和min=(int(min/10))*10对最大、最小值进行处理,并求出等值颜色域的间距Dc,Dc=(int)((max-min)/Ncolor)。
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB)初始化窗口的显示模式,glutInitWindowSize(800,500)设置窗口的尺寸,glutInitWindowPosition(100,120)设置窗口的位置,glutCreateWindow("等值线绘制")创建一个名为等值线绘制的窗口,glutDisplayFunc(display)设置当前窗口的显示回调函数,Initial()完成窗口初始化,glutMainLoop()启动主GLUT事件处理循环。
四、完成的成果与体会1、实验结果2、实验总结通过几周的努力,在老师的帮助下终于把这次实验完成了,通过这次实验对上学期计算机图形学里面的一些不太懂的问题也算是终于弄得比较清楚了,并且对VC++6.0的认识又进了一步,现在对于程序的错误和异常终于不再感到那么迷茫了,对于以前一直感到模糊的四叉树算法和递归算法也终于弄清楚了。
对于OpenGL里的一些函数也有了一定的理解,对于光栅原理也有了进一步的认识。
对于一些算法也产生了一些兴趣。