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;
}