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();
}
相關推薦
OpenGL從1.0開始--繪製常用統計圖
通過前面幾節的學習,我們已經有能力實現一些高階的圖形繪製功能。這一節我們給大家示例折線圖、直方圖和餅狀圖的繪製程式。 我們先看看要實現的效果。 下面我們預設大家已經掌握了前面的知識,並會把講解的重點放在高階功能上。 #include <gl/gl
OpenGL從1.0開始--第一個OpenGL程式
OpenGL的最早版本OpenGL 1.0由Mark Segal和Kurt Akeley釋出於1992年1月,時至今日早已是蒼海滄田。筆者將一小步一小步帶領大家去領略計算機圖形學神奇的世界。 OpenGL的“Hello World”是一個線段繪製小程式。下面直接
阿里巴巴中國總裁葉朋 B2B從1 0向2 0的升級 閱讀整理
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
tensorflow從1.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
Android從1.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
android從1.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.0【1】
這一節主要內容是矩陣的使用,投影和相機相關知識。一、矩陣相關 由於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)先整理出所有