特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接
第10章 2-D图形库之绘制图形
本期主要讲解2-D图形库的图形绘制,包括绘制多边形,绘制圆,绘制椭圆,绘制弧线,绘制线图,绘制饼图。本期的例子不用在开发板上面做调试,直接用emWin5.24的模拟器即可。 10. 1 绘制多边形 10. 2 绘制圆 10. 3 绘制椭圆 10. 4 绘制弧线 10. 5 绘制线图 10. 6 绘制饼图
10.1 绘制多边形 多边形的绘制主要有以下几个函数:
10.1.1 例子一1. GUI_DrawPolygon(): 在当前窗口中绘制按点列表定义的多边形的轮廓,通过将终点连接到起点,绘制的多边形将自动闭合。 2. GUI_EnlargePolygon(): 按指定的长度 (像素)全方位扩展多边形,确保点的目标数组等于或大于源数组。 3. GUI_FillPolygon() 在当前窗口中绘制按点列表定义的填充的多边形,通过将终点连接到起点,绘制的多边形将自动闭合。终点无需接触到多边形的轮廓。通过为多边形的各个y位置绘制一条或多条水平直线,可对多边形进行渲染。默认情况下,为一个y位置绘制水平直线使用的最大点数量为12(意味着每个y位置需要6条直线)。如果需要增加此值,可使用宏GUI_FP_MAXCOUNT设置最大点数量。 下面是在模拟器上面实际运行的例子 - #include "GUI.h"
-
- /* 图形的原始坐标点 */
- const GUI_POINT aPoints[] = {
- { 40, 20},
- { 0, 20},
- { 20, 0}
- };
-
- /* 用于存储放大后的坐标点 */
- GUI_POINT aEnlargedPoints[GUI_COUNTOF(aPoints)];
-
- void Sample(void) {
- int i;
- GUI_Clear();
- /* 设置绘图模式 */
- GUI_SetDrawMode(GUI_DM_XOR);
- /* 绘制多边形 */
- GUI_FillPolygon(aPoints, /* 指向要显示和填充的多边形 */
- GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
- 140, /* 原点的X位置 */
- 110); /* 原点的Y位置 */
-
- for (i = 1; i < 10; i++) {
- GUI_EnlargePolygon(aEnlargedPoints, /* 指向目标多边形 */
- aPoints, /* 指向源多边形 */
- GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
- i * 5); /* 扩展多边形的长度 (像素) */
- /* 绘制放大后的多边形 */
- GUI_FillPolygon(aEnlargedPoints, GUI_COUNTOF(aPoints), 140, 110);
- }
- }
-
- void MainTask(void)
- {
- GUI_Init();
- Sample();
- while(1)
- {
- GUI_Delay(100);
- }
- }
复制代码显示效果如下:
10.1.2 例子二1. GUI_MagnifyPolygon() 按指定系数放大多边形。确保点的目标数组等于或大于源数组。请注意扩展和放大多边形之间的区别。调用函数GUI_EnlargePolygon()(参数Len= 1)将使多边形的所有边扩展1像素,而调用GUI_MagnifyPolygon()(参数Mag= 1)则没有效果。 下面是在模拟器上面实际运行的例子 - #include "GUI.h"
- const GUI_POINT aPoints[] = {
- { 0, 20},
- { 40, 20},
- { 20, 0}
- };
-
- GUI_POINT aMagnifiedPoints[GUI_COUNTOF(aPoints)];
-
- void Sample(void) {
- int Mag, y = 0, Count = 4;
- GUI_Clear();
- GUI_SetColor(GUI_GREEN);
- for (Mag = 1; Mag <= 4; Mag *= 2, Count /= 2) {
- int i, x = 0;
- GUI_MagnifyPolygon(aMagnifiedPoints, aPoints, GUI_COUNTOF(aPoints), Mag);
- for (i = Count; i > 0; i--, x += 40 * Mag) {
- GUI_FillPolygon(aMagnifiedPoints, GUI_COUNTOF(aPoints), x, y);
- }
- y += 20 * Mag;
- }
- }
- void MainTask(void)
- {
- GUI_Init();
- Sample();
- while(1)
- {
- GUI_Delay(100);
- }
- }
复制代码实际显示效果如下:
10.1.3 例子三 这个例子是官方提供的一个例子,具体文件如下:
显示效果如下:
|
在当前窗口中的指定位置绘制指定尺寸的圆的轮廓。此例程无法处理大于180的半径,因为它使用整数计算,否则将导致溢出。不过,对于大多数嵌入式应用程序而言,这不是问题,因为直径为360的圆比显示器还要大。