Mandelbrot set generator using DISCO-F746NG.

Dependencies:   BSP_DISCO_F746NG LCD_DISCO_F746NG TS_DISCO_F746NG mbed BUTTON_GROUP

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);
     }
 }
-