STM32F746DISC开发板上有一个很大的液晶屏,可以显示各种图像。下面展示了用开发板显示奇妙的分形图形。. d, e: C% T5 T4 b$ j" c! w8 V
/ M- R, f- v8 c3 @4 X5 X
这里不介绍分形的理论了,大家可以网上搜索看看,它的计算公式是 Z = Z*Z + C,反复迭代计算,根据发散速度标明各点的颜色。" B2 \# |8 Z. j8 E. h7 R
0 Q% s( K5 M8 O
先看看实际效果,手机拍出来有些条纹,实际是没有的,液晶屏上显示的效果其实还不错。4 J7 ^. y* R3 A/ }
) o$ H# v$ D. e/ {! O! |- o4 c
4 V# q; Y8 A0 l7 h6 _1 ^6 @# R下面是的程序代码。目前只实现了基本的显示,下一步将增加放大、缩小、改变颜色等功能。
9 M+ ]& X7 G3 v0 {- ? p Q; G" ~* ^3 F7 n1 L0 ]/ x
- #include "mbed.h"% M$ \4 p- L/ A
- #include "LCD_DISCO_F746NG.h"; j4 b+ V: ?6 n0 \4 h; A Y D
- #include "TS_DISCO_F746NG.h"! R9 {* k0 n6 I6 G. z$ M+ K
' A( `' h" ^' ~/ r' b4 t6 R+ Y; @ r- #define ITERATION 150
3 J* I- n# h0 y- i0 t - #define BAILOUT 4
6 E& H6 d- q0 ~* h - % ]* j0 l L, D; z
- LCD_DISCO_F746NG lcd;
0 [* s: i! ] u - TS_DISCO_F746NG ts;: Z' q& H1 |- m& g. K
- @, Y; c, [5 B- r5 U
- 4 T0 |, o/ o7 g! M+ r5 N% t) y; q
- uint16_t screen_width, screen_height;
4 U5 g# u: s( ^: ]; S# u
( t, R# Y- ^9 Z U- uint16_t calcMandelBrot(double x, double y)
2 M( P! Y( q' R% i& H - {
2 V7 c3 j3 b6 ` - uint16_t i;0 f7 J' L. P/ p% |+ T" {* L
- double xx, yy, tx, ty;
% N# B" ^& c# Y6 c( O - 4 f2 U. i7 {4 D, B
- xx = yy = 0;
" K( k( Y) g0 f+ i% A - i = 0;! F6 F" d5 ]0 C$ f, H
- while((i < ITERATION) && ((xx*xx + yy*yy) < BAILOUT))
, o# W$ z) O4 I$ Z4 |% f - {. l9 S h; G3 z, z+ t
- tx = xx*xx - yy*yy + x;
$ U. | ^6 Q$ _6 b# b7 u - ty = 2*xx*yy + y;
! h3 M9 l' y3 K! q" w0 W( a5 y - xx = tx;& {6 ]4 H9 x" S0 M
- yy = ty;. \9 h% ~5 `2 U# N% R
- i++;5 `6 t7 K$ a" I* m+ k. a
- }2 q& D) [; N. M3 Z: E, c+ `
- return i;0 D5 a k' ], B$ t& P; V
- }( p& C/ d/ U6 \! n4 K
4 z; K* V: F( i/ e- void rectMandelBrot(double x1, double y1, double x2, double y2)! S; t7 \( E8 v! @- ~4 G! k
- {* O7 F1 q e! E3 n% x
- double dx, dy;3 k, W3 z% V, b: S; \. T
- uint16_t i, j;- V0 p2 n7 P4 g
- uint32_t color;
* D8 H0 W& I4 V - % a% J( ?- P" ~4 B' ^3 x2 N; H
- dx = (x2 - x1)/screen_width;4 G9 R0 R/ d3 D0 M f- S. X) C9 K. b% I
- dy = (y2 - y1)/screen_height;
0 B9 M+ Z1 m/ T -
8 S$ E- t7 L- I - for(i = 0; i < screen_width; i++)) b- ~2 M3 K3 p: ]7 _9 |$ g# E
- {
( W8 G3 \5 [; Z9 J - for(j = 0; j < screen_height; j++)
8 h6 G( c) R+ H - {
: h4 X- R- ?6 h! A - color = calcMandelBrot(x1 + dx*i, y1 + dy*j);
$ B3 ]% c- P, |: \& s+ g, {7 I - lcd.DrawPixel(i, j, 0xFF000000 | (color<<2) | (color <<4));
' E- g! a; `6 t# c/ s - }1 {) e8 N: ^4 \
- }1 \) |/ c* B3 b: T
-
' I! ~! {$ ~: J1 ~: W/ ?- w$ ? - }
. ?3 s" k5 s% k c - + q: p- w W' D! K
- int main()4 G' D: X0 P, z6 x
- {9 S0 Y' d4 C- x) n, ~) A0 v
- lcd.Clear(LCD_COLOR_BLACK);% C. T7 }+ v, R' X; Q& j6 Q- P
- 9 Y, R* j* `- b' \
- screen_width = lcd.GetXSize() - 100;
% N5 g; e H K# \ j" K - screen_height = lcd.GetYSize();7 ]( O9 |+ k1 r3 R& E/ x
- 0 ?1 y, o+ A6 p# n. j1 ~
- rectMandelBrot(-2.5, -2, 2.5, 2);
7 N0 _2 v' n- K -
7 x8 g& M( d; h5 |5 h' o+ r - while(1)( x0 z* H" q: `) _! g2 E
- {; d- B: z% S' A8 {
- }2 S; I; Z: g# X$ e6 J& Y9 ?
- }
复制代码 # }, E# k: j6 s9 V; o$ v9 b9 d
fract.zip
(1.33 MB, 下载次数: 42)
|
mbed好处是简单,缺点是占用空间较大。