(一)EGE绘图相关准备

图形学EGE实现: 图形学EGE实现

文章目录

  • 一、EGE的安装与配置
  • 二、EGE的使用
    • EGE的详细使用教程
    • 关于EGE的控制台
    • 1. EGE窗口创建与关闭
    • 2. 颜色的设置
      • (1)颜色类型 color_t
      • (2)设置颜色
      • (3) 获取颜色
    • 3. 文字的输出
      • (1) 字体的设置
      • (2) 文字输出
    • 4. 坐标系
    • 5. 窗口刷新
      • (1) 延时刷新
      • (2) 手动刷新
      • (3) 强制刷新
    • 6. 帧率控制与帧循环
      • (1) 帧率控制
      • (2) 帧循环
    • 7. 获取窗口大小
    • 8. 画像素点
    • 9. 清屏
      • (1) 全部清屏
      • (2) 部分清屏
  • 三、绘图函数
    • 1. 基础绘图函数
    • 2. 高级绘图函数
  • 四、键盘鼠标交互

一、EGE的安装与配置

配置相关参见 EGE专栏 (二)EGE安装与配置
https://blog.csdn.net/qq_39151563/article/details/100161986

二、EGE的使用

下面仅对EGE进行简要的讲解,详细使用请参见EGE专栏

EGE的详细使用教程

参见EGE专栏
https://blog.csdn.net/qq_39151563/category_9311717.html

关于EGE的控制台

  EGE很多情况会遇到控制台问题,因为EGE是创建一个新的窗口,而不是直接在控制台上绘画,使用时可以根据个人需要关闭或显示控制台。
  控制台显示和关闭设置参见:
https://blog.csdn.net/qq_39151563/article/details/104342295

(一)EGE绘图相关准备_第1张图片

1. EGE窗口创建与关闭

  • 创建窗口
    使用 initgraph() 即可创建窗口,首次使用将会创建窗口,后面调用则是会改变窗口大小,并将窗口清屏。
void initgraph(int width, int height, int mode);

注意一下第三个参数 mode, 这里一般都传入 INIT_RENDERMANUAL,即手动渲染模式,是为了绘制更快,避免闪烁

  • 关闭窗口
    使用 closegraph() 可将窗口关闭(隐藏不显示)
void closegraph();

下面是窗口的创建与关闭示例:

#include 

int main()
{
	//创建宽高为640 x 480的窗口,手动渲染模式
	initgraph(640, 480, INIT_RENDERMANUAL);

	//暂停,等待用户按键
	getch();

	//关闭窗口
	closegraph();
	
	return 0;	
}

  运行后会创建一个窗口,默认背景色为黑色,按下任意键后窗口关闭。
(一)EGE绘图相关准备_第2张图片

2. 颜色的设置

(1)颜色类型 color_t

  EGE中的颜色类型为 color_t, 为ARGB颜色。存储格式为,小端模式下,由高位到低位,每一个字节,依次为 A,R,G,B, 即0xAARRGGBB
  普通绘图函数使用RGB颜色,即0x00RRGGBB, 高级绘图函数使用ARGB颜色。
  有常用的生成对应颜色的宏

EGERGB(r, g, b)
EGEARGB(a, r, g, b)
EGEACOLOR(a, color)
EGEGRAY(gray)
EGEAGRAY(a, gray)

  内部定义的颜色枚举

// 颜色
enum COLORS {
	BLACK           = 0,
	BLUE            = EGERGB(0, 0, 0xA8),
	GREEN           = EGERGB(0, 0xA8, 0),
	CYAN            = EGERGB(0, 0xA8, 0xA8),
	RED             = EGERGB(0xA8, 0, 0),
	MAGENTA         = EGERGB(0xA8, 0, 0xA8),
	BROWN           = EGERGB(0xA8, 0xA8, 0),
	LIGHTGRAY       = EGERGB(0xA8, 0xA8, 0xA8),
	DARKGRAY        = EGERGB(0x54, 0x54, 0x54),
	LIGHTBLUE       = EGERGB(0x54, 0x54, 0xFC),
	LIGHTGREEN      = EGERGB(0x54, 0xFC, 0x54),
	LIGHTCYAN       = EGERGB(0x54, 0xFC, 0xFC),
	LIGHTRED        = EGERGB(0xFC, 0x54, 0x54),
	LIGHTMAGENTA    = EGERGB(0xFC, 0x54, 0xFC),
	YELLOW          = EGERGB(0xFC, 0xFC, 0x54),
	WHITE           = EGERGB(0xFC, 0xFC, 0xFC),
};

使用如下:
颜色变量赋值为红色

//RGB
color_t color = RED;
color_t color = EGERGB(0xFF, 0x0, 0x0);
color_t color = 0xFF0000;

//ARGB
color_t color = EGEARGB(0xFF, 0xFF, 0x0, 0x0);
color_t color = EGEACOLOR(0xFF, RED);
color_t color = 0xFFFF0000;

(2)设置颜色

  颜色分为背景色,前景色,填充色三种,分别由一下设置:

  • 背景色
    清屏时会用背景色填充,默认为黑色
设置背景色,并旧背景色的像素更换为新背景颜色
void setbkcolor(color_t color);	

只设置背景色,不更换像素
void setbkcolor_f(color_t color);	
  • 前景色
    前景色影响线条颜色,文字颜色, 边框颜色默认为浅灰色
void setcolor(color_t color);
  • 填充色
    绘制填充图形时的内部填充颜色,默认为黑色
void setfillcolor(color_t color);

(3) 获取颜色

  • 获取背景色
color_t getbkcolor();
  • 获取前景色
color_t getcolor();
  • 获取填充色
color_t getfillcolor();

3. 文字的输出

(1) 字体的设置

字体的设置一般使用 setfont(height, width, 字体名) 即可。

void setfont(int height, int width, const char* font);

其中字体参数 font 是字符串,如 “楷体”, “宋体”
height 为文字高度,单位为像素。
width 为文字宽度,单位为像素。设置为0 则 根据字体高度,对宽度自适应,一般设置为0。

setfont(24, 0, "宋体");

(2) 文字输出

  • 固定文字输出
    x, y 为文字输出位置,是文字左上角的坐标。
void outtextxy(int x, int y, const char* text);
  • 格式化文字输出
    printf() 类似,只是前面多了输出的位置参数。
void xyprintf(int x, int y, const char* format, ...);

使用如下:

xyprintf(20, 10, "圆周率 Pi = %lf,大约为直径的%.2lf倍", PI, 3.14);

4. 坐标系

窗口的坐标系如下图,x轴向右为正,y轴向下为正
左上角 (x,y)(0, 0),右下角为 (width-1, height-1)
因此是和平时所看的坐标系是上下相反的,窗口坐标系和平时阅读的顺序是一致的
(一)EGE绘图相关准备_第3张图片

5. 窗口刷新

(1) 延时刷新

  窗口的刷新显示有时需要窗口暂停一下,即调用一些延时的函数,如常用的 getch(), delay_fps()

getch();

(2) 手动刷新

  如果你的程序运行时没有调用到延时类的函数,并且窗口上没有显示出绘制的内容,有可能是窗口没有刷新,可以调用 delay_ms(0) 进行手动刷新 (这个是不延时刷新的方法)
这个会根据是否调用了绘图函数决定是否刷新。

delay_ms(0);

(3) 强制刷新

  窗口强制刷新可以使用 delay_ms(1), 或delay_fps()。如果你没有调用绘图函数,而是通过其它方法进行了绘图,此时可能手动刷新也无效,因此需要进行强制刷新。

delay_ms(1);
getch();

6. 帧率控制与帧循环

(1) 帧率控制

  动画需要控制一定的帧率,通常用 delay_fps() 来延时以保持一定的帧率,因为屏幕刷新速率一般是60FPS,所以一般设置为60

delay_fps(60);

  获取窗口刷新帧率用getfps();

float getfps();

(2) 帧循环

动画和交互中的帧循环通常如下写法:
is_run() 是判断窗口环境是否还在运行,窗口初始化模式没有INIT_NOFORCEEXIT设置的情况下,等效为 true

for (; is_run(); delay_fps(60)) {
	绘图、交互
}

7. 获取窗口大小

  • 获取窗口宽度像素数
int width = getwidth();
  • 获取窗口高度像素数
int height = getheight();

8. 画像素点

  在对应坐标绘制一个颜色为color 的像素点,里面有参数有效检测,超出范围也没问题。

void putpixel(int x, int y, color_t color);

  还有没有参数有效检测的画点函数,如果已经确定点不超出窗口范围,能够减少绘制时间。

putpixel_f(int x, int y, color_t color)

  还有更快地绘制方法,即获取窗口帧缓存首地址,将对应的像素设置为目标颜色,需要自己防止越界。得到的是一维数组

color_t* buff = getbuffer(NULL);

坐标为(x, y)的像素,对应为 buff[x + y * width], 其中width为窗口宽度。
如,在(100, 20) 的位置画一个红色的点

int width = getwidth();
buff[100 + 20 * width] = RED;

不过这样可能需要强制刷新

9. 清屏

  如果绘制过程中有上一次绘画时留下的痕迹,绘画时能简单覆盖就覆盖,不能简单覆盖的,需要清屏重绘,以消除痕迹

(1) 全部清屏

窗口将全部变为背景色

cleardevice();

(2) 部分清屏

简单地可以设置填充色为背景色,然后用填充矩形覆盖即可。
或者可以通过设置视口区域,然后对视口区域进行清除。区域固定比较比较快。
其中,clip是绘制到视口区域外的图形是否需要裁剪。

设置视口区域
setviewport(left, top right, bottom, clip);

清除视口区域
clearviewport();

三、绘图函数

1. 基础绘图函数

绘图函数直接根据函数的参数说明使用即可,参见
(七)EGE基础绘图
https://blog.csdn.net/qq_39151563/article/details/104342390

2. 高级绘图函数

高级函数即可透明和带抗锯齿绘图函数,画出的图形比较美观。
参见 (八)EGE高级绘图
https://blog.csdn.net/qq_39151563/article/details/104342471

四、键盘鼠标交互

请查看 EGE专栏键盘消息鼠标消息 部分

你可能感兴趣的:(图形学)