【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱: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;
}

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐