Mandelbrot set generator using DISCO-F746NG.

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed BUTTON_GROUP

Committer:
MikamiUitOpen
Date:
Mon Feb 22 13:51:42 2016 +0000
Revision:
6:cafbcdf0d166
Parent:
2:6c1471e4a4b1
7

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MikamiUitOpen 0:9a78f27b84a4 1 //------------------------------------------------------
MikamiUitOpen 0:9a78f27b84a4 2 // Class for drawing Mandelbrot set
MikamiUitOpen 0:9a78f27b84a4 3 // 2015/11/03, Copyright (c) 2015 MIKAMI, Naoki
MikamiUitOpen 0:9a78f27b84a4 4 //-----------------------------------------------------------
MikamiUitOpen 0:9a78f27b84a4 5
MikamiUitOpen 0:9a78f27b84a4 6 #include "mandelbrot.hpp"
MikamiUitOpen 0:9a78f27b84a4 7
MikamiUitOpen 0:9a78f27b84a4 8 namespace Mikami
MikamiUitOpen 0:9a78f27b84a4 9 {
MikamiUitOpen 0:9a78f27b84a4 10 void MandelbrotBase::Display(float x1, float x2, float y1, float y2)
MikamiUitOpen 0:9a78f27b84a4 11 {
MikamiUitOpen 0:9a78f27b84a4 12 x1_ = x1;
MikamiUitOpen 0:9a78f27b84a4 13 y1_ = y1;
MikamiUitOpen 0:9a78f27b84a4 14
MikamiUitOpen 0:9a78f27b84a4 15 ax_ = (x2 - x1)/(NX_ - 1);
MikamiUitOpen 0:9a78f27b84a4 16 ay_ = (y2 - y1)/(NY_ - 1);
MikamiUitOpen 0:9a78f27b84a4 17
MikamiUitOpen 0:9a78f27b84a4 18 for (int nx=0; nx<NX_; nx++)
MikamiUitOpen 0:9a78f27b84a4 19 for (int ny=0; ny<NY_; ny++)
MikamiUitOpen 0:9a78f27b84a4 20 {
MikamiUitOpen 0:9a78f27b84a4 21 uint32_t color = GetColor(Converge(Complex(Fx(nx), Fy(ny))));
MikamiUitOpen 0:9a78f27b84a4 22 LCD_->DrawPixel(X0_+nx, Y0_+ny, color);
MikamiUitOpen 0:9a78f27b84a4 23 }
MikamiUitOpen 0:9a78f27b84a4 24 }
MikamiUitOpen 0:9a78f27b84a4 25
MikamiUitOpen 0:9a78f27b84a4 26 // discrimination of congergence
MikamiUitOpen 0:9a78f27b84a4 27 int MandelbrotBase::Converge(Complex c)
MikamiUitOpen 0:9a78f27b84a4 28 {
MikamiUitOpen 0:9a78f27b84a4 29 Complex zn = 0; // initial value
MikamiUitOpen 0:9a78f27b84a4 30
MikamiUitOpen 0:9a78f27b84a4 31 for (int n=1; n<=MAX_COUNT_; n++)
MikamiUitOpen 0:9a78f27b84a4 32 {
MikamiUitOpen 0:9a78f27b84a4 33 zn = zn*zn + c;
MikamiUitOpen 0:9a78f27b84a4 34 if ((Sqr(zn.real()) + Sqr(zn.imag())) > 4)
MikamiUitOpen 0:9a78f27b84a4 35 return(n); // diverge
MikamiUitOpen 0:9a78f27b84a4 36 }
MikamiUitOpen 0:9a78f27b84a4 37 return 0; // converge
MikamiUitOpen 0:9a78f27b84a4 38 }
MikamiUitOpen 0:9a78f27b84a4 39
MikamiUitOpen 0:9a78f27b84a4 40 // Get the color corresponding to the number of repititions (Color1)
MikamiUitOpen 0:9a78f27b84a4 41 uint32_t MandelbrotColor1::GetColor(int x)
MikamiUitOpen 0:9a78f27b84a4 42 {
MikamiUitOpen 0:9a78f27b84a4 43 if (x == 0) return LCD_COLOR_BLACK;
MikamiUitOpen 0:9a78f27b84a4 44 uint32_t clr[] = { LCD_COLOR_BLUE, LCD_COLOR_CYAN, LCD_COLOR_LIGHTGREEN,
MikamiUitOpen 0:9a78f27b84a4 45 LCD_COLOR_GREEN, LCD_COLOR_YELLOW, LCD_COLOR_LIGHTYELLOW,
MikamiUitOpen 0:9a78f27b84a4 46 LCD_COLOR_RED, LCD_COLOR_DARKMAGENTA, LCD_COLOR_MAGENTA};
MikamiUitOpen 0:9a78f27b84a4 47 return clr[(x-1) % 9];
MikamiUitOpen 0:9a78f27b84a4 48 }
MikamiUitOpen 0:9a78f27b84a4 49
MikamiUitOpen 0:9a78f27b84a4 50 // Get the color corresponding to the number of repititions (Color2)
MikamiUitOpen 0:9a78f27b84a4 51 uint32_t MandelbrotColor2::GetColor(int x)
MikamiUitOpen 0:9a78f27b84a4 52 {
MikamiUitOpen 0:9a78f27b84a4 53 int b = Max255(20 + x*50);
MikamiUitOpen 0:9a78f27b84a4 54 int g = (x > 5) ? Max255((x - 5)*30) : 0;
MikamiUitOpen 0:9a78f27b84a4 55 int r = (x > 20) ? Max255((x - 20)*10) : 0;
MikamiUitOpen 0:9a78f27b84a4 56 return 0xFF000000 | (r << 16) | (g << 8) | b;
MikamiUitOpen 0:9a78f27b84a4 57 }
MikamiUitOpen 0:9a78f27b84a4 58 }