Modified Bob Stone's code for ILI9341 QVGA TFT's without touch capability. Navigation is now done with rotary encoders - two for position, & one setting the maxiterations.
Dependencies: SPI_TFT_ILI9341 TFT_fonts mbed
Fork of Mandelbrot by
Should have mentioned in the above: Encoder code is specific to the STM32F4, tested on Nucleo F401, should work on the Nucleo F411..
Diff: main.cpp
- Revision:
- 0:a954bd7fd162
- Child:
- 1:a9641f372bea
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sat Apr 13 19:27:43 2013 +0000
@@ -0,0 +1,106 @@
+/* Mandelbrot for mbed - April 2013
+ * Uses Peter Drescher's library for Mikroelektronika's TFT-Proto screen, an inexpensive SPI-driven QVGA touch panel
+ * Library: http://mbed.org/cookbook/SPI-driven-QVGA-TFT
+ * Manufacturer's page for the screen: http://www.mikroe.com/add-on-boards/display/tft-proto/
+ * UK distributor: http://www.mcustore.com/tft-proto-board.html
+ * Partly adapted from Kamil Ondrousek's code for another screen: http://mbed.org/users/JLS/code/Mandelbrot-2/
+ */
+#include "mbed.h"
+#include "SPI_TFT.h"
+#include "Arial12x12.h"
+#include "touch_tft.h"
+
+#define WIDTH 320
+#define HEIGHT 240
+
+touch_tft tt(p18,p19,p16,p17,p11, p12, p13, p14, p15,"TFT"); // x+,x-,y+,y-,mosi, miso, sclk, cs, reset
+
+void drawMandelbrot(float centrex, float centrey, float zoom, int maxIter) {
+ float xmin = centrex - 1.0/zoom;
+ float xmax = centrex + 1.0/zoom;
+ float ymin = centrey - HEIGHT / (WIDTH * zoom);
+ float ymax = centrey + HEIGHT / (WIDTH *zoom);
+
+ float dx = (xmax - xmin) / WIDTH;
+ float dy = (ymax - ymin) / HEIGHT;
+
+ float y = ymin;
+
+ float c;
+ unsigned int cr, cg, cb;
+
+ for (int j = 0; j < HEIGHT; j++) {
+ float x = xmin;
+
+ for (int i = 0; i < WIDTH; i++) {
+ float a = x;
+ float b = y;
+ int n = 0;
+
+ while (n < maxIter) {
+ float aa = a * a;
+ float bb = b * b;
+ float twoab = 2.0 * a * b;
+
+ a = aa - bb + x;
+ b = twoab + y;
+
+ if(aa + bb > 16.0) {
+ break;
+ }
+ n++;
+ }
+
+ if (n == maxIter) {
+ //It's in the set - Black
+ tt.pixel(i,j,Black);
+ } else {
+ //Not in the set - pick a colour
+ c = 3.0 * (maxIter-n)/maxIter;
+ cr = ((c < 1.0) ? 255 * ( 1.0 - c) : (c > 2.0) ? 255 * (c - 2.0) : 0);
+ cg = ((c < 1.0) ? 255 * c : (c > 2.0) ? 0 : 255 * (2.0 - c));
+ cb = ((c < 1.0) ? 0 : (c > 2.0) ? 255 * (3.0 - c) : 255 * (c - 1.0));
+ tt.pixel(i,j, RGB(cr,cg,cb));
+ }
+ x += dx;
+ }
+ y += dy;
+ }
+}
+
+int main()
+{
+ //Setup screen
+ tt.claim(stdout); // send stdout to the TFT display
+ tt.background(Black); // set background to black
+ tt.foreground(White); // set chars to white
+ tt.cls(); // clear the screen
+ tt.set_font((unsigned char*) Arial12x12); // select the font
+ tt.set_orientation(1);
+ tt.calibrate(); // calibrate the touch
+ point p;
+
+ tt.locate(0,0);
+
+ //Setup base Mandelbrot
+ float centrex = -0.5;
+ float centrey = 0.0;
+ float zoom=0.5;
+ int maxiterations = 150;
+
+ while(true) {
+ //Draw it
+ drawMandelbrot(centrex, centrey, zoom, maxiterations);
+
+ //Wait for a touch
+ p=tt.get_touch();
+ while(!tt.is_touched(p)) {
+ p=tt.get_touch();
+ }
+ //Set new centre and zoom
+ p = tt.to_pixel(p);
+ centrex += (2.0 * p.x - WIDTH) / (zoom * WIDTH);
+ centrey += (2.0 * p.y - HEIGHT) / (zoom * HEIGHT);
+ zoom *= 4.0;
+ }
+}
\ No newline at end of file
