STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。
/ v' ]" {, f6 L1 x' c/ N# F7 H+ x) @0 B3 c) }. N
这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。+ Z# X7 l$ n0 D; q( w' ?3 ^) Y
# C9 f. W- n0 h/ |6 q
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。
# n2 H: M X5 W; J; D1 ?
) Y0 v) t" z2 v
8 a8 h- M( q$ T, D0 [4 v0 n
下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。$ i+ U0 v, p& o1 V' {+ F" q
; s' c+ O4 q" ~8 s- #include "mbed.h"- Q$ \7 X3 ~+ p2 m p$ s
- #include "LCD_DISCO_F746NG.h"" |( T9 A9 N/ k9 F9 \
- #include "TS_DISCO_F746NG.h", b* l4 `2 V2 s& m' V1 d# Q4 Q
- . I( N, r K. G
- #define ITERATION 150
; N$ m S: p3 Q& Z7 `0 v& W- P - #define BAILOUT 4
9 b; B2 \) r& \, W/ }' f( t- @9 H
+ f% J, T# c5 X. q* A3 s: b$ m- LCD_DISCO_F746NG lcd;0 d4 @& @3 p' d# _" S6 C
- TS_DISCO_F746NG ts;' G4 H$ |9 R/ M+ Y. Y0 x3 X
; O2 }/ @7 q; \8 F" K# t- ^
- d3 t1 p( k* h9 v- uint16_t screen_width, screen_height;
) F; y0 A( @ \% _" z! F - 0 ^0 i" {7 T$ M& o0 Z. T1 @5 C; @
- uint16_t calcMandelBrot(double x, double y)' `' C2 F( \2 N" i1 l/ I% q
- {3 y: x4 P$ x* c7 a
- uint16_t i;
3 x3 o9 R/ J4 J' C, e$ J. L' r/ r, } - double xx, yy, tx, ty;
# G3 l: u) m: a; {: q: W -
$ p" e$ Y& v1 w. G" z* m1 G - xx = yy = 0;
6 l7 V6 N h4 ~; w* R - i = 0;+ f) k1 f: j- ~5 K
- while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))% i. e! j: Z0 C. o f7 _# t* p
- {+ Y8 m4 h6 j- b3 z
- tx = xx*xx - yy*yy + x;
, G2 |9 |' W X; ^2 r7 e - ty = 2*xx*yy + y;7 A) v: b" b* u( j- b4 x
- xx = tx;+ F5 I( O `$ M4 i# h8 e, D; k" G
- yy = ty;
. {8 o s8 o! T2 u - i++;
' C, e- o# t& F, i. X ? - }
% ^2 `( ~. W9 d; R9 h2 R4 l. v c - return i;
/ |5 A7 C3 _! r5 S; k Q6 y - }$ N! Z+ M2 R. y! G9 B1 i( y! A
9 C6 {( Q: ]5 |* d- void rectMandelBrot(double x1, double y1, double x2, double y2)
5 y: p+ c O) K* m6 p - {
. o0 A! o2 v4 e: l9 j - double dx, dy;
$ h1 B: }/ l6 V: i& A. U9 E/ J8 p - uint16_t i, j;' v; R+ H+ X4 _9 s
- uint32_t color;* M/ R' ?, o+ _1 I0 ?. W1 x8 A' K$ m0 }
-
+ @: d8 p; |7 }, g% m4 S - dx = (x2 - x1)/screen_width;
) g8 @' f: b1 t3 K" g! \ - dy = (y2 - y1)/screen_height;
5 A* g: s' v6 V9 L - ' s) y: t6 O) u8 o1 |( R
- for(i = 0; i < screen_width; i++)
+ e: g5 J9 c4 \4 d - {/ Q+ X- X! B" A/ A
- for(j = 0; j < screen_height; j++)) c3 i/ Y3 P3 I
- {
6 r d% E, e( D- l6 T; v1 ^ - color = calcMandelBrot(x1 + dx*i, y1 + dy*j); ?5 [0 m# M- V) v) _( @' U d
- lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));+ p5 V# P3 K. M0 a/ L4 V- f
- }1 Y! ?: n* r+ l# l3 t
- }
, O6 D7 M! [; r; d -
/ k# ~4 O1 ^4 C4 x - }2 w& R( p1 ?6 o9 x
h9 T! S4 K+ J& n" M- int main(); x# o0 t9 g R+ X2 {' H' x
- {6 X9 Y& G5 I/ i, C+ p
- lcd.Clear(LCD_COLOR_BLACK);
0 I7 {( _9 o( g0 m
" x; s+ }) d) u( O. V1 H- screen_width = lcd.GetXSize() - 100;1 Z5 k: i0 s+ W4 X3 j7 ?! g& y. }
- screen_height = lcd.GetYSize();- W6 e- W2 G# j( T% P7 M/ d/ p$ V# j
- w, \. s. [& b* ~% @* ?& ^
- rectMandelBrot(-2.5, -2, 2.5, 2);8 F! v% \0 U+ P* t# U J; S
- " I, R% c" P9 i# H
- while(1)
7 _# P, E. x% {; v* l7 Z - {
1 {3 `1 x2 \7 j$ B; H* M - }. A5 M. m2 n3 q% D, f' r" O" P
- }
复制代码
+ E6 P$ R- f0 N
fract.zip
(1.33 MB, 下载次数: 42)
|
mbed好处是简单,缺点是占用空间较大。