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..
main.cpp
- Committer:
- RorschachUK
- Date:
- 2013-04-17
- Revision:
- 1:a9641f372bea
- Parent:
- 0:a954bd7fd162
- Child:
- 2:b1169b84a563
File content as of revision 1:a9641f372bea:
/* 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 * WIDTH); zoom *= 4.0; tt.rect(p.x - WIDTH / 8.0, p.y - HEIGHT / 8.0, p.x + WIDTH / 8.0, p.y + HEIGHT / 8.0, Yellow); } }