特别说明:完整STemWin的1-60期教程和配套实例下载地址:链接1 s j) g8 y4 }! W7 W A
第10章 2-D图形库之绘制图形 ! y) J& F9 m8 W+ C/ ?; d/ v5 k
本期主要讲解2-D图形库的图形绘制,包括绘制多边形,绘制圆,绘制椭圆,绘制弧线,绘制线图,绘制饼图。本期的例子不用在开发板上面做调试,直接用emWin5.24的模拟器即可。 10. 1 绘制多边形 10. 2 绘制圆 10. 3 绘制椭圆 10. 4 绘制弧线 10. 5 绘制线图 10. 6 绘制饼图
/ f" s) j& N6 o7 L10.1 绘制多边形 多边形的绘制主要有以下几个函数: 1 j4 V- ?2 A8 M2 }2 L
10.1.1 例子一1. GUI_DrawPolygon(): 在当前窗口中绘制按点列表定义的多边形的轮廓,通过将终点连接到起点,绘制的多边形将自动闭合。 2. GUI_EnlargePolygon(): 按指定的长度 (像素)全方位扩展多边形,确保点的目标数组等于或大于源数组。 3. GUI_FillPolygon() 在当前窗口中绘制按点列表定义的填充的多边形,通过将终点连接到起点,绘制的多边形将自动闭合。终点无需接触到多边形的轮廓。通过为多边形的各个y位置绘制一条或多条水平直线,可对多边形进行渲染。默认情况下,为一个y位置绘制水平直线使用的最大点数量为12(意味着每个y位置需要6条直线)。如果需要增加此值,可使用宏GUI_FP_MAXCOUNT设置最大点数量。 下面是在模拟器上面实际运行的例子 - #include "GUI.h"
3 N# _% C: X X+ Q7 X -
: b* j0 b; W, o! V - /* 图形的原始坐标点 */
1 P. S3 H6 \- `4 y0 A! L- S; \ - const GUI_POINT aPoints[] = {
T0 E0 Y" v& H0 F - { 40, 20},8 I+ S& T! f6 |) h2 I' I
- { 0, 20},0 q9 d, {$ z0 _- I1 l
- { 20, 0}
8 [/ @" b- \' R - };) I# W o2 C5 g4 X% r4 P) v
- 9 M; I) T6 ^8 A! n4 l$ ?0 g
- /* 用于存储放大后的坐标点 */
, N" k; W: j) A - GUI_POINT aEnlargedPoints[GUI_COUNTOF(aPoints)];2 M% s" Z; B- _6 b. Z
- - o. S5 u5 G+ y2 C% D8 u g
- void Sample(void) {
7 c# d) D9 _/ J) F0 J8 h& K: | - int i;
; F. L. J, v: ?6 G& B - GUI_Clear();
9 D% t3 h9 ]$ k1 v: e - /* 设置绘图模式 */
% {' J/ w7 g0 @* M* B/ W% ^3 G" n4 q! } - GUI_SetDrawMode(GUI_DM_XOR);
! N+ i: ]9 w- @+ P# |& _8 G - /* 绘制多边形 */, l/ z! M, y1 d' Y4 S( V0 m
- GUI_FillPolygon(aPoints, /* 指向要显示和填充的多边形 */- a5 r& q3 f) M* ~/ n
- GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
2 c) }9 b' W! z* w- R# y1 ^ - 140, /* 原点的X位置 */
7 n$ B7 T0 n. W' D& q - 110); /* 原点的Y位置 */- u8 }7 P5 @) | g9 o; r
-
& {& }/ G, C; c& h" j1 o) m - for (i = 1; i < 10; i++) {+ d3 Z4 P) Y+ c+ y# E% z9 I
- GUI_EnlargePolygon(aEnlargedPoints, /* 指向目标多边形 */
7 T+ f X j4 r$ d; P: L - aPoints, /* 指向源多边形 */
7 o, f8 h9 ^' ]& O: G" x8 D1 ^0 u - GUI_COUNTOF(aPoints), /* 点列表中指定的点数量 */
! |( [( K9 {7 m+ f0 J" @ - i * 5); /* 扩展多边形的长度 (像素) */* a3 {1 z8 B* j
- /* 绘制放大后的多边形 */
, C- I* L& T! x3 V: ] - GUI_FillPolygon(aEnlargedPoints, GUI_COUNTOF(aPoints), 140, 110);
+ F2 v! e8 y/ _8 S* P7 P - }; n# z: n' p# O2 a/ p
- }: t* b, W; h# m1 O
-
- I+ ~; a" N: c - void MainTask(void)2 Z4 V! g9 d) y s% X6 e
- {
0 M! B: X' g' J$ A/ r& { - GUI_Init();
: {$ J, F$ K+ o - Sample();6 h9 A Y# `" L, K1 a2 `; }! L
- while(1)1 O, e, {* H4 t; U* M
- {
4 I$ F& Z& V( u$ q - GUI_Delay(100);
- K" `" T( R% V/ g- }( X$ W: Z$ @ - }
% e" B& ^- v, q: F( b# V! y2 j& p - }
复制代码显示效果如下: , K/ b L- V9 V' {: k! ~4 y; _' h% h" E( c
10.1.2 例子二1. GUI_MagnifyPolygon() 按指定系数放大多边形。确保点的目标数组等于或大于源数组。请注意扩展和放大多边形之间的区别。调用函数GUI_EnlargePolygon()(参数Len= 1)将使多边形的所有边扩展1像素,而调用GUI_MagnifyPolygon()(参数Mag= 1)则没有效果。 下面是在模拟器上面实际运行的例子 - #include "GUI.h"
! x8 `3 D) F. L, n - const GUI_POINT aPoints[] = {$ u5 t- ^ c1 O% h$ a: h3 I( |: V
- { 0, 20},
{: |1 F/ t% i$ V" J1 ]4 ?7 R - { 40, 20},
( t. J/ o) p- ~ - { 20, 0}
2 ?* c1 u" k. u5 ^1 |0 | E/ ^& {$ c - };
' o5 j* y& I( A/ I. W. B -
: d# p: S" f5 s0 y) M - GUI_POINT aMagnifiedPoints[GUI_COUNTOF(aPoints)];
0 [8 l6 A5 C" _4 \6 B' I" \ -
3 U4 Z3 ~, k8 S+ }" K ~ ? - void Sample(void) {
6 \" N/ F+ m3 w$ _( w: b; ]: q - int Mag, y = 0, Count = 4;
" w* w$ f% o/ p% U! D$ S$ J( h" F - GUI_Clear();6 f/ O& b% s" k" H( M- m5 U0 R- \
- GUI_SetColor(GUI_GREEN);
; d0 j0 a9 A- P" G7 Q3 x. w e/ K - for (Mag = 1; Mag <= 4; Mag *= 2, Count /= 2) {
" P! h3 X( L# c) T - int i, x = 0;
$ Y' D9 [5 c. e% O* F - GUI_MagnifyPolygon(aMagnifiedPoints, aPoints, GUI_COUNTOF(aPoints), Mag);. v$ [, e( {0 J) \; P
- for (i = Count; i > 0; i--, x += 40 * Mag) {
5 D. D. J- |1 A - GUI_FillPolygon(aMagnifiedPoints, GUI_COUNTOF(aPoints), x, y);
) j! F$ F' G+ c, k - }# x q( r3 B I+ p2 g6 F0 ]* F5 j% ]
- y += 20 * Mag;
' o- H, @2 h4 d1 |' q, } - }
! f \2 x) K8 d( v1 p3 @( { - }0 a" q; C+ @9 X0 g
- void MainTask(void)& ~( i. Z( M8 Y; z$ b
- {; S. E4 n* P; i
- GUI_Init();4 c( e% R# ]1 f7 t3 F/ a
- Sample();) y" a6 L3 g- B0 j; C. s" d# e- G
- while(1)/ i7 W4 R7 u: J
- {
X7 ~" U$ o! y- H- i% g7 { - GUI_Delay(100);
: x) m! _0 z* \4 R% ?" H - }
' o# g# s$ X& p8 j; t( Z - }
复制代码实际显示效果如下: # Z/ M z$ L- t0 P: j8 b7 ^8 P4 M
10.1.3 例子三 这个例子是官方提供的一个例子,具体文件如下:
7 a: S$ v4 W5 I3 Y显示效果如下:
9 F! g! c$ y. G& I
5 I# i2 ]- h0 y; g8 a2 s: o# l8 s
/ z9 n( e+ |5 P v7 C
|
在当前窗口中的指定位置绘制指定尺寸的圆的轮廓。此例程无法处理大于180的半径,因为它使用整数计算,否则将导致溢出。不过,对于大多数嵌入式应用程序而言,这不是问题,因为直径为360的圆比显示器还要大。