# Graph2D--A lightweight graph library for C++ programming **Repository Path**: shaojunhu/Graph2DLibrary ## Basic Information - **Project Name**: Graph2D--A lightweight graph library for C++ programming - **Description**: Graph2D图形库主要用于在C++中快速绘制并显示基本图形、文字、图像和动画。当前,与C++结合实现图形绘制与显示的途径有很多,如MFC、Qt、wxWidgets、Windows API、OpenGL、DirectX等,但上述专业开发工具包或图形库不适合初学C++语言者。因此,我们开发了这款入门级别的简易图形库: (1)图形模块简洁,程序入口为main函数而非WinMain函数,避免使用专用图形库,避免用户花费太多精力在理解图形库或Windows宏、函数的使用上。底层图形库如OpenGL或 DirectX提供了丰富的二维和三维图形显示功能,但这些图形库的使用需预先了解相关计算机图形学知识,而Windows API中存在大量的宏、数据类型与函数,入口为WinMain函数,也不适合C++初学者。 (2)支持当前高分辨率、真彩色显示模式,提供键盘、鼠标交互和双缓存功能,便于图形和动画的交互与显示。Borland C++中曾提供一个名为graphics的图形库,该图形库使用简捷,但仅支持640×480的VGA显示模式且显示颜色数有限,也不能直接提供图像、键盘、鼠标交互和双缓存功能,因此目前这一图形显示方式已被抛弃。 Graph2D是一个过渡型图形库,通过该图形库,用户可熟悉图形绘制的基本流程,便于进一步过渡到专业软件开发包(Qt或MFC)或图形库(OpenGL,DirectX)的学习。 - **Primary Language**: C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 0 - **Created**: 2022-05-05 - **Last Updated**: 2023-04-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Graph2D--A lightweight graph library for C++ programming #### 介绍 Graph2D图形库主要用于在C++中快速绘制并显示基本图形、文字、图像和动画。当前,与C++结合实现图形绘制与显示的途径有很多,如MFC、Qt、wxWidgets、Windows API、OpenGL、DirectX等,但上述专业开发工具包或图形库不适合初学C++语言者。因此,我们开发了这款入门级别的简易图形库(如图1所示),该图形库具有以下特点: 1. 图形模块简洁,程序入口为main函数而非WinMain函数,避免使用专用图形库,避免用户花费太多精力在理解图形库或Windows宏、函数的使用上。底层图形库如OpenGL或 DirectX提供了丰富的二维和三维图形显示功能,但这些图形库的使用需预先了解相关计算机图形学知识,而Windows API中存在大量的宏、数据类型与函数,入口为WinMain函数,也不适合C++初学者。 2. 支持当前高分辨率、真彩色显示模式,提供键盘、鼠标交互和双缓存功能,便于图形和动画的交互与显示。Borland C++中曾提供一个名为graphics的图形库,该图形库使用简捷,但仅支持640×480的VGA显示模式且显示颜色数有限,也不能直接提供图像、键盘、鼠标交互和双缓存功能,因此目前这一图形显示方式已被抛弃。 3. Graph2D是一个过渡型图形库,通过该图形库,用户可熟悉图形绘制的基本流程,便于进一步过渡到专业软件开发包(Qt或MFC)或图形库(OpenGL,DirectX)的学习。
图1 采用Graph2D绘制的基本图元
#### 软件架构 1. Graph2D参考Borland C++中graphics库,通过名字空间(namespace)封装OpenGL中的图形初始化、基本图元绘制、键盘和鼠标交互等函数,为用户提供一个简易的开发界面与接口,图元绘制函数的命名多沿袭传统graphics库的命名。Graph2D包含图形初始化、窗口设置、基本图元绘制、字体创建与文本显示、图像读入与显示、键盘鼠标交互等功能模块。 2. Graph2D中图形程序的运行机制可用流程图2表示,为了对各种消息进行监听,更新图形窗口,display等回调函数均处于一个循环体内,除非收到退出窗口消息才停止调用回调函数。同时,为保证图形更新的流畅性,在display函数中使用了封装后的OpenGL交换双缓存的函数。 3. 坐标系统采用二维笛卡尔右手坐标系,其中X轴指向右方,Y轴指向上方,其中原点在窗口左下位置。函数命名采用骆驼式命名法,即当函数名由一个或多个单词连在一起时,第一个单词以小写字母开始,后面的单词首字母均为大写,如显示坐标系的showCoordinate函数。
图2 Graph2D运行机制
#### 安装教程 Graph2D库包含graph2d.h, libgraph2d.a和graph2d.dll三个文件。在Code::Blocks集成开发环境中配置Graph2D图形库前需下载已编译过的mingw版的freeglut包,(www.transmissionzero.co.uk/software/freeglut-devel/),下载后将freeglut中的*.h文件拷贝到.\mingw\include\GL目录下,将graph2d.h拷贝到.\mingw\include目录,libfreeglut.a和libgraph2d.a拷贝至.\mingw\lib目录,最后将freeglut.dll和graph2d.dll拷贝到.\mingw\bin目录。为简化配置过程,我们提供了一个安装程序可实现上述文件的自动拷贝。 #### 使用说明 1. 完成安装后,运行Code::Blocks,选择C++控制台程序框架,根据向导生成一个典型的C++程序“Hello world!”,修改代码如下: ```cpp #include using namespace graph; void display() { circle(512, 384, 100); putText(480, 384, "Hello world!"); } int main(int argc, char *argv[]) { initGraph(display); return 0; } ``` 2. 如果直接运行程序将提示链接错误,在Code::Blocks中,还需显式指定图形程序链接库文件,在菜单Settings->Compiler and debugger->Link settings中添加libgdi32、libopengl32、libglu32、libfreeglut和libgraph2d。上述代码运行结果如图3所示,结构与控制台程序框架类似,Graph2D也使用了名字空间和main()函数,但最终能实现图形用户界面的显示,该界面中输出“Hello world!”文本和一个圆,按Esc键可退出界面,按F1可显示帮助信息,按F2可显示坐标系,按‘q’键可在窗口和全屏间切换。代码中仅包含10条语句,结构清晰,与控制台程序中先包含iostream,再使用名字空间std,最后用cout输出“Hello world!”流程类似,适合初学者使用。
图3 Graph2D中绘制的“Hello world!”
3. 上述示例代码中的initGraph函数参数中包含了一个名为display的函数指针,即回调函数。回调函数不由用户直接调用,而是在特定事件或条件发生时(如键盘被按下、鼠标单击等),由操作系统调用并给该函数发送一个消息,用于对该事件或条件进行响应。除了display函数外,还可以继续在initGraph中添加键盘、鼠标交互等回调函数。Graph2D图形库中display等回调函数始终处于一个循环体内,除非收到退出窗口消息才停止调用。同时,为保证图形更新的流畅性,在display函数中使用了封装后的OpenGL交换双缓存的函数。 #### 参与贡献 Shaojun Hu: hsj@nwsuaf.edu.cn Nan Geng: nangeng@nwsuaf.edu.cn Cheng Cai: chengcai@nwsuaf.edu.cn Lei Wei: weilei@nwsuaf.edu.cn Yaojun Geng: gengyaojun@nwsuaf.edu.cn