(七)EGE基础绘图

目录

  • 基础绘图
    • 画笔设置
      • 设置背景颜色
      • 设置当前绘画颜色
      • 设置填充颜色
      • 设置当前绘画线型
      • 设置当前绘画线宽
      • 绘图位操作模式
    • 绘图目标
    • 图形的绘制
      • (1) 普通绘图函数
      • 普通绘图函数带有锯齿
        • 普通绘图函数使用的是RGB颜色
        • 绘图函数
          • 像素点
          • 多个像素点
          • 线
          • 圆(线框, 内部无填充):
          • 填充椭圆(内部带颜色)
          • 填充圆
        • 更多普通绘图函数请参考官网文档
        • 如何画圆?内部有颜色的那种
      • (2) 区域颜色填充

基础绘图

画笔设置

设置背景颜色

1. 设置背景颜色,并且将原来是背景颜色的像素替换成新的背景颜色

void setbkcolor(color_t color, PIMAGE pimg = NULL);

2. 只设置背景颜色,对像素不做修改

void setbkcolor_f(color_t color, PIMAGE pimg = NULL);
  • 所以想要改变背景颜色,并将屏幕上的背景颜色像素替换的话,选用setbkcolor()(如第一次设置背景颜色,想替换背景颜色的情况。)
  • 如果想改变背景颜色设置,并且要进行清屏操作的话,选用setbkcolor_f()(避免不想清屏的区域受影响)
  • 只想改变背景颜色设置,不对屏幕背景色像素进行修改选用setbkcolor_f()(避免不想清屏的区域受影响)

设置当前绘画颜色

void setcolor(color_t color, PIMAGE pimg = NULL);

设置填充颜色

void setfillcolor(color_t color, PIMAGE pimg = NULL);

设置当前绘画线型

可以设置实线,虚线,点线等,还可以设置线宽

void setlinestyle(int linestyle, WORD upattern = NULL, int thickness = 1, PIMAGE pimg = NULL);

参数说明:setlinestyle( 线型, 自定义线性, 线宽, 绘制的目标)

当线宽不为1时,画出来都会是实线,所以设置线宽不为1时线型失效,库的问题

  • linestyle, 线型
    linestyle只能从多个枚举中选择
enum line_styles {							线型注释
	SOLID_LINE      = PS_SOLID,				实线 = 0
	CENTER_LINE     = PS_DASH,				虚线 = 1
	DOTTED_LINE     = PS_DOT,				点线 = 2
	DASHED_LINE     = PS_DASHDOT,			点虚线 = 3
	NULL_LINE       = PS_NULL,				不可见 = 5
	USERBIT_LINE    = PS_USERSTYLE,			用户自定义 = 7
};
  • upattern, 自定义线型, 16位
    linestyleUSERBIT_LINE时,这个参数生效,从低位到高位一次代表从开始到末尾方向的每16个像素是否填充, 1代表填充 ,0代表不填充。

  • thickness, 线宽,与线型冲突, 大于1时线型失效

设置当前绘画线宽

thickness 是浮点型,线的宽度, 单位是像素,可以很大

void setlinewidth(float thickness, PIMAGE pimg = NULL);

这个需要注意,这个设置线宽函数只有在调用后调用一次 setcolor() 才会生效。

setlinewidth(thickness);
setcolor(color)

绘图位操作模式

  绘图默认使用当前颜色来进行绘制,但是可以设置使用其它颜色,比如黑色,白色,窗口颜色和当前颜色的混合。
  setwritemode()

绘图目标

  • 我们绘图时经常省略PIMAGE参数,此时默认是绘制到窗口上,也可以设置为默认绘制到其它窗口上。
  • 设置当前绘图对象。
    pbuf
    绘图对象,为PIMAGE类型,你要绘画到的PIMAGE,如果不填,则还原为窗口
void settarget(PIMAGE pbuf = NULL);
  • 获取当前绘图对象。
PIMAGE gettarget();

图形的绘制

  EGE部分绘图函数
  http://xege.org/manual/api/draw/index.htm

很多函数都有PIMAGE 参数, 这个是指向IMAGE对象的指针,默认值为NULL,即直接绘制到窗口中。

(1) 普通绘图函数

普通绘图函数带有锯齿

  画出的图形可以看到线条会有锯齿,不是很美观,所以如果想要美观,可以使用高级绘图函数

普通绘图函数使用的是RGB颜色

  • 接下来说的是普通绘图函数,和后面的高级绘图函数区别开来。
  • 普通绘图函数使用RGB颜色,ARGB颜色中的透明度对于普通绘图来说是无效的(高级绘图函数则可以使用透明度),不能调整透明度,所以不能把颜色设置为ARGB颜色,否则很有可能颜色会变成黑色(有些不会)
  • 图形的颜色是由前景色和填充颜色指定, setcolor()设置前景色, setfillcolor()设置填充颜色,设置颜色后,颜色就一直有效,直到下次设置。

绘图函数

绘图函数请查看官网的库函数绘图函数文档,下面只挑几个说明一下

(七)EGE基础绘图_第1张图片
(七)EGE基础绘图_第2张图片
(七)EGE基础绘图_第3张图片
(七)EGE基础绘图_第4张图片

函数的使用请查阅库函数目录

  http://xege.org/manual/api/draw/index.htm
(七)EGE基础绘图_第5张图片

像素点
	void putpixel(int x, int y, color_t color, PIMAGE pimg = NULL);
多个像素点
void putpixels(int nPoint, int* pPoints, PIMAGE pimg = NULL);

  参数
  nPoint:点的数目。
  pPoints: 指向点的描述的指针,一个int型的数组,依次每三个int描述一个点:第一个为x坐标,第二个为y坐标,第三个为颜色值。

这个需要注意,如果要使用绘制多个点的 putpixels() 或 putpixels_f(), 由源码可知,用的是BGR 颜色**(原因不清楚)**,可以使用 RGBTOBGR() 进行转换

如,绘制4个点, 每个点需要用三个int, 那么四个点就是4 * 3 个int.

int nPoint = 4;
int points[4 * 3] = {
	100, 100, RGBTOBGR(EGERGB(0XFF, 0, 0)),
	101, 100, RGBTOBGR(EGERGB(0XFF, 0, 0)),
	100, 101, RGBTOBGR(EGERGB(0XFF, 0, 0)),
	101, 101, RGBTOBGR(EGERGB(0XFF, 0, 0)),
};
putpixels(nPoint, points);
线

  画一条 从(x1, y1)到(x2, y2)的线。

void line(int x1, int y1, int x2, int y2, PIMAGE pimg = NULL);

从当前点到目标点画一条直线, 当前点由 moveto(x, y) 指定, 也可以使用 moverel(dx, dy) 作相对位置移动。

void lineto(int x, int y, PIMAGE pimg = NULL);

从当前点画一条到相对位置的直线。

void linerel(int dx, int dy, PIMAGE pimg = NULL);
圆(线框, 内部无填充):
	void circle(int x, int y, int radius, PIMAGE pimg = NULL)

  x, y, 圆中心坐标, radius, 圆半径
  示例:circle(320, 240, 100); //圆心在(320, 240)的半径为100的圆

填充椭圆(内部带颜色)
void fillellipse(int x, int y, int xradius, int yradius,PIMAGE pimg = NULL);

  x, y 椭圆中心坐标
  xradius, yradius, 两个半轴的长度, 相等即为一个圆的半径。
  使用示例:fillellipse(320, 240, 100, 100); //圆心在(320, 240)的半径为100的填充圆。

填充圆

椭圆长短半轴相等就是圆了。所以使用 fillellipse(x, y, radius, radius) 即可

更多普通绘图函数请参考官网文档

如何画圆?内部有颜色的那种

使用填充椭圆 fillellipse( )长短半轴相等的椭圆就是圆

(2) 区域颜色填充

如果画好了,可以自己手动给某些地方涂上颜色

先设置填充颜色

void setfillcolor(color_t color, PIMAGE pimg = NULL);

指定边界色填充
将一个边界颜色为border的封闭图形内部填充,x, y为边界内部的某个点。填充的颜色由 setfillcolor() 指定

void floodfill(int x, int y, int border, PIMAGE pimg = NULL);
  • 如下图,想要将下面的圆内部涂成浅蓝色,先要找到圆内部的一个点位置(在内部就行,不能在边界处),然后确定边界的颜色,下面圆的边界颜色是红色,然后调用即可。原理是从目标位置开始,把周围不是边界颜色的像素都改成填充颜色,所以边界颜色一定要能够封闭,不然会涂到外面。
    (七)EGE基础绘图_第6张图片 (七)EGE基础绘图_第7张图片
  • 下面就是边界颜色不封闭的结果

(七)EGE基础绘图_第8张图片

指定区域色填充
将areacolor颜色的色块填充,x, y为色块内的某个点 。

void floodfillsurface(int x, int y, int areacolor, PIMAGE pimg = NULL);
  • 如下图,想要将黄色色块涂成紫色, 先要找到色块内部的一个点(x, y), 然后确定色块的颜色值areacolor, 然后调用函数就可以了。
  • 原理是从目标位置开始,把周围颜色是areacolor的像素都改成填充颜色。这个和windows画图工具里油漆桶的作用是一样的。
    在这里插入图片描述
    (七)EGE基础绘图_第9张图片(七)EGE基础绘图_第10张图片

你可能感兴趣的:(EGE)