openGL实时显示速度并实时绘制速度曲线c++程序
本文提供的代码实现了在OpenGL窗口中实时显示速度值和速度曲线的功能。代码使用C++编写,需要使用OpenGL库和GLUT库。
代码实现思路:
- 定义一个速度变量,用于记录当前的速度值。
- 定义一个速度数组,用于存储历史速度值。
- 定义一个计数器,记录当前已经存储到速度数组的位置。
- 在OpenGL窗口中显示速度值和速度曲线。
- 实现一个定时器函数,每隔一定时间更新速度值和速度数组,并重新绘制窗口。
代码实现:
#include <GL/glut.h>
#include <iostream>
#include <vector>
using namespace std;
// 定义速度变量
double speed = 0.0;
// 定义速度数组,存储历史速度值
vector<double> speeds(100, 0.0);
// 定义计数器,记录当前已经存储到速度数组的位置
int count = 0;
void display()
{
// 清空颜色缓存和深度缓存
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// 绘制速度值
glPushMatrix();
glTranslatef(-0.9, 0.8, 0.0);
glColor3f(1.0, 1.0, 1.0);
glRasterPos2f(0.0, 0.0);
string str = "Speed: " + to_string(speed);
const char *cstr = str.c_str();
glutBitmapString(GLUT_BITMAP_HELVETICA_18, (const unsigned char *)cstr);
glPopMatrix();
// 绘制速度曲线
glPushMatrix();
glTranslatef(-0.9, -0.8, 0.0);
glColor3f(1.0, 1.0, 1.0);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < count; i++)
{
glVertex2f((double)i / count, speeds[i]);
}
glEnd();
glPopMatrix();
// 交换前后缓存
glutSwapBuffers();
}
void update(int value)
{
// 随机生成一个速度值(模拟实际应用中的速度值)
speed = (double)(rand() % 100) / 10.0;
// 将速度值存储到速度数组中
speeds[count] = speed;
count++;
if (count >= 100)
{
count = 0;
}
// 重新绘制窗口
glutPostRedisplay();
// 设置定时器
glutTimerFunc(100, update, 0);
}
int main(int argc, char **argv)
{
// 初始化OpenGL和GLUT库
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(800, 800);
glutCreateWindow("Real-time Speed Display");
// 设置窗口背景颜色
glClearColor(0.0, 0.0, 0.0, 1.0);
// 设置投影矩阵
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(-1.0, 1.0, -1.0, 1.0);
// 设置模型视图矩阵
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// 注册回调函数
glutDisplayFunc(display);
// 启动定时器
glutTimerFunc(100, update, 0);
// 进入主循环
glutMainLoop();
return 0;
}
代码说明:
- 在display函数中,首先使用glClear函数清空颜色缓存和深度缓存。然后绘制速度值和速度曲线。速度值的绘制使用了glRasterPos2f函数和glutBitmapString函数,速度曲线的绘制使用了glBegin函数和glEnd函数,其中使用了GL_LINE_STRIP参数表示绘制线条。
- 在update函数中,首先生成一个随机速度值,并将其存储到速度数组中。然后更新计数器,如果已经存储到速度数组的末尾,则重新从头开始存储。最后重新绘制窗口,并设置定时器,每隔100毫秒调用一次update函数。
- 在main函数中,首先初始化OpenGL和GLUT库。然后设置窗口背景颜色,投影矩阵和模型视图矩阵。接着注册回调函数和启动定时器。最后进入主循环。
原文地址: https://www.cveoy.top/t/topic/bq65 著作权归作者所有。请勿转载和采集!