• OpenGL(十七) 绘制折线图、柱状图、饼图



    一、绘制折线图

    glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j])函数可以绘制GLUT位图字符,第一个参数是GLUT中指定的特定字形集,第二个参数是要写入的单个字符;


    #include <glut.h> 
    
    GLsizei windowWidth=600,windowHeight=600;
    GLubyte label[36]={'O','n','e',  'T','w','o', 'T','h','r',  'F','o','u',
    	'F','i','v',  'S','i','x',  'S','e','v',  'E','i','g',
    	'N','i','e',  'T','e','n',  'E','l','e',  'T','w','e',};
    GLint dataValue[12]={452,368,214,543,328,193,322,436,257,268,473,467};
    
    void Init()
    {
    	glClearColor(1,1,1,1);
    	glMatrixMode(GL_PROJECTION);
    	gluOrtho2D(0,windowWidth,0,windowHeight);
    }
    
    void LineImage()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glColor3f(0,0,1);
    	glLineWidth(2);
    	//绘制折线图
    	glBegin(GL_LINE_STRIP);
    	{
    		for(int i=0;i<12;i++)
    		{
    			glVertex2i(20+i*50,dataValue[i]);
    		}
    	}
    	glEnd();
    
    	//绘制标记点
    	glColor3f(1,0,0);
    	for(int i=0;i<12;i++)
    	{
    		glRasterPos2i(15+i*50,dataValue[i]-5);
    		glutBitmapCharacter(GLUT_BITMAP_8_BY_13,'*');
    	}
    
    	glColor3f(0,0,0);
    	//绘制序列
    	for(int i=0;i<12;i++)
    	{
    		glRasterPos2i(15+i*50,150);
    		for(int j=i*3;j<i*3+3;j++)
    		{
    			glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j]);
    		}
    	}
    	glFlush();
    }
    
    void ReshapFunction(GLint x,GLint y)
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    }
    
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(windowWidth, windowHeight);    
    	glutCreateWindow("OpenGL");
    	Init();
    	glutDisplayFunc(&LineImage);   //回调函数 
    	glutReshapeFunc(ReshapFunction);
    	glutMainLoop();    //持续显示,当窗口改变会重新绘制图形
    	return 0;    
    }  


    折线图:



    二、柱状图

    使用函数glRecti (GLint x1, GLint y1, GLint x2, GLint y2)可以方便的绘制一个填充的矩形区域,第一二个参数是矩形区域的左下角起点,第二三个参数是右上角顶点。

    #include <glut.h> 
    
    GLsizei windowWidth=600,windowHeight=600;
    GLubyte label[36]={'O','n','e',  'T','w','o', 'T','h','r',  'F','o','u',
    	'F','i','v',  'S','i','x',  'S','e','v',  'E','i','g',
    	'N','i','e',  'T','e','n',  'E','l','e',  'T','w','e',};
    GLint dataValue[12]={452,368,214,543,328,193,322,436,257,268,473,467};
    
    void Init()
    {
    	glClearColor(1,1,1,1);
    	glMatrixMode(GL_PROJECTION);
    	gluOrtho2D(0,windowWidth,0,windowHeight);
    }
    
    void LineImage()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glColor3f(0,0,1);
    
    	for(int i=0;i<12;i++)
    	{
    		glRecti(20+i*50,170,30+i*50,dataValue[i]);
    	}
    
    	glColor3f(0,0,0);
    	//绘制序列
    	for(int i=0;i<12;i++)
    	{
    		glRasterPos2i(15+i*50,150);
    		for(int j=i*3;j<i*3+3;j++)
    		{
    			glutBitmapCharacter(GLUT_BITMAP_8_BY_13,label[j]);
    		}
    	}
    	glFlush();
    }
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(windowWidth, windowHeight);    
    	glutCreateWindow("OpenGL");
    	Init();
    	glutDisplayFunc(&LineImage);   //回调函数 	
    	glutMainLoop();    
    	return 0;    
    }  

    柱状图:




    三、饼图


    #include <glut.h> 
    #include <stdlib.h>
    #include <math.h>
    
    GLsizei windowWidth=600,windowHeight=600;
    GLint dataValue[12]={452,368,214,543,328,193,322,436,257,268,473,467};
    
    void Init()
    {
    	glClearColor(1,1,1,1);
    	glMatrixMode(GL_PROJECTION);
    	gluOrtho2D(0,windowWidth,0,windowHeight);
    }
    
    void CircleImage()
    {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glColor3f(0,0,1);	
    	glPointSize(2);
    	glBegin(GL_POINTS);
    	{
    		for(float i=0.0f;i<2*3.1415926f;i+=0.001)
    		{
    			glVertex2f((windowWidth/3)*cos(i)+windowWidth/2,(windowHeight/3)*sin(i)+windowHeight/2);
    		}
    	}
    	glEnd();	
    	GLint totalNum=0;
    	for(int i=0;i<12;i++)
    	{
    		totalNum+=dataValue[i];
    	}
    
    	GLfloat angleData[12];
    	for(int i=0;i<12;i++)
    	{
    		angleData[i]=2*3.1415926f*(GLfloat)dataValue[i]/totalNum;
    
    	}
    	for(int j=1;j<12;j++)
    	{
    		angleData[j]+=angleData[j-1];
    	}
    
    	glColor3f(1,0,0);
    	glLineWidth(2);
    
    	glBegin(GL_LINES);
    	{
    		for(int i=0;i<12;i++)
    		{
    			glVertex2f(windowWidth/2,windowHeight/2);
    			glVertex2f((windowWidth/3)*cos(angleData[i])+windowWidth/2,(windowHeight/3)*sin(angleData[i])+windowHeight/2);			
    		}
    		glEnd();
    		glFlush();
    	}
    }
    
    int main(int argc, char *argv[])    
    {    
    	glutInit(&argc, argv);   //初始化GLUT
    	glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);  
    	glutInitWindowPosition(500, 200);    
    	glutInitWindowSize(windowWidth, windowHeight);    
    	glutCreateWindow("OpenGL");
    	Init();
    	glutDisplayFunc(&CircleImage);   //回调函数 	
    	glutMainLoop();    
    	return 0;    
    }  

    饼图:




  • 相关阅读:
    .net core 3.1 使用Redis缓存
    JavaSE 高级 第11节 缓冲输入输出字节流
    JavaSE 高级 第10节 字节数组输出流ByteArrayOutputStream
    JavaSE 高级 第09节 字节数组输入流ByteArrayInputStream
    JavaSE 高级 第08节 文件输出流FileOutputStream
    JavaSE 高级 第07节 文件输入流FileInputStream
    JavaSE 高级 第06节 初识I、O流
    JavaSE 高级 第05节 日期类与格式化
    JavaSE 高级 第04节 StringBuffer类
    JavaSE 高级 第03节 Math类与猜数字游戏
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411910.html
Copyright © 2020-2023  润新知