Mandelbrot set generator using DISCO-F746NG.
Dependencies: BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed BUTTON_GROUP
Diff: main.cpp
- Revision:
- 2:6c1471e4a4b1
- Parent:
- 1:27bfb11afcff
- Child:
- 3:0be49559a8dc
--- a/main.cpp Thu Nov 05 04:38:28 2015 +0000 +++ b/main.cpp Mon Nov 23 05:17:16 2015 +0000 @@ -5,10 +5,10 @@ // Tap the Mandelbrot set on the screen, expanded figure by a // factor of two around the tapped position is displayed. // -// 2015/11/05, Copyright (c) 2015 MIKAMI, Naoki +// 2015/11/23, Copyright (c) 2015 MIKAMI, Naoki //--------------------------------------------------------------- -#include "button.hpp" +#include "button_group.hpp" #include "mandelbrot.hpp" using namespace Mikami; @@ -28,7 +28,8 @@ const int NX_ = 321; // number of pixels for horizon const int NY_ = 261; // number of pixels for vertical -void ReDraw(MandelbrotBase *mandel, +// Redrawing Mandelbrot set with different scale +void Redraw(MandelbrotBase *mandel, float wH, float hH, PointF xy, int level, float &x1, float &x2, float &y1, float &y2) { @@ -38,6 +39,7 @@ y2 = xy.y + hH; char str[16]; + lcd_.SetTextColor(LCD_COLOR_WHITE); sprintf(str, "factor:%6d", 1 << level); lcd_.DisplayStringAt(360, 224, (uint8_t *)str, LEFT_MODE); sprintf(str, "x:%8.4f", xy.x); @@ -53,7 +55,8 @@ const int LEVEL = 18; PointF xy[LEVEL]; // corresponding to touched position - uint32_t backColor = 0xFF006A6C; // teal green + uint32_t backColor = 0xFF006A6C; // teal green + uint32_t inActive = backColor & 0xE0FFFFFF; // color for inactive button // region to be displayed float x1 = -2.3f; @@ -73,40 +76,43 @@ mandel[1] = new MandelbrotColor1(lcd_, X0_, Y0_, NX_, NY_); mandel[2] = new MandelbrotColor2(lcd_, X0_, Y0_, NX_, NY_); - Button *buttons[3]; - char strButton[3][8] = {"B & W", "Color1", "Color2"}; - for (int n=0; n<3; n++) - buttons[n] = new Button(lcd_, ts_, 340, Y0_+45*n, 60, 40, - LCD_COLOR_BLUE, strButton[n], Font12); - Button back(lcd_, ts_, 410, Y0_, 60, 40, LCD_COLOR_BLUE, "Back", Font12); - back.Erase(backColor); //back.Draw(0xFFE0E0FF); + string strButton[3] = {"B & W", "Color1", "Color2"}; + ButtonGroup bGroup(lcd_, ts_, 340, Y0_, 60, 40, + LCD_COLOR_BLUE, backColor, + 3, strButton, 0, 5, 1, Font12); + Button back(lcd_, ts_, 410, Y0_, 60, 40, LCD_COLOR_BLUE, backColor, "Back", Font12); + back.Draw(inActive, LCD_COLOR_GRAY); + + // area of Mandelbrot set - Button area(lcd_, ts_, X0_, Y0_, NX_, NY_, backColor); + Button area(lcd_, ts_, X0_, Y0_, NX_, NY_, backColor, backColor); - lcd_.SetBackColor(backColor); - + lcd_.SetTextColor(LCD_COLOR_WHITE); lcd_.SetFont(&Font20); lcd_.DisplayStringAt(60, 130, (uint8_t *)"Mandelbrot set", LEFT_MODE); int pattern = -1; int level = 0; + bool first = true; while (true) { - // select color pattern - for (int k=0; k<3; k++) + int num = -1; + // select color pattern and display + if (bGroup.GetTouchedNumber(num) && (pattern != num)) { - buttons[k]->ReDraw(); - if (buttons[k]->Touched() && (pattern != k)) + bGroup.Draw(num, LCD_COLOR_DARKBLUE); + mandel[num]->Display(x1, x2, y1, y2); + pattern = num; + bGroup.Redraw(num); + + if (first) { - buttons[k]->Draw(LCD_COLOR_DARKBLUE); - mandel[k]->Display(x1, x2, y1, y2); - pattern = k; - lcd_.SetBackColor(backColor); lcd_.SetFont(&Font12); - lcd_.DisplayStringAt(360, LINE(15), (uint8_t *)"Tap to zoom.", + lcd_.DisplayStringAt(350, LINE(15), (uint8_t *)"Tap to zoom in.", LEFT_MODE); - } + first = false; + } } // expand twice around tapped point @@ -125,7 +131,7 @@ wH = wH/2.0f; hH = hH/2.0f; - ReDraw(mandel[pattern], wH, hH, xy[level], level, x1, x2, y1, y2); + Redraw(mandel[pattern], wH, hH, xy[level], level, x1, x2, y1, y2); } else { @@ -134,7 +140,7 @@ LEFT_MODE); level = LEVEL - 1 ; } - back.ReDraw(); + back.Redraw(); } // "back" button tapped @@ -148,13 +154,12 @@ wH = wH*2.0f; hH = hH*2.0f; - ReDraw(mandel[pattern], wH, hH, xy[level], level, x1, x2, y1, y2); - - if (level > 0) back.ReDraw(); - else back.Erase(backColor); //back.Draw(0xFFE0E0FF); + Redraw(mandel[pattern], wH, hH, xy[level], level, x1, x2, y1, y2); + if (level > 0) back.Redraw(); + else + back.Draw(inActive, LCD_COLOR_GRAY); } } wait(0.1f); } } -