OpenGL——折线图柱状图饼图绘制

折线图绘制代码:

1#include<iostream> 2 3//旧版本 固定管线 4#include<Windows.h> 5#include <GL/glut.h> 6//新版本 可编程管线 7/*#define GLEW_STATIC 8#include <GL/glew.h> 9#include<GLFW\glfw3.h> 10*/ 11 12using namespace std; 13 14GLsizei winWidth = 610, winHeight = 500; 15GLint xRaster = 25, yRaster = 150; 16 17GLubyte label[36] = { 'J','a','n', 'F','e','b', 'M','a','r', 'A','p','r', 18 'M','a','y', 'J','u','n', 'J','u','l', 'A','u','g', 19 'S','e','p', 'O','c','t', 'N','o','v', 'D','e','c' }; 20 21GLint dataValue[12] = { 420,342,324,310,262,185,190,196,217,240,312,438 }; 22 23void init() 24{ 25 //窗口背景为白色 26 glClearColor(1, 1, 1, 1); 27 glMatrixMode(GL_PROJECTION); 28 gluOrtho2D(0.0, 610.0, 0.0, 500.0); 29} 30 31void lineGraph() 32{ 33 GLint month, k; 34 GLint x = 30; 35 36 glClear(GL_COLOR_BUFFER_BIT); 37 //蓝色 38 glColor3f(0.0, 0.0, 1.0); 39 glBegin(GL_LINE_STRIP); //画出折线段 40 for (k = 0; k < 12; k++) { 41 glVertex2i(x + k * 50, dataValue[k]); 42 } 43 glEnd(); 44 45 //红色 46 glColor3f(1.0, 0.0, 0.0); //标注各点 47 for (k = 0; k < 12; k++) { 48 glRasterPos2i(xRaster + k * 50, dataValue[k] - 4); 49 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, '*'); 50 } 51 52 //黑色 53 glColor3f(0.0, 0.0, 0.0); //横坐标说明 54 xRaster = 20; 55 for (month = 0; month < 12; month++) { 56 glRasterPos2i(xRaster, yRaster); 57 for (k = 3 * month;k < 3 * month + 3;k++) { 58 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]); 59 xRaster += 17; 60 } 61 } 62 glFlush(); 63} 64 65void winReshapeFcn(GLint newWidth, GLint newHeight) 66{ 67 glMatrixMode(GL_PROJECTION); 68 glLoadIdentity(); 69 gluOrtho2D(0, GLdouble(newWidth), 0, GLdouble(newHeight)); 70 glClear(GL_COLOR_BUFFER_BIT); 71} 72 73int main(int argc, char* argv[]) 74{ 75 76 //对GLUT进行初始化,并处理所有的命令行参数 77 glutInit(&argc, argv); 78 //指定使用RGBA模式还是颜色索引模式,还可指定使用单缓冲还是双缓冲窗口 79 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 80 //指定了窗口左上角在屏幕上的位置 81 glutInitWindowPosition(100, 100); 82 //制定了窗口大小(以像素为单位) 83 glutInitWindowSize(winWidth, winHeight); 84 //创建支持opengl渲染的窗口,在调用glutMainLoop函数前,窗口没有显示 85 glutCreateWindow("折线图"); 86 init(); 87 //显示回调函数 88 //每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()注册的那个回调函数就会被执行 89 glutDisplayFunc(lineGraph); 90 glutReshapeFunc(winReshapeFcn); 91 //启动程序,所有窗口这时显示 92 glutMainLoop(); 93 94 system("pause"); 95 return 0; 96 97 98}

运行结果:

柱状图代码:

1void barChart() 2{ 3 GLint month, k; 4 5 glClear(GL_COLOR_BUFFER_BIT); 6 7 //红色 8 glColor3f(1.0, 0.0, 0.0); 9 for (k = 0; k < 12; k++) { 10 glRecti(20 + k * 50, 165, 40 + k * 50, dataValue[k]); 11 } 12 13 //黑色 14 glColor3f(0.0, 0.0, 0.0); //横坐标说明 15 xRaster = 20; 16 for (month = 0; month < 12; month++) { 17 glRasterPos2i(xRaster, yRaster); 18 for (k = 3 * month;k < 3 * month + 3;k++) { 19 glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]); 20 xRaster += 17; 21 } 22 } 23 glFlush(); 24}

运行结果:

饼图代码:

1#include<iostream> 2#include <math.h> 3//旧版本 固定管线 4#include<Windows.h> 5#include <GL/glut.h> 6//新版本 可编程管线 7/*#define GLEW_STATIC 8#include <GL/glew.h> 9#include<GLFW\glfw3.h> 10*/ 11 12using namespace std; 13 14const GLdouble twoPi = 6.283185; 15 16class scrPt { 17public: 18 scrPt() { 19 x = y = 0; 20 } 21 GLint x, y; 22 void setCoords(GLint xCoordValue, GLint yCorrdValue) { 23 x = xCoordValue; 24 y = yCorrdValue; 25 } 26 GLint getx() const { 27 return x; 28 } 29 GLint gety() const { 30 return y; 31 } 32 void incrementx() { 33 x++; 34 } 35 void incrementy() { 36 y--; 37 } 38 39}; 40 41GLsizei winWidth = 400, winHeight = 300; 42 43 44void init() 45{ 46 //窗口背景为白色 47 glClearColor(1, 1, 1, 1); 48 glMatrixMode(GL_PROJECTION); 49 gluOrtho2D(0.0, 200.0, 0.0, 150.0); 50} 51 52void setPixel(GLint xCoord, GLint yCoord) 53{ 54 glBegin(GL_POINTS); 55 glVertex2i(xCoord, yCoord); 56 glEnd(); 57} 58 59 60void circlePlotPoints(GLint xc, GLint yc, scrPt circPt) 61{ 62 setPixel(xc + circPt.getx(), yc + circPt.gety()); 63 setPixel(xc - circPt.getx(), yc + circPt.gety()); 64 setPixel(xc + circPt.getx(), yc - circPt.gety()); 65 setPixel(xc - circPt.getx(), yc - circPt.gety()); 66 setPixel(xc + circPt.gety(), yc + circPt.getx()); 67 setPixel(xc - circPt.gety(), yc + circPt.getx()); 68 setPixel(xc + circPt.gety(), yc - circPt.getx()); 69 setPixel(xc - circPt.gety(), yc - circPt.getx()); 70} 71 72//中心画圆算法 73void circleMidpoint(GLint xc, GLint yc, GLint radius) 74{ 75 scrPt circPt; 76 GLint p = 1 - radius;//中点参数初值 77 circPt.setCoords(0, radius); 78 circlePlotPoints(xc, yc, circPt); 79 while (circPt.getx() < circPt.gety()) { 80 circPt.incrementx(); 81 if (p < 0) 82 p += 2 * circPt.getx() + 1; 83 else { 84 circPt.incrementy(); 85 p += 2 * (circPt.getx() - circPt.gety()) + 1; 86 } 87 circlePlotPoints(xc, yc, circPt); 88 } 89} 90 91 92 93void pieChart() 94{ 95 scrPt circCtr, piePt; 96 GLint radius = winWidth / 4; 97 GLdouble sliceAngle, previousSliceAngle = 0.0; 98 99 GLint k, nSlices = 12; 100 101 GLfloat dataValues[12] = { 10.0,7.0,13.0,5.0,13.0,14.0, 102 3.0,16.0,5.0,3.0,17.0,8.0 }; 103 GLfloat dataSum = 0.0; 104 105 circCtr.x = winWidth / 2; 106 circCtr.y = winHeight / 2; 107 circleMidpoint(circCtr.x,circCtr.y, radius); 108 109 for (k = 0;k < nSlices;k++) { 110 dataSum += dataValues[k]; 111 } 112 113 for (k = 0; k < 12; k++) { 114 sliceAngle = twoPi * dataValues[k] / dataSum + previousSliceAngle; 115 piePt.x = circCtr.x + radius * cos(sliceAngle); 116 piePt.y = circCtr.y + radius * sin(sliceAngle); 117 glBegin(GL_LINES); 118 glVertex2i(circCtr.x, circCtr.y); 119 glVertex2i(piePt.x, piePt.y); 120 glEnd(); 121 previousSliceAngle = sliceAngle; 122 } 123 124} 125 126void displayFcn() 127{ 128 glClear(GL_COLOR_BUFFER_BIT); 129 glColor3f(0.0, 0.0, 1.0); 130 pieChart(); 131 glFlush(); 132} 133 134void winReshapeFcn(GLint newWidth, GLint newHeight) 135{ 136 glMatrixMode(GL_PROJECTION); 137 glLoadIdentity(); 138 gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight)); 139 glClear(GL_COLOR_BUFFER_BIT); 140 141 winWidth = newWidth; 142 winHeight = newHeight; 143} 144 145int main(int argc, char* argv[]) 146{ 147 148 //对GLUT进行初始化,并处理所有的命令行参数 149 glutInit(&argc, argv); 150 //指定使用RGBA模式还是颜色索引模式,还可指定使用单缓冲还是双缓冲窗口 151 glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); 152 //指定了窗口左上角在屏幕上的位置 153 glutInitWindowPosition(100, 100); 154 //制定了窗口大小(以像素为单位) 155 glutInitWindowSize(winWidth, winHeight); 156 //创建支持opengl渲染的窗口,在调用glutMainLoop函数前,窗口没有显示 157 glutCreateWindow("Pie"); 158 init(); 159 //显示回调函数 160 //每当GLUT确定一个窗口的内容需要重新显示时,通过glutDisplayFunc()注册的那个回调函数就会被执行 161 glutDisplayFunc(displayFcn); 162 glutReshapeFunc(winReshapeFcn); 163 //启动程序,所有窗口这时显示 164 glutMainLoop(); 165 166 system("pause"); 167 return 0; 168 169 170}

运行结果:

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )