当前位置:   article > 正文

easyX基本概念(注释版)

easyx

0.前言

本次我给您带来easyX库系列的博文,本系列博文目的在于对原easyX库文档进行一个补充和注解,重在补充测试样例和实践。

easyX库本身并不值得过于学习,但是作为有C语言基础的C爱好者,学习easyX能让您对IT技术更加感兴趣。用easyX库的时候,除了编程,还能学到跟多知识,例如:“色彩模型”、“掩码”等。

使用easyX库能让我们体验到一点点开发的乐趣所在,本系列承诺将在学习末尾给出几个经典小游戏的code供您参考。

0.1.easyX库基本说明

这一部分我直接摆出原文,其中有些陌生概念我会一一进行注解(注意,现在写这篇博文的时间点是2023/6/16)

“基本说明:EasyX 是针对 C++ 的图形库,可以帮助 C/C++ 初学者快速上手图形和游戏编程。
比如,可以基于 EasyX 图形库很快的用几何图形画一个房子,或者一辆移动的小车,可以编写俄罗斯方块、贪吃蛇、黑白棋等小游戏,可以练习图形学的各种算法,等等。
许多人学编程都是从 C 语言入门的,而现状是:

  1. 有些学校以 Turbo C 为环境学习 C 语言,只是 Turbo C 实在太老了,复制粘贴都很不方便。
  2. 有些学校直接拿 VC 来讲 C 语言,因为 VC 的编辑和调试环境都很优秀,并且 VC 有适合教学的免费版本。可惜在 VC 里面只能做一些文字性的练习题,想画条直线或一个圆都很难,例如需要注册窗口类、建消息循环等等,初学者会受严重打击的。初学编程想要绘图就得用 TC,很是无奈。
  3. 还有计算机图形学,这门课程的重点是绘图算法,而不是 Windows 编程。所以,许多老师不得不用 TC 教学,因为 Windows 绘图太复杂了,会偏离教学的重点。新的图形学的书有不少是用的 OpenGL,可是门槛依然很高。

所以,我们想给大家一个更好的学习平台,就是 VC 方便的开发平台和 TC 简单的绘图功能,于是就有了这个 EasyX 库。如果您刚开始学 C 语言,或者您是一位教 C 语言的老师,再或者您在教计算机图形学,那么这个库一定会让您兴奋的。”——来自easyX库官方文档

  1. C++语言可以理解为C语言的超集(C语言的升级版,比C更加强大,也更加复杂),C++涵盖了C的大部分语法,这样做的的目的是为了兼容过去的C程序
  2. Turbo C是一个集成式开发环境(IDE)和编译器,主要用于C和C++编程,其常见缩写为TC。它由Borland公司于1987年发布,并且在当时非常流行,特别是在MS-DOS操作系统上广泛使用。然而现在除了某些没有更新知识的学校,基本上没有再使用这个古老的IDE编辑器了
  3. 这里的VC应该是指Visual C++ 6.0一类IDE的简称,是一个由微软公司开发的C++集成式开发环境(IDE)和编译器。该工具主要用于Windows操作系统上的C++编程。其本身也是非常古老的IDE了,尽管现在很少人会用VC6.0了,但是它的后继者Visual Studio 2019等系列的IDE现在仍有大量的人在学习使用
  4. 计算机图形学是研究如何利用计算机生成、处理和显示图像的学科。它涵盖了图像处理、计算几何、计算机视觉和计算机图像等方面的内容。计算机图形学是多学科交叉的研究领域,需要涉及到数学、物理、计算机科学等多个学科的知识。通过利用计算机来模拟和处理图像,计算机图形学可以应用于许多领域,例如电影制作、游戏开发、虚拟现实、机器人控制、医学成像等等
  5. OpenGL (Open Graphics Library) 是一种跨平台的图形应用程序编程接口 (API),它允许开发人员利用计算机的图形硬件来生成高质量的二维和三维图像。OpenGL具有良好的可移植性和灵活性,支持在多个操作系统 (如 Windows、macOS、Linux 等) 上进行开发和移植。OpenGL可以被用于制作各种类型的图形应用程序,例如:3D 游戏、计算机辅助设计 (CAD) 软件、虚拟现实应用、科学可视化等等。它提供了大量的图形功能和效果,如纹理映射、阴影处理、透明度、混合、反射和折射效果等等。由于OpenGL的广泛应用和不断发展的特性,它已成为计算机图形学领域中最重要和最流行的图形应用程序接口之一

0.2.easyX库安装教程

官方文档有写,有时间我还会给出一个动态的.gif图来演示安装过程。

0.3.easyX库使用教程

“比如:启动 Visual C++,创建一个空的控制台项目(Win32 Console Application),然后添加一个新的代码文件(.cpp),并引用 graphics.h 头文件就可以了。”

如果您和我一样使用的是VS2022这款IDE,那么这段话的意思是:您在新建项目的时候,一定要记得创建尾缀为“.cpp”的C++语言源文件,而不是创建尾缀为“.c”的C语言源文件。而原因在开头便有提到:“EasyX 是针对 C++ 的图形库……”

想要使用easyX库,只需要像引入头文件一样引入图形库头文件就可以了,下面是官网的几个示范例子,您可以试着拷贝一下,来查看自己的easyX库是否安装正确,并且提前预览一下未来使用easyX库后的大致效果。(有的地方我略作了修改,并不影响真正的代码逻辑)

0.3.1.画圆code

#include <graphics.h>		// 引用图形库头文件
#include <conio.h>
int main()
{
	initgraph(640, 480);	// 创建绘图窗口,大小为 640x480 像素
	circle(200, 200, 100);	// 画圆,圆心(200, 200),半径 100
	getchar();				// 按任意键继续
	closegraph();			// 关闭绘图窗口
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

在这里插入图片描述

0.3.2.字符code

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

int main()
{
	// 设置随机种子
	srand((unsigned) time(NULL));

	// 初始化图形模式
	initgraph(640, 480);

	int  x, y;
	char c;

	settextstyle(16, 8, _T("Courier"));	// 设置字体

	// 设置颜色
	settextcolor(GREEN);
	setlinecolor(BLACK);

	for (int i = 0; i <= 479; i++)
	{
		// 在随机位置显示三个随机字母
		for (int j = 0; j < 3; j++)
		{
			x = (rand() % 80) * 8;
			y = (rand() % 20) * 24;
			c = (rand() % 26) + 65;
			outtextxy(x, y, c);
		}

		// 画线擦掉一个像素行
		line(0, i, 639, i);

		Sleep(10);					// 延时
		if (i >= 479)	i = -1;
		if (_kbhit())	break;		// 按任意键退出
	}

	// 关闭图形模式
	closegraph();
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

在这里插入图片描述

0.3.3.星空code

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

#define MAXSTAR 200	// 星星总数

struct STAR
{
	double	x;
	int		y;
	double	step;
	int		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;
	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() % 640;
	}

	// 绘制星空,按任意键退出
	while(!_kbhit())
	{
		for(int i = 0; i < MAXSTAR; i++)
			MoveStar(i);
		Sleep(20);
	}

	closegraph();					// 关闭绘图窗口
	return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64

在这里插入图片描述
官网甚至还有一个高度模拟windowsXP扫雷的code例子,但是在这里就不copy过来给您看了。
在这里插入图片描述

现在,在入门学习easyX库之前,先让我带您理解三个概念:“颜色”、“坐标”、“设备”。

1.颜色(描述颜色的各种方法)

1.1.EasyX支持的颜色表示方法

EasyX使用24bit真彩色,不支持调色板模式。

  1. 24bit真彩色(英文名:True Color),也称为24位RGB色彩空间,是一种在计算机图形领域中常用的颜色表示方式,用于指定一种包含3种基本颜色(红、绿、蓝)的颜色,即每种基本颜色占8个比特位,共占据24个比特位。该模式下可表示 2 24 = 16 , 777 , 216 2^{24} = 16,777,216 224=16,777,216种颜色,远超过人眼可分辨的颜色数量,因此可实现非常细腻的颜色过渡。这种颜色表示方式广泛应用于计算机图形领域,包括操作系统界面、图像处理软件、视频游戏等等。需要注意的是,24bit真彩色和其他颜色表示方式(如索引色、RGB555等)之间存在差别。例如,在索引色调色板中,每个颜色由一个唯一的索引值表示,而在RGB565模式下,每个像素仅使用16位来表示颜色,因此只能表示 2 16 = 65 , 536 2^{16}=65,536 216=65,536种不同的颜色。相比之下,24bit真彩色具有更高的精度和色彩深度,可以呈现更加真实的颜色效果。
  2. 调色板模式(Palette Mode)是一种颜色表示方式,常见于计算机图形领域中,尤其是早期计算机和游戏机的图形处理器中。在调色板模式中,首先需要创建一张颜色表(称为调色板),其中包含若干个固定的颜色。然后,每个像素只需要指定一个特定的索引值,该索引值对应着调色板中的某个颜色。因此,调色板模式可以通过使用相对较少的位数(通常是4位或8位,即16种或256种不同的颜色)来表示一幅图像,从而可以节省内存空间,提高图像渲染速度。然而,调色板模式的缺点是色彩深度不足,难以呈现真实的、细腻的颜色过渡效果。此外,由于调色板中的颜色数量有限,相同的颜色可能会被用于多处,这可能导致图像失去细节和质感。目前,调色板模式已经逐渐被24bit真彩色等更加灵活和高保真的颜色表示方式所取代,但仍然在某些特定的应用场景中被使用,例如某些老式游戏的图形处理器中。

1.2.EasyX使用颜色的途径

1.2.1.使用自带的宏来表示颜色

常量			    值			颜色
--------		--------	--------
BLACK			0			黑
BLUE			0xAA0000	蓝
GREEN			0x00AA00	绿
CYAN			0xAAAA00	青
RED				0x0000AA	红
MAGENTA			0xAA00AA	紫
BROWN			0x0055AA	棕
LIGHTGRAY		0xAAAAAA	浅灰
DARKGRAY		0x555555	深灰
LIGHTBLUE		0xFF5555	亮蓝
LIGHTGREEN		0x55FF55	亮绿
LIGHTCYAN		0xFFFF55	亮青
LIGHTRED		0x5555FF	亮红
LIGHTMAGENTA	0xFF55FF	亮紫
YELLOW			0x55FFFF	黄
WHITE			0xFFFFFF
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

1.2.2.使用16进制的数字表示颜色

常见的16进制表示规则为“0xbbggrr”,其中“bb”为蓝、“gg”为绿、“rr”为红。因此一串十六进制字符就可以表示一种颜色。

1.2.3.使用RGB宏合成颜色

RGB宏在Windows SDK中定义。Windows SDK全称为Windows Software Development Kit,即“Windows软件开发工具包”,是微软官方提供的一套用于开发Windows操作系统上应用程序的工具集合。包含了许多常用的工具和库,如编译器、调试器、API 文档、示例代码等,提供了完整的开发环境和必要的资源,方便开发者进行开发和测试Windows应用程序。其中最重要的是Windows API(Application Programming Interface)文档,描述了Windows操作系统所提供的各种编程接口,方便开发者在程序中调用系统功能。Windows SDK随着不同版本的Windows操作系统一起发布,因此不同版本的Windows SDK支持的操作系统版本也有所不同。开发者可以根据自己的需求下载和安装对应版本的 Windows SDK,来满足开发需要。此外,Windows SDK中还包含了.NET Framework和Visual Studio相关的工具和库,可用于开发.NET应用程序和Visual Studio扩展等。

COLORREF RGB(
	BYTE byRed,		// 颜色的红色部分
	BYTE byGreen,	// 颜色的绿色部分
	BYTE byBlue		// 颜色的蓝色部分
);
//参数:
//byRed颜色的红色部分,取值范围:0~255。
//byGreen颜色的绿色部分,取值范围:0~255。
//byBlue颜色的蓝色部分,取值范围:0~255。

//返回值:
//返回合成的颜色
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

可以通过GetRValue、GetGValue、GetBValue宏从RGB颜色中分离出红、绿、蓝颜色分量。

1.2.4.使用HSLtoRGB、HSVtoRGB转换其他色彩模型到RGB颜色

  1. HSL颜色模型不同于RGB模型,是一种基于色调、饱和度和亮度三个参数的颜色模式,常用于图形设计和Web设计中。HSL分别表示色调(Hue)、饱和度(Saturation)和亮度(Lightness)。色调表示颜色在色轮上的位置,饱和度表示颜色的纯度或深浅程度,亮度表示颜色的明暗程度。
    在这里插入图片描述
//该函数用于转换HSL颜色为RGB颜色
COLORREF HSLtoRGB(
	float H,
	float S,
	float L
);
//参数:
//H原 HSL 颜色模型的 Hue(色相) 分量,0<=H<360。
//S原 HSL 颜色模型的 Saturation(饱和度) 分量,0<=S<=1。
//L原 HSL 颜色模型的 Lightness(亮度) 分量,0<=L<=1。

//返回值:
//返回对应的RGB颜色
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. HSV颜色模型:HSV是一种基于色相、饱和度和值三个参数的颜色模式,与HSL颜色模式类似,常用于图形设计和Web设计中。HSV分别表示色相(Hue)、饱和度(Saturation)和值(Value)。颜色的色相、饱和度和值分别对应着颜色在圆锥体上的位置、纯度和亮度。
    在这里插入图片描述
COLORREF HSVtoRGB(
	float H,
	float S,
	float V
);
//参数:
//H 是英文 Hue 的首字母,表示色相,即组成可见光谱的单色。红色在 0 度,绿色在 120 度,蓝色在 240 度,以此方向过渡。
//S 是英文 Saturation 的首字母,表示饱和度,等于 0 时为灰色。在最大饱和度 1 时,每一色相具有最纯的色光。
//V 是英文 Value 的首字母,表示明度,等于 0 时为黑色,在最大明度 1 时,是色彩最鲜明的状态。

//返回值:
//返回对应的RGB颜色
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1.2.5.四种方法的使用例子

以下是几种设置画线颜色的方法

setlinecolor(0xff0000); 
setlinecolor(BLUE); 
setlinecolor(RGB(0, 0, 255)); 
setlinecolor(HSLtoRGB(240, 1, 0.5));
  • 1
  • 2
  • 3
  • 4

2.坐标(描述坐标系)

在easyX库中有两种坐标:物理坐标、逻辑坐标。

2.1.物理坐标

物理坐标是描述设备(这里的设备是指easyX库中的设备)的坐标体系。坐标原点在设备的左上角,X轴向右为正,Y轴向下为正,度量单位是“像素”。坐标原点、坐标轴方向、缩放比例都不能改变。

2.2.逻辑坐标

逻辑坐标是在程序中用于绘图的坐标体系。坐标默认的原点在窗口的左上角,X 轴向右为正,Y 轴向下为正,度量单位是“点”。默认情况下,逻辑坐标与物理坐标是一一对应的,一个逻辑点等于一个物理像素。在easyX库帮助手册中,凡是没有注明的坐标,均指逻辑坐标。

3.设备(描述“设备”概念)

在easyX库中“设备”是指绘图表面。分两种,一种是默认的绘图窗口,另一种是IMAGE对象。通过SetWorkingImage()可以设置当前用于绘图的设备。设置当前用于绘图的设备后,所有的绘图函数都会绘制在该设备上。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/93991
推荐阅读
相关标签
  

闽ICP备14008679号