A Lightweight Real-time OpenGL Graph Component
An article on integrating an OpenGL-based graph component that provides real-time updates.
Introduction
I had this need to show some statistics through a graph in real-time, in a demo application which I wrote. The screenshot should illustrate clearly the idea behind this graph component. It will be useful for programmers who would like to track data in real-time, such as in data acquisition and analysis. I did not have time to develop something really elaborate, like different graph types, presentation options, and filters, but it should be very easy to add-on these functionalities from the code.
Using the code
Some of the features of this graph component are:
- A user-defined cache (list) for storing the graph data
- When data "overflows" the cache, the graph automatically discards the oldest data to create space for the latest data
- Moving average is calculated on-the-fly
It is very easy to include this code into any OpenGL-based application. The programmer only needs to make sure he/she has the rendering context.
OGLGraph* myGraph; void init ( GLvoid ) // Create Some Everyday Functions { glClearColor(0.0f, 0.0f, 0.0f, 0.f); //glClearDepth(1.0f); myGraph = OGLGraph::Instance(); myGraph->setup( 500 /*width*/, 100 /*height*/, 10 /*offsetX*/, 10 /*offsetY*/, 2 /*scaleX*/, 2 /*scaleY*/, 1 /*channels*/, 200 /*cache size*/ ); } void display ( void ) // Create The Display Function { // ... // This is a dummy function. Replace with custom input/data float time = glutGet(GLUT_ELAPSED_TIME) / 1000.0; float value; value = 5*sin( 5*time ) + 10.f; myGraph->update( value ); myGraph->draw(); }
Source code builds nicely in MS VS.NET 2003.
Points of Interest
You can include any filters like noise reduction, low-pass, or high-pass in the update()
code, or even pass post-processed data into this function if you can do that with an external software (e.g., using Matlab).
History
- First release.