1. 程式人生 > >OpenGL從1.0開始--繪製常用統計圖

OpenGL從1.0開始--繪製常用統計圖

通過前面幾節的學習,我們已經有能力實現一些高階的圖形繪製功能。這一節我們給大家示例折線圖、直方圖和餅狀圖的繪製程式。
我們先看看要實現的效果。
這裡寫圖片描述
下面我們預設大家已經掌握了前面的知識,並會把講解的重點放在高階功能上。

#include <gl/glut.h>

GLsizei winWidth = 600, winHeight = 500;

GLubyte label[36] = { 'J', 'a', 'n', 'F', 'e', 'b', 'M', 'a', 'r',
'A', 'p', 'r', 'M', 'a', 'y', 'J', 'u', 'n',
'J', 'u', 'l'
, 'A', 'u', 'g', 'S', 'e', 'p', 'O', 'c', 't', 'N', 'o', 'v', 'D', 'e', 'c' };//月份標籤陣列 GLint dataValue[12] = { 420, 342, 324, 310, 262, 185, 190, 196, 217, 240, 312, 438 };//折線圖數值項,對應12個月 void init(void) { glClearColor(1.0, 1.0, 1.0, 1.0); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0, 600.0, 0.0, 500.0); } void
linegraph(void) { GLint xRaster = 25, yRaster = 150;//初始游標位置 GLint month, k; GLint x = 30; glClear(GL_COLOR_BUFFER_BIT); glColor3f(0.0, 0.0, 1.0); glBegin(GL_LINE_STRIP); for (k = 0; k < 12; k++) glVertex2i(x + k * 50, dataValue[k]);//繪製折線 glEnd(); glColor3f(1.0, 0.0, 0.0
); for (k = 0; k < 12;k++) { glRasterPos2i(xRaster + k * 50, dataValue[k] - 4);游標跟蹤折線節點 glutBitmapCharacter(GLUT_BITMAP_9_BY_15, '*');//折線節點上繪製的‘*’ } glColor3f(0.0, 0.0, 0.0); xRaster = 20;//重置游標位置 for (month = 0; month < 12;month++) { glRasterPos2i(xRaster, yRaster); for (k = 3 * month; k < 3 * month + 3;k++) { glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]);//標註月份 } xRaster += 50; } glFlush(); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight)); glClear(GL_COLOR_BUFFER_BIT); } void main(int argc, char**argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); glutInitWindowPosition(100, 100); glutInitWindowSize(winWidth, winHeight); glutCreateWindow("Line Chart Data Plot"); init(); glutDisplayFunc(linegraph); glutReshapeFunc(winReshapeFcn); glutMainLoop(); }

大家可以看到,看似複雜的折線圖,我們通過將其元素分解為折線,‘*’節點,月份標註分別進行繪製,整個過程非常簡單。在這裡給大家提出一個小問題,如果將游標位置變數設定為全域性變數,程式結果會出現什麼變化呢?

直方圖的程式碼也是同樣非常簡單,下面給大家提供一個示例。
這裡寫圖片描述

void barChart(void)
{
    GLint xRaster = 20, yRaster = 150;
    GLint month, k;
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0.0, 0.0);
    for (k = 0; k < 12; k++)        
    {
        glRecti(20 + k * 50, 165, 40 + k * 50, dataValue[k]);//直方圖條狀圖
    }
    glColor3f(0.0, 0.0, 0.0);
    for (month = 0; month < 12;month++)
    {
        glRasterPos2i(xRaster, yRaster);
        for (k = 3 * month; k < 3 * month + 3;k++)
        {
            glutBitmapCharacter(GLUT_BITMAP_HELVETICA_12, label[k]);//標註

        }
        xRaster += 50;
    }
    glFlush();
}

最後再給大家畫一個簡單的餅狀圖,大家可以試試自己去添加註釋等資訊。
這裡寫圖片描述


#include <gl/glut.h>
#include <stdlib.h>
#include <math.h>
const GLdouble twoPi = 6.283185;
class scrPt{
public:
    GLint x, y;
};
GLsizei winWidth = 400, winHeight = 300;
void init(void)
{
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0.0, 200.0, 0.0, 150.0);
}
void circleMidpoint(scrPt mid, GLint r)//畫圓函式
{
    int i = 0;
    glBegin(GL_LINE_LOOP);//通過細分曲線趨近圓形
    int n = 120;
    for (i = 0; i < n; i++)
    {
        glVertex2f(r*cos(twoPi / n*i) + mid.x, r*sin(twoPi / n*i) + mid.y);//圓上的連續點
    }
    glEnd();
}
void pieChart(void)
{
    scrPt circCtr, piePt;
    GLint radius = winWidth / 4;
    GLdouble sliceAngle, previousSliceAngle = 0.0;
    GLint k, nSlice = 12;
    GLfloat dataValue[12] = { 10.0, 7.0, 13.0, 5.0, 13.0, 14.0, 3.0, 16.0, 5.0, 3.0, 17.0, 8.0 };//單月份數
    GLfloat dataSum = 0.0;
    circCtr.x = winWidth / 2;//圓心
    circCtr.y = winHeight / 2;
    circleMidpoint(circCtr, radius);//根據圓心和半徑畫圓
    for (k = 0; k < nSlice;k++)
    {
        dataSum += dataValue[k];//計算總份數
    }
    for (k = 0; k < nSlice;k++)
    {
        sliceAngle = twoPi*dataValue[k] / dataSum + previousSliceAngle;//扇形邊界線的角度
        piePt.x = circCtr.x + radius*cos(sliceAngle);//扇形邊界線端點的座標
        piePt.y = circCtr.y + radius*sin(sliceAngle);
        glBegin(GL_LINES);
        glVertex2i(circCtr.x, circCtr.y);
        glVertex2i(piePt.x, piePt.y);//繪製扇形邊界線
        glEnd();
        previousSliceAngle = sliceAngle;//更新扇形邊界線角度
    }
}
void displayFcn(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(0.0, 0.0, 1.0);
    pieChart();
    glFlush();
}
void winReshapeFcn(GLint newWidth, GLint newHeight)
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, GLdouble(newWidth), 0.0, GLdouble(newHeight));
    glClear(GL_COLOR_BUFFER_BIT);
    winWidth = newWidth;
    winHeight = newHeight;
}
void main(int argc, char**argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(winWidth, winHeight);
    glutCreateWindow("Line Chart Data Plot");
    init();
    glutDisplayFunc(displayFcn);
    glutReshapeFunc(winReshapeFcn);
    glutMainLoop();
}

相關推薦

OpenGL1.0開始--繪製常用統計

通過前面幾節的學習,我們已經有能力實現一些高階的圖形繪製功能。這一節我們給大家示例折線圖、直方圖和餅狀圖的繪製程式。 我們先看看要實現的效果。 下面我們預設大家已經掌握了前面的知識,並會把講解的重點放在高階功能上。 #include <gl/gl

OpenGL1.0開始--第一個OpenGL程式

OpenGL的最早版本OpenGL 1.0由Mark Segal和Kurt Akeley釋出於1992年1月,時至今日早已是蒼海滄田。筆者將一小步一小步帶領大家去領略計算機圖形學神奇的世界。 OpenGL的“Hello World”是一個線段繪製小程式。下面直接

阿里巴巴中國總裁葉朋 B2B1 0向2 0的升級 閱讀整理

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

tensorflow1.0版本切換到1.3

1.先解除安裝之前的版本   sudo pip3 uninstall tensorflow-gpu 2.安裝新的tf     sudo pip3 install tensorflow-gpu==1.3 3.tensorflow1.3需要

TensorFlow版本更新(1.0升到1.8),查詢版本

先設定pip下載優先選擇清華映象,這樣下載快很多 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 安裝命令: 對於 GPU 版本: (也可以用pip3)

塊鏈發展史:1.0到3.0,我們還要等待多久?

區塊鏈技術帶來的無處不在的價值交換,會形成一個多裝置的無縫對接的價值互聯世界,這也是我們對區塊鏈3.0時代的憧憬。 區塊鏈的出現,源於中本聰創造了比特幣而隨之誕生,由於其自身的去中心化、不可篡改、公開透明、分散式儲存等特性,在近10年的發展歷程中,區塊鏈技術已經逐漸得到了世界各地的認可,並被很多

阿里架構師漫談:淘寶技術架構1.0到4.0的架構變遷!附架構資料

MySQL優化概述MySQL資料庫常見的兩個瓶頸是:CPU和I/O的瓶頸。 CPU在飽和的時候一般發生在資料裝入記憶體或從磁碟上讀取資料時候。 磁碟I/O瓶頸發生在裝入資料遠大於記憶體容量的時候,如果應用分佈在網路上,那麼查詢量相當大的時候那麼平瓶頸就會出現在網路上

TensorFlow版本更新(1.0升到1.8)

先設定pip下載優先選擇清華映象,這樣下載快很多 pip install pip -U pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple 安裝命令: 對於 GPU 版本: (

C語言用陣列1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問實現約瑟夫環問題

1. 簡單約瑟夫環問題: N個人,編號從1~N圍成一圈,輸入一個數T,從1號開始報數,報到T的人出圈;下一人又從1開始報數,下一個報到T的人出圈,輸出出圈順序。 考慮問題: 報到T的人出圈,怎麼表示出圈?要麼刪除對應的標號,其他的標號前移(如果是陣列結構,要依次移動

讀懂微信:1.0到7.0版本,一個主流IM社交工具的進化史

本文由作者沈星佑原創發表於公眾號“知曉程式”,由即時通訊網整理並轉載至此,感謝原作者的文字。 1、引言 12 月 30 日,微信 7.0 for Android 正式版上線,繼 9 天前已經推送的 iOS 版本,微信在 2018 年底終於告別 4 年前的 6.0 版本,開始了新的進化。

1.0到3.0,淺談區塊鏈3.0時代下的應用

java|區塊鏈開發與交流群: 613121183有興趣的也可以加下哈,提供了不少區塊鏈資料,以後有資料可以相會共享區塊鏈,像一個數據庫賬本,記載所有的交易記錄。這項技術也因其安全、便捷的特性逐漸得到了銀行與金融業的關注。區塊鏈的進化方式是從1.0到2.0再到3.0:區塊鏈1

Android1.0到 6.0各版本的差別

Android 系統從2008年到現在(2016年4月),八年時間裡版本從1.0一直升到6.0,由於Android系統更新速度快,導致市面上的Android裝置執行的Android系統版本不一(專業術語叫碎片化嚴重)2016年的最新Android版本分佈圖(截止到2016年

Android OpenGL ES 2.0繪圖:繪製紋理

http://mobile.51cto.com/aengine-437172.htm publicclass MyGLSurfaceView extends GLSurfaceView { public MyGLSurfaceView(Context context

android1.0到4.0各版本的差別

Android 1.0 第一版商用作業系統 Android 1.1 更新了部分API,新增一些功能,修正了一些錯誤,同時增加com.google.android.maps包 Android 1.5智慧虛擬鍵盤 使用widgets實現桌面個性化 線

android平臺下OpenGL ES 3.0實現2D紋理貼顯示bitmap

OpenGL ES 3.0學習實踐 android平臺下OpenGL ES 3.0從零開始 android平臺下OpenGL ES 3.0繪製純色背景 android平臺下OpenGL ES 3.0繪製圓點、直線和三角形 android平臺下OpenGL E

Html5餅繪製統計

Html5提供了強大的繪圖API,讓我們能夠使用javascript輕鬆繪製各種圖形。本文將主要講解使用HTML5繪製餅圖(統計圖)的方法。先看一下餅圖效果: 這個圖是動態生成的,根據傳入的比例引數(陣列),來動態繪製餅圖。餅圖的大小也是根據<canvas>高

開始OpenGL ES 2.01

這一節主要內容是矩陣的使用,投影和相機相關知識。一、矩陣相關        由於OpenGL ES使用的是列向量,所以向量與矩陣計算方式為 矩陣乘向量;在DirectX中使用的是行向量計算方式為 向量乘矩陣。二、投影相關        在OpenGL ES中投影方式有兩種,分

Hyperledger Fabric 1.0 開始(二)——公網環境構建

1.3 項目 htm move 自己 lvm2 fast 情況 tor 1:環境構建 在本文中用到的宿主機環境是Centos ,版本為Centos.x86_647.2,通過Docker 容器來運行Fabric的節點,版本為v1.0。因此,啟動Fabric網絡中的節點需要先安

Hyperledger Fabric 1.0 開始(六)——創建Fabric多節點集群

_id 測試 es2017 xtra 去掉 compose 多個 服務 執行命令 4:創建Fabric多節點集群 4.1、配置說明 首先可以根據官方Fabric自帶的e2e_cli列子中的集群方案來生成我們自己的集群,與案例不同的是我們需要把容器都分配到不同的服務器上,彼此

炸金花的JS實現0開始之 -------現在什麽都不會(1

nds 朋友 div rand art iam src blog js實現 新年結束了。回想起來唯一留下樂趣的就是在家和朋友玩玩炸金花。 遂有此文。 對不起,我這時候還沒有思路。 讓我捋一捋。 。。。 。。。 捋一捋啊。。。 。。。 好了。今天先這樣吧: (1)先整理出所有