Easyx图形库使用(数据可视化)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 easyx本身是为图形绘制准备的。既然是图形绘制,而且它还可以处理图像,处理键盘、鼠标,那么自然做游戏是非常合适的。然而不仅仅如此,它还可以做一些数据可视化的操作。这里面很多程序本身是没有界面,当成后台程序在跑的,但是这个时候如果有个图形化界面,可以展现各个设备的运行状态,这样的处
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
easyx本身是为图形绘制准备的。既然是图形绘制,而且它还可以处理图像,处理键盘、鼠标,那么自然做游戏是非常合适的。然而不仅仅如此,它还可以做一些数据可视化的操作。这里面很多程序本身是没有界面,当成后台程序在跑的,但是这个时候如果有个图形化界面,可以展现各个设备的运行状态,这样的处理效率,要比纯后台程序效率高很多。
很多人也许会说,是不是网页也可以。事实上是这样的,但是如果只是网络设备、232设备、485设备,那么把这些数据直接用easyx展示,不是效率更高么?当然,今天我们就简单展示一下动态的正弦曲线是怎么样的,算是抛砖引玉吧。

1、动态的正弦曲线
正弦曲线绘制的时候,一般都是一个、一个的离散点,实际绘制的时候都会把这个点绘制成直线。再加上起始点的不同,就会产生一个动态变化的效果。
// 显示波形
void drawSinWave(int offsetX)
{
int prevX = -1;
int prevY = -1;
setlinecolor(BLUE); // 设置线条颜色为蓝色
BeginBatchDraw();
for (int x = 0; x < WIDTH; x++)
{
int y = (int)(AMPLITUDE * sin((x + offsetX) * 0.1* FREQUENCY) + HEIGHT / 2);
if (prevX != -1 && prevY != -1) //过滤第一个点
{
line(prevX, prevY, x, y);
}
prevX = x;
prevY = y;
}
settextcolor(RED); // 设置文字颜色为红色
settextstyle(20, 0, L"Arial"); // 设置字体样式和大小
outtextxy(280, 50, L"正弦波仿真"); // 在屏幕上方位置显示文字
FlushBatchDraw();
}
2、动态更新偏移值
细心的同学发现了,刚才的drawSinWave函数有一个offset输入参数。这个参数就是整个正弦曲线可以运动起来的关键。通过修改offset的数值,可以让直线的起始数值发生改变,从而间接产生流动的效果。当然实际开发的时候,会用vector或者是queue来保存和展示数据,这也是可以的。
while (true)
{
cleardevice(); // 清空屏幕
drawSinWave(offsetX); // 绘制正弦波并连接点
offsetX += SPEED; // 每帧增加偏移量
if (offsetX > WIDTH)
{
offsetX = 0;
}
Sleep(50); // 稍微延迟,控制动画速度
}
3、其他需要注意的地方
easyx写的比较多了,其他需要注意的地方就是字符集的设置、告警宏的添加、FlushBatchDraw的补充等等。当然如果有一些参数不想通过InputBox输入,那么通过命令行输入也是可以的,类似于这样,
// 解析命令行参数,设置移动速度
void parseArgs(int argc, char* argv[])
{
if (argc > 1)
{
SPEED = atoi(argv[1]); // 如果传入了速度参数,设置 SPEED
}
}
最后给出完整的代码,有需要的小伙伴,可以好好看一下,
// 基础头文件
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <stdlib.h>
// 关于全局数据
static const int WIDTH = 640;
static const int HEIGHT = 480;
static const int AMPLITUDE = 100;
static const int FREQUENCY = 1;
static int SPEED = 2; // 设置默认的移动速度为 2
// 解析命令行参数,设置移动速度
void parseArgs(int argc, char* argv[])
{
if (argc > 1)
{
SPEED = atoi(argv[1]); // 如果传入了速度参数,设置 SPEED
}
}
// 显示波形
void drawSinWave(int offsetX)
{
int prevX = -1;
int prevY = -1;
setlinecolor(BLUE); // 设置线条颜色为蓝色
BeginBatchDraw();
for (int x = 0; x < WIDTH; x++)
{
int y = (int)(AMPLITUDE * sin((x + offsetX) * 0.1* FREQUENCY) + HEIGHT / 2);
if (prevX != -1 && prevY != -1) //过滤第一个点
{
line(prevX, prevY, x, y);
}
prevX = x;
prevY = y;
}
settextcolor(RED); // 设置文字颜色为红色
settextstyle(20, 0, L"Arial"); // 设置字体样式和大小
outtextxy(280, 50, L"正弦波仿真"); // 在屏幕上方位置显示文字
FlushBatchDraw();
}
// 主函数入口
int main(int argc, char* argv[])
{
int offsetX = 0;
parseArgs(argc, argv); // 解析命令行参数
initgraph(WIDTH, HEIGHT);
setbkcolor(RGB(240, 240, 240)); //背景为灰色
setbkmode(TRANSPARENT);
while (true)
{
cleardevice(); // 清空屏幕
drawSinWave(offsetX); // 绘制正弦波并连接点
offsetX += SPEED; // 每帧增加偏移量
if (offsetX > WIDTH)
{
offsetX = 0;
}
Sleep(50); // 稍微延迟,控制动画速度
}
_getch();
closegraph();
return 0;
}
更多推荐
所有评论(0)