STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。
- z2 b5 I7 [4 {- m
4 q" i {: I' b ?这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。3 V q' u( }8 A) p8 x2 K, N
! K% R1 I- |8 i3 a& N; u E
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。
$ [# _: h% C6 o! @- }
- c, y% y9 e0 s+ x6 u# R
* G* D# W4 ~2 Q7 Z下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。
" I8 O# O) Z( e7 R7 F# S1 s8 B5 f7 Q: b% B* s, [
- #include "mbed.h"
% k* T9 e. z4 I - #include "LCD_DISCO_F746NG.h"
1 k2 k) n) S/ U; m* { - #include "TS_DISCO_F746NG.h"2 g9 _/ s1 n0 r0 H S1 O1 j
% D0 ^; M8 v" @. i$ v; l- #define ITERATION 150
, y$ ^ ~" R* A( ~1 _ - #define BAILOUT 4
" U- o5 O! n& F; [2 x; n% m
( L( q) l2 }7 M; Z- LCD_DISCO_F746NG lcd;
4 j+ c, y2 {" L* [1 t - TS_DISCO_F746NG ts;! V6 ~' s; w" T; L5 \1 z$ {
- * j- u: W' q; @" [9 ^8 I7 O
6 Z: O% z; E; m! m( d- uint16_t screen_width, screen_height;
; y9 v5 {# G, u: l v
* @5 x( [3 T4 t9 q m- uint16_t calcMandelBrot(double x, double y)
}$ u# W6 c' b' b7 w# G5 C - {
/ l; a: n: B' D* r) e. w8 U. R, h - uint16_t i; ?1 D% J a: T5 y
- double xx, yy, tx, ty;
' V: W" ]2 P9 d" {3 N) P3 a - & a2 q+ [* O/ M+ h
- xx = yy = 0;9 H7 i8 N4 n, }5 M
- i = 0;7 s+ Y9 _, L' B6 B
- while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT)) S( {0 e3 q9 M: G. E
- {
! h- J+ E% |1 w0 X7 a) c" M+ o - tx = xx*xx - yy*yy + x;. a- X) M" P9 i
- ty = 2*xx*yy + y;
V! u* ]0 D) Y - xx = tx;4 w' h2 t: g4 [, d- Z6 r
- yy = ty;! |( x& j* w3 o) E) O7 w l9 z
- i++;
0 L) n" y9 Y7 Y% i9 S0 T - } i1 P$ C7 Q% J
- return i; n- V5 m9 R4 f/ A: F/ T/ g% |: ?' e
- }
2 B- c( m$ _& O - * b$ A, P) A8 H5 |# K
- void rectMandelBrot(double x1, double y1, double x2, double y2)
7 w$ U: A: C7 g+ N: M7 h - {7 [) ]3 f- q# B, E
- double dx, dy;
8 [* [* E3 E& o6 d( `8 d - uint16_t i, j;8 R9 x2 `. _) F6 P( R" j' Z
- uint32_t color;3 Q/ I; j: x' I: ]
-
( ^, N4 P8 |, h# a - dx = (x2 - x1)/screen_width;
+ r1 q8 N# Y% a' I - dy = (y2 - y1)/screen_height;
. ~+ {1 j8 Y0 }: m8 M: P -
& x* D" r. S5 T% L# ] - for(i = 0; i < screen_width; i++)
" i b8 h; U/ Y9 E, q - {! _" b6 ~9 t$ U3 [. u. ~4 w4 R' y4 R
- for(j = 0; j < screen_height; j++)! T5 ]0 K3 x% @) J; o
- {/ K' b0 h+ k$ d" c1 E) [9 L
- color = calcMandelBrot(x1 + dx*i, y1 + dy*j);
9 Z. i. j* A) i - lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));. s+ V I8 M, ^; C9 I& @, {" _
- }
2 q- S' K! U" H. B5 J& i - }9 Y1 |: S: ]9 b3 G5 K: U
-
, o/ e2 A C: V# Q# g0 N! s - }; @4 Y/ O& Q! Q
- X `6 X0 r, p' O- \- int main()
: J/ U3 L. W9 p6 e - {
7 [/ J- V! N, E- V( d7 V) `, y1 o - lcd.Clear(LCD_COLOR_BLACK);
0 G. r4 m* Q+ w7 H$ M7 T8 k# k- y) m' Y
, _5 Q" m& ~4 ~/ T: z1 a _) N- screen_width = lcd.GetXSize() - 100;
$ P0 N" I" ~# h4 n+ j, { - screen_height = lcd.GetYSize();
' P% `- |8 [! x9 |
1 d- I3 F' Z9 |1 @- rectMandelBrot(-2.5, -2, 2.5, 2);6 s+ @4 H& x g" ^- a" D- J% M9 C
- " K. U$ R6 }7 f0 m
- while(1)
8 Y* Z3 J' h- @* o7 s& l( r - {( t, k4 f, t1 _) w% _' F( u4 x! ^
- }
6 f% R- _7 ^4 D! l8 _+ Z' S6 ` - }
复制代码 7 i0 b& i, n: X$ h* _2 I6 J
fract.zip
(1.33 MB, 下载次数: 42)
|
mbed好处是简单,缺点是占用空间较大。