硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4062|回复: 2
收起左侧

[emWin教程入门篇] 【STemWin教程】第10章 2-D图形库之绘制图形

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2015-1-12 11:31:40 | 显示全部楼层 |阅读模式
特别说明:完整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.png

10.1.1      例子一
1.    GUI_DrawPolygon()
    在当前窗口中绘制按点列表定义的多边形的轮廓,通过将终点连接到起点,绘制的多边形将自动闭合。
2.    GUI_EnlargePolygon()
    按指定的长度 (像素)全方位扩展多边形,确保点的目标数组等于或大于源数组。
3.    GUI_FillPolygon()
    在当前窗口中绘制按点列表定义的填充的多边形,通过将终点连接到起点,绘制的多边形将自动闭合。终点无需接触到多边形的轮廓。通过为多边形的各个y位置绘制一条或多条水平直线,可对多边形进行渲染。默认情况下,为一个y位置绘制水平直线使用的最大点数量为12(意味着每个y位置需要6条直线)。如果需要增加此值,可使用宏GUI_FP_MAXCOUNT设置最大点数量。
    下面是在模拟器上面实际运行的例子
  1. #include "GUI.h"
  2. /* 图形的原始坐标点 */
  3. const GUI_POINT aPoints[] = {
  4. { 40, 20},
  5. { 0, 20},
  6. { 20, 0}
  7. };
  8. /* 用于存储放大后的坐标点 */
  9. GUI_POINT aEnlargedPoints[GUI_COUNTOF(aPoints)];
  10. void Sample(void) {
  11.     int i;
  12.     GUI_Clear();
  13.     /* 设置绘图模式 */
  14.     GUI_SetDrawMode(GUI_DM_XOR);
  15.     /* 绘制多边形 */
  16.     GUI_FillPolygon(aPoints,              /* 指向要显示和填充的多边形 */
  17.                     GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
  18.                     140,                  /* 原点的X位置 */
  19.                     110);                 /* 原点的Y位置 */
  20.     for (i = 1; i < 10; i++) {
  21.         GUI_EnlargePolygon(aEnlargedPoints,                      /* 指向目标多边形 */
  22.                                            aPoints,              /* 指向源多边形 */
  23.                                            GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
  24.                                             i * 5);              /* 扩展多边形的长度 (像素) */
  25.         /* 绘制放大后的多边形 */
  26.         GUI_FillPolygon(aEnlargedPoints, GUI_COUNTOF(aPoints), 140, 110);
  27.     }
  28. }
  29. void MainTask(void)
  30. {
  31.     GUI_Init();
  32.     Sample();
  33.     while(1)
  34.     {
  35.         GUI_Delay(100);
  36.     }
  37. }
复制代码
显示效果如下:

10.2.png
10.1.2      例子二
1.    GUI_MagnifyPolygon()
    按指定系数放大多边形。确保点的目标数组等于或大于源数组。请注意扩展和放大多边形之间的区别。调用函数GUI_EnlargePolygon()(参数Len= 1)将使多边形的所有边扩展1像素,而调用GUI_MagnifyPolygon()(参数Mag= 1)则没有效果。
    下面是在模拟器上面实际运行的例子
  1. #include "GUI.h"
  2. const GUI_POINT aPoints[] = {
  3. { 0, 20},
  4. { 40, 20},
  5. { 20, 0}
  6. };
  7. GUI_POINT aMagnifiedPoints[GUI_COUNTOF(aPoints)];
  8. void Sample(void) {
  9.     int Mag, y = 0, Count = 4;
  10.     GUI_Clear();
  11.     GUI_SetColor(GUI_GREEN);
  12.     for (Mag = 1; Mag <= 4; Mag *= 2, Count /= 2) {
  13.         int i, x = 0;
  14.         GUI_MagnifyPolygon(aMagnifiedPoints, aPoints, GUI_COUNTOF(aPoints), Mag);
  15.         for (i = Count; i > 0; i--, x += 40 * Mag) {
  16.             GUI_FillPolygon(aMagnifiedPoints, GUI_COUNTOF(aPoints), x, y);
  17.         }
  18.         y += 20 * Mag;
  19.     }
  20. }
  21. void MainTask(void)
  22. {
  23.     GUI_Init();
  24.     Sample();
  25.     while(1)
  26.     {
  27.         GUI_Delay(100);
  28.     }
  29. }
复制代码
实际显示效果如下:

10.3.png
10.1.3      例子三
    这个例子是官方提供的一个例子,具体文件如下:
10.4.jpg


    显示效果如下:
10.5.png

10.6.png

10.7.png

10.2  绘制圆
1.    GUI_DrawCircle()
    在当前窗口中的指定位置绘制指定尺寸的圆的轮廓。此例程无法处理大于180的半径,因为它使用整数计算,否则将导致溢出。不过,对于大多数嵌入式应用程序而言,这不是问题,因为直径为360的圆比显示器还要大。

    下面是在模拟器上面实际运行的例子
  1. #include "GUI.h"
  2. void ShowCircles(void)
  3. {
  4.     int i;
  5.     for (i=10; i<50; i += 3)
  6.     GUI_DrawCircle(120, 60, i);
  7. }
  8. void MainTask(void)
  9. {
  10.     GUI_Init();
  11.     ShowCircles();
  12.     while(1)
  13.     {
  14.         GUI_Delay(100);
  15.     }
  16. }
复制代码
实际显示效果如下:
10.8.png


10.3  绘制椭圆
1.    GUI_DrawEllipse()
    在当前窗口中的指定位置绘制指定尺寸的椭圆的轮廓。
    此例程无法处理大于180的rx/ry参数,因为它使用整数计算,否则将导致溢出。
2.    GUI_FillEllipse()
    在当前窗口中的指定位置绘制指定尺寸的填充的椭圆。此例程无法处理大于180的rx/ry参数。
    下面是在模拟器上面实际运行的例子
  1. #include "GUI.h"
  2. void MainTask(void)
  3. {
  4.     GUI_Init();   
  5.     GUI_SetColor(0xff);  
  6.     GUI_FillEllipse(100, 150, 50, 70);
  7.     GUI_SetColor(0x0);   
  8.     GUI_DrawEllipse(100, 150, 50, 70);
  9.     GUI_SetColor(0x000000);   
  10.     GUI_FillEllipse(100, 150, 10, 50);
  11.     while(1)   
  12.     {
  13.         GUI_Delay(100);   
  14.     }
  15. }
复制代码
实际现象效果如下:

10.9.png
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
 楼主| 发表于 2015-1-12 11:31:56 | 显示全部楼层
10.4  绘制弧线
1.     GUI_DrawArc()
在当前窗口中的指定位置绘制指定尺寸的弧线。弧线是圆轮廓的一部分。当前未使用ry参数,而使用rx参数代替。GUI_DrawArc()使用浮点库。它无法处理大于180的rx/ry参数,因为它使用整数计算,否则将导致溢出。
下面是在模拟器上面实际运行的例子
  1. [size=3]#include "GUI.h"[/size]
  2. [size=3]#include "math.h"[/size]
  3. [size=3]#include "stdio.h"[/size]
  4. [size=3]void DrawArcScale(void)[/size]
  5. [size=3]{[/size]
  6. [size=3]int x0 = 160;[/size]
  7. [size=3]int y0 = 180;[/size]
  8. [size=3]int i;[/size]
  9. [size=3]char ac[4];[/size]
  10. [size=3]GUI_SetBkColor(GUI_WHITE);[/size]
  11. [size=3]GUI_Clear();[/size]
  12. [size=3]GUI_SetPenSize( 5 );[/size]
  13. [size=3]GUI_SetTextMode(GUI_TM_TRANS);[/size]
  14. [size=3]GUI_SetFont(&GUI_FontComic18B_ASCII);[/size]
  15. [size=3]GUI_SetColor(GUI_BLACK);[/size]
  16. [size=3]GUI_DrawArc( x0,y0,150, 150,-30, 210 );[/size]
  17. [size=3]GUI_Delay(1000);[/size]
  18. [size=3]for (i=0; i<= 23; i++) {[/size]
  19. [size=3]float a = (-30+i*10)*3.1415926/180;[/size]
  20. [size=3]int x = -141*cos(a)+x0;[/size]
  21. [size=3]int y = -141*sin(a)+y0;[/size]
  22. [size=3]if (i%2 == 0)[/size]
  23. [size=3]GUI_SetPenSize( 5 );[/size]
  24. [size=3]else[/size]
  25. [size=3]GUI_SetPenSize( 4 );[/size]
  26. [size=3]GUI_DrawPoint(x,y);[/size]
  27. [size=3]if (i%2 == 0) {[/size]
  28. [size=3]x = -123*cos(a)+x0;[/size]
  29. [size=3]y = -130*sin(a)+y0;[/size]
  30. [size=3]sprintf(ac, "%d", 10*i);[/size]
  31. [size=3]GUI_SetTextAlign(GUI_TA_VCENTER);[/size]
  32. [size=3]GUI_DispStringHCenterAt(ac,x,y);[/size]
  33. [size=3]}[/size]
  34. [size=3]}[/size]
  35. [size=3]}[/size]
  36. [size=3]void MainTask(void)[/size]
  37. [size=3]{[/size]
  38. [size=3]GUI_Init();[/size]
  39. [size=3]DrawArcScale();[/size]
  40. [size=3]while(1)[/size]
  41. [size=3]{[/size]
  42. [size=3]GUI_Delay(100);[/size]
  43. [size=3]}[/size]
  44. [size=3]}[/size]
复制代码

实际显示效果如下:
10.10.png


10.5  绘制曲线
这个比较有代表意义,后面会单独的开一期专门的将这个函数,现在只是提供一个基本的例子。
1.     GUI_DrawGraph()
该函数首先设置到使用x0、y0和给定数组的第一个Y值所指定位置的直线光标。然后,将开始绘制到x0 + 1、y0 + *(paY + 1)、x0 + 2、y0 + *(paY + 2)等位置的线
下面是在模拟器上面实际运行的例子
  1. [size=3]#include "GUI.h"[/size]
  2. [size=3]#include <stdlib.h>[/size]
  3. [size=3]I16 aY[100];[/size]
  4. [size=3]void MainTask(void)[/size]
  5. [size=3]{[/size]
  6. [size=3]int i;[/size]
  7. [size=3]GUI_Init();[/size]
  8. [size=3]for (i = 0; i < GUI_COUNTOF(aY); i++)[/size]
  9. [size=3]{[/size]
  10. [size=3]aY[i] = rand() % 50;[/size]
  11. [size=3]}[/size]
  12. [size=3]GUI_DrawGraph(aY, GUI_COUNTOF(aY), 0, 0);[/size]
  13. [size=3]while(1)[/size]
  14. [size=3]{[/size]
  15. [size=3]GUI_Delay(100);[/size]
  16. [size=3]}[/size]
  17. [size=3]}[/size]
复制代码

实际显示效果如下:
10.11.png


10.6  绘制饼图
1.     GUI_DrawPie()
绘制圆形扇区。
下面是在模拟器上面实际运行的例子
  1. [size=3]#include "GUI.h"[/size]
  2. [size=3]int i, a0, a1;[/size]
  3. [size=3]const unsigned aValues[] = { 100, 135, 190, 240, 340, 360};[/size]
  4. [size=3]const GUI_COLOR aColors[] = { GUI_BLUE, GUI_GREEN, GUI_RED,[/size]
  5. [size=3]GUI_CYAN, GUI_MAGENTA, GUI_YELLOW };[/size]
  6. [size=3]void MainTask(void)[/size]
  7. [size=3]{[/size]
  8. [size=3]GUI_Init();[/size]
  9. [size=3]for (i = 0; i < GUI_COUNTOF(aValues); i++) {[/size]
  10. [size=3]a0 = (i == 0) ?0 :aValues[i - 1];[/size]
  11. [size=3]a1 = aValues[i];[/size]
  12. [size=3]GUI_SetColor(aColors[i]);[/size]
  13. [size=3]GUI_DrawPie(100, 100, 50, a0, a1, 0);[/size]
  14. [size=3]}[/size]
  15. [size=3]while(1)[/size]
  16. [size=3]{[/size]
  17. [size=3]GUI_Delay(100);[/size]
  18. [size=3]}[/size]
  19. [size=3]}[/size]
复制代码

实际显示效果如下:
10.12.png


10.7  实验总结
关于2-D图形库的绘图部分就跟大家讲这么多,还是那句话,多多练习,熟能生巧。
努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

0

主题

19

回帖

0

积分

新手上路

积分
0
QQ
发表于 2016-10-15 17:15:38 | 显示全部楼层
[s:138]  [s:138]  [s:138]  [s:138]  [s:138]  [s:138]  [s:138]  [s:138]  [s:138]  [s:138]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-6-10 11:32 , Processed in 0.219590 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表