基于EasyX的三个小程序案例

目录

1.星空

2.彩虹

3.鼠标绘图


1.星空

效果如下:

基于EasyX的三个小程序案例

#include<graphics.h>
#include<time.h>
#include<conio.h>

#define MAXSTAR 200  //设置最大星星数目

struct STAR
{
	double x;
	int y;
	double step;
	int color;
	//DWORD Color;
};
STAR star[MAXSTAR];

void InitStar(int i)
{
	star[i].x = 0;
	star[i].y = rand() % 480;
	star[i].step = (rand() % 5000) / 1000.0 + 1;
	star[i].color = (int)(star[i].step * 255 / 6.0 + 0.5);
	star[i].color = RGB(star[i].color, star[i].color,star[i].color);

}
//移动星星
void MoveStar(int i)
{
	//擦掉原来的星星
	putpixel((int)star[i].x, star[i].y, 0);  //作用于像素点
	//计算新的位置
	star[i].x += star[i].step;//*(rand()/(RAND_MAX+0.0)-0.3);
	if (star[i].x > 640)
		InitStar(i);
	//画心得星星
	putpixel((int)star[i].x,star[i].y, star[i].color);
}

int main()
{
	srand((unsigned)time(NULL));
	initgraph(640, 480);
	//初始化所有星星
	for (int i = 0; i < MAXSTAR; i++)
	{
		InitStar(i);
		star[i].x = rand() % 480;
	}
	//绘制星空
	while (!_kbhit())
	{
		for (int i = 0; i < MAXSTAR; i++)
		{
			MoveStar(i);
		}
		Sleep(100);
	}
	closegraph();
	//return 0;
}

定义了一个星星的结构体,最大星星数目设置为200,颜色和移动位置则由随机数决定 

 


2.彩虹

效果如下:

基于EasyX的三个小程序案例

代码如下:

#include<graphics.h>
#include<conio.h>
#include<iostream>

int main()
{
	//创建绘图窗口
	initgraph(640, 480);
	//画渐变的天空
	float H = 190;
	float S = 1;  //饱和度
	float L = 0.7f; //亮度
	for (int y = 0; y < 480; y++)
	{
		L += 0.0005f;
		setlinecolor(HSLtoRGB(H, S, L));
		line(0, y, 639, y);

	}
	//画彩虹
	H = 0;
	S = 1;
	L = 0.5f;
	setlinestyle(PS_SOLID, 2);  //设置线宽为2
	for (int r = 400; r > 344; r--)
	{
		H += 5;
		setlinecolor(HSLtoRGB(H, S, L));
		circle(500, 480, r);
	}
	//按任意键退出
	_getch();
	//Sleep(20000);
	closegraph();

}

主要是关于HSL颜色模式的使用,

HSL 又称 HLS。

HSL 的颜色模型如图所示:

基于EasyX的三个小程序案例

H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。

S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,具有最纯的色光。

L 是英文 Lightness 的首字母,表示亮度,等于 0 时为黑色,等于 0.5 时是色彩最鲜明的状态,等于 1 时为白色。


3.鼠标绘图

效果如下:

基于EasyX的三个小程序案例

代码:

#include<graphics.h>
#include<conio.h>

int main()
{
	//初始化
	initgraph(640, 480);
	MOUSEMSG m;  //定义鼠标消息
	while (true)
	{
		//获取一条鼠标消息
		m = GetMouseMsg();
		switch (m.uMsg)
		{
			case WM_MOUSEMOVE:
				//鼠标移动的时候画红色小红点
				putpixel(m.x, m.y, RED);
				break;
			case WM_LBUTTONDOWN:
				//如果点左键同事按下了Ctr键
				if (m.mkCtrl)
					//话题个大方框
					rectangle(m.x - 10, m.y - 10, m.x + 10, m.y + 10);
				else
					//画一个小方框
					rectangle(m.x - 5, m.y - 5, m.x + 5, m.y + 5);
				break;
			case WM_RBUTTONUP:
				return 0;
			default:
				break;
		}
	}
	//关闭窗口
	closegraph();
}

核心在于鼠标消息的捕捉和响应。EasyX的鼠标消息结构如下

struct MOUSEMSG
{
	UINT uMsg;			// 当前鼠标消息
	bool mkCtrl;		// Ctrl 键是否按下
	bool mkShift;		// Shift 键是否按下
	bool mkLButton;		// 鼠标左键是否按下
	bool mkMButton;		// 鼠标中键是否按下
	bool mkRButton;		// 鼠标右键是否按下
	int x;				// 当前鼠标 x 坐标(物理坐标)
	int y;				// 当前鼠标 y 坐标(物理坐标)
	int wheel;			// 鼠标滚轮滚动值
};

以上三个小程序转自:案例

 

上一篇:【C语言新手】EasyX图形库使用


下一篇:发布一个参考ssdb,用go实现的类似redis的高性能nosql:ledisdb