STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。# B3 d( } C9 L+ U2 N& T/ ]
; e- O) I) }- K9 n4 M# |# r
这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。
# N" S3 B2 _2 q( u. _6 h% X7 U7 J& W2 g; O s) ~
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。$ r) K' D- ^& ^6 E1 I
8 B. w. s9 E, S3 y1 `- m# F
: T& p1 H9 @9 W) g* t
下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。* q0 W) R& K; z$ [9 Z
3 }# ~' T, |4 ^* o9 k# v9 [- #include "mbed.h"% v1 _7 A; v5 a7 S: V+ N1 {; J+ p
- #include "LCD_DISCO_F746NG.h"+ \8 I' v+ B% p$ M" S& r9 z
- #include "TS_DISCO_F746NG.h"2 \& c* M( B; [
- * w8 @3 T3 v6 m8 Q; [) W* }4 o
- #define ITERATION 150- B$ p% x# D6 R, g0 i! ?! h/ X: }
- #define BAILOUT 4
' u- a/ N' H* y, }; L( D - 2 Y: q+ [/ y5 t, `9 {+ E; n
- LCD_DISCO_F746NG lcd; n& ^" k( i/ S6 K8 S3 C7 a
- TS_DISCO_F746NG ts;
1 k& [3 e) `4 h m2 I& d# S
. m/ m2 w1 e# B9 j$ Q
- p2 o+ `/ \( k" s- uint16_t screen_width, screen_height;! v3 v2 b' O& G$ m8 n
) Q* W+ C7 _$ k, U9 @" [: |4 Q- uint16_t calcMandelBrot(double x, double y)
# t1 k( T' b& z* [2 r4 b9 w; w - {
. ~$ A% b: t, s3 d8 k. T- { - uint16_t i;
+ ~/ N' e! R$ S/ m. |+ K2 h - double xx, yy, tx, ty;2 R N* V+ T% {$ Y9 o
- $ V' j* L8 m* |& b
- xx = yy = 0;0 \& H/ e5 C( `8 d9 ^
- i = 0;
) E+ Z4 [. X( {; h - while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))& Z7 C2 P) p& N9 s9 @4 ?
- {% u% c; o1 M# J: B* D! J
- tx = xx*xx - yy*yy + x;
# Q7 N% x2 R8 v) J4 c9 c - ty = 2*xx*yy + y;( F4 s: J C: f/ \3 Z3 ?" n# m4 k
- xx = tx;: h" q2 l) F5 D; U. w, ^
- yy = ty;* Y/ O9 X& @1 K: t/ H- X
- i++;
( Z5 \& n0 C$ e& K. J ^5 c9 b - }7 ^- Q, C* R! u
- return i;& V/ B2 p7 u% V' A3 _
- }* L% r# `. D9 L1 `, G
- 7 f* c0 N$ j6 Q# G
- void rectMandelBrot(double x1, double y1, double x2, double y2)
* J7 h3 A, k! g - {
A: U3 f8 _: \$ f - double dx, dy;
( r! P& @7 f5 I. K7 C) c - uint16_t i, j;1 `. { `' s9 _8 P1 r! s+ _
- uint32_t color;
' E8 k S: X- M: e - - n6 V3 w* b; t
- dx = (x2 - x1)/screen_width;0 l. D2 U2 z; R o
- dy = (y2 - y1)/screen_height;1 Q2 k% _6 V1 A5 T
-
# J- u6 F$ ~: x' ^. ?( @- C. |, R: w - for(i = 0; i < screen_width; i++)% p p3 J8 Y1 r# e; I2 a
- {7 W5 i3 M: Y. \
- for(j = 0; j < screen_height; j++)
% Q. D5 |- R* C - {- K* i" d/ t9 v3 n" l+ z
- color = calcMandelBrot(x1 + dx*i, y1 + dy*j);
; |4 q, ?' g1 U2 ~/ u( }, G - lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));
: V5 F1 z+ q- a9 |7 d. } - }
0 F) P0 @# A! P - }2 w7 k O6 B6 R0 B6 h" ]
-
/ i8 V$ ~! }5 P - }
8 ^& i* T9 `- l4 [' S. `3 v& o
# @. e% U4 v$ z a- int main()* H. ^4 j# z7 F2 A7 s+ y
- {
7 O$ t& }" D) o0 n - lcd.Clear(LCD_COLOR_BLACK);
) h) R* Q% e* D: H W* W2 \4 D - % ]* J8 ^7 `7 P' l0 I( x# q
- screen_width = lcd.GetXSize() - 100;( @1 T8 W3 J% V9 a* q8 ^) ^" k
- screen_height = lcd.GetYSize();# y5 `8 Z/ b: b, w$ v2 x5 Y a
- ( O. ]9 i' _8 Z3 v6 Y
- rectMandelBrot(-2.5, -2, 2.5, 2);4 G* [$ P0 b! L
- * ~5 K% T" v1 f
- while(1)8 }" a; A$ H+ i2 Q% l) H4 s' ~) M( h
- {
1 H) V2 j* ]' C4 V! @ - }% k g3 W( z, L8 r+ W
- }
复制代码
2 `- z) d7 I" N- \4 ~0 A1 v
fract.zip
(1.33 MB, 下载次数: 42)
|
mbed好处是简单,缺点是占用空间较大。