STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。
' i5 \6 D; t' w e: z
0 p& H/ |% U$ r$ y2 x' ^这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。 b: l4 f J* E5 T
& }, c: l) S" Q9 R
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。7 e5 g! N I) v! l+ o2 F! W
9 _9 ^) P6 ~$ g, N
3 M, n& j2 X) E1 `* }下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。
5 n4 g# g" D9 X' X, q3 s) a. W1 J y$ s2 E/ B, G
- #include "mbed.h", D9 b% m* ?5 S* a- {& U$ n4 P0 E
- #include "LCD_DISCO_F746NG.h"6 U# I1 G& i& H! Y% }
- #include "TS_DISCO_F746NG.h"4 h; j0 D, w: O; d, R9 q
1 _- \3 k4 F3 z$ [. _- f# J- #define ITERATION 1509 q! t) Q3 |( M: V+ T4 q+ {" Q
- #define BAILOUT 45 F. B' D9 a7 ~ D5 h9 o- u! q
& s, P, i7 s2 X2 t7 [4 G1 W" G- LCD_DISCO_F746NG lcd;
9 E& w6 p- Z; S( ~ - TS_DISCO_F746NG ts;' z8 W1 _9 ?0 k: g+ ~
- , m2 G; }( _' p' i
- : G+ \9 P) D* ?: T- f: |! ~
- uint16_t screen_width, screen_height;
, c- k( @+ e9 C9 d) p
4 O" b' M7 A) T( Q- uint16_t calcMandelBrot(double x, double y)
6 T( h* \- l+ C: R1 w - {& F3 ^7 x8 N% R; R5 f, q
- uint16_t i;( v0 A% p4 D9 Q: O7 U
- double xx, yy, tx, ty;4 U/ _5 I6 u; a. O5 `! M! W0 P N
- 7 P! ]& z0 \; e; \
- xx = yy = 0;/ b9 {+ K+ ` `- V, v! ~
- i = 0;. R: t( F! V3 p
- while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))
% [+ e+ y0 f8 b# ^$ Z" r& A - {
T: m* v) m; i' l3 Z5 w! \0 f8 P - tx = xx*xx - yy*yy + x;
! \) q% i3 r; T9 e; N* k) d - ty = 2*xx*yy + y; ~; h i: ?" j. x6 I' Y( |
- xx = tx;4 J3 ]5 N- D% W7 Y7 @
- yy = ty;
" t' ], R7 w$ X1 _ - i++;
9 R) Q( K0 J9 u5 L - }
O. c0 H5 K! q$ `' X( t - return i;
?" H; D8 z" W0 I) U$ V0 x, m - }' Z# A0 U! o" }, A# p
. F: U6 s9 b& k& W0 f7 \ u w) ?- void rectMandelBrot(double x1, double y1, double x2, double y2)
/ A) r& `. r2 K/ X& E; u+ q - {
, y) r: ~9 j* ?& \" K- O - double dx, dy;& u- c- ?% u: X
- uint16_t i, j;
* d( R( r; M3 O6 _& {8 x5 @7 ?6 o - uint32_t color;
; m; O. U! P/ S. ^! G. L8 X8 p9 Y - & w( N8 h+ n v9 `/ c0 J
- dx = (x2 - x1)/screen_width;/ Y3 C3 S, \3 ^0 T1 a* T! Y
- dy = (y2 - y1)/screen_height;
1 t$ U+ Q8 W9 \ - ' ?/ d T4 C2 I6 I8 j, @/ t
- for(i = 0; i < screen_width; i++)8 q; H' I1 @3 g( S
- {
' @% k0 P! t/ a/ R& }$ l0 ~ - for(j = 0; j < screen_height; j++)+ s: j+ J) O( F7 h! t! k( x- |0 y3 W
- {
1 I+ T" ]5 @& h - color = calcMandelBrot(x1 + dx*i, y1 + dy*j);' @5 n; F6 L! @1 V+ e, X
- lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));1 x' W1 ]$ l' ]" T
- }
4 s7 d9 _5 D" ^ - }$ i( ?) i1 I& t' q* v/ v- C. v8 ~
-
9 k- i+ c6 k+ E5 t8 W( `4 S! L) d1 M - }$ ~6 T+ }. _* {4 _% K) H1 m8 u" X
- a% R ?, Q, m5 z/ F, z$ Y- t- int main()
$ w8 l. ?9 f8 S9 W2 {: t - {: |) ?: N+ s1 b! p C
- lcd.Clear(LCD_COLOR_BLACK);
$ ^6 t+ z. _% A4 q - ( r2 |: s; M' m8 G. D/ Q
- screen_width = lcd.GetXSize() - 100;
' h2 W9 A- K8 I; ^: U/ i6 Z. j* c - screen_height = lcd.GetYSize();
0 f s- n+ r4 }5 o& y6 x7 `) p) |% i - ! Q: ^) R2 F1 v$ l
- rectMandelBrot(-2.5, -2, 2.5, 2);, |: O/ j' d, M! d9 Y. W
-
. v$ u+ F4 P% e: h: U$ O4 M. f; W - while(1)
4 m$ p* {: G4 e- V$ s1 a* E - {
& z: L0 T: J8 {( ` - }7 d9 @' k% L4 w1 m$ l) W
- }
复制代码 % ^( z) z2 B: P8 S9 v% J7 M8 y2 l
fract.zip
(1.33 MB, 下载次数: 42)
|
mbed好处是简单,缺点是占用空间较大。