Mandelbrot set viewer for the ARM Mbed platform
Dependencies: mbed DmTftLibrary
Mbed Mandelbrot Viewer
Touch-based mandelbrot set viewer for the ARM Mbed platform. Designed with the NXP LPC1768 and the DisplayModule DM-TFT28-116. It should be easy to adapt for any DisplayModule product, especially if it has an I2C touch controller.
On screen options allow the user to switch between 256*(2^n) maxiters up to 4096, and three rendering kernels using floats, integers, and integers in ARMv7 ASM.
src/ui.cpp@3:835c035b8b1c, 2018-12-07 (annotated)
- Committer:
- ofrasier
- Date:
- Fri Dec 07 01:00:54 2018 +0000
- Revision:
- 3:835c035b8b1c
- Parent:
- 1:a1d80c69e1f0
Combined ADD-LSL
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ofrasier | 0:5b56190e14e9 | 1 | #ifndef UI_CPP |
ofrasier | 0:5b56190e14e9 | 2 | #define UI_CPP |
ofrasier | 0:5b56190e14e9 | 3 | |
ofrasier | 0:5b56190e14e9 | 4 | #include "ui.h" |
ofrasier | 0:5b56190e14e9 | 5 | |
ofrasier | 0:5b56190e14e9 | 6 | void Button::draw(DmTftBase *screen) |
ofrasier | 0:5b56190e14e9 | 7 | { |
ofrasier | 0:5b56190e14e9 | 8 | screen->fillRectangle(x, y, x + width, y + height, BLACK); |
ofrasier | 0:5b56190e14e9 | 9 | screen->drawRectangle(x, y, x + width, y + height, WHITE); |
ofrasier | 0:5b56190e14e9 | 10 | screen->drawString(x + width/2 - 4*text.length(), y + height/2 - 8, text.c_str()); |
ofrasier | 0:5b56190e14e9 | 11 | } |
ofrasier | 0:5b56190e14e9 | 12 | |
ofrasier | 0:5b56190e14e9 | 13 | void Button::onClick(DmTftBase *screen, uint16_t cursorX, uint16_t cursorY) |
ofrasier | 0:5b56190e14e9 | 14 | { |
ofrasier | 0:5b56190e14e9 | 15 | buttonHandler(this, screen); |
ofrasier | 0:5b56190e14e9 | 16 | } |
ofrasier | 0:5b56190e14e9 | 17 | |
ofrasier | 0:5b56190e14e9 | 18 | void Label::draw(DmTftBase *screen) |
ofrasier | 0:5b56190e14e9 | 19 | { |
ofrasier | 0:5b56190e14e9 | 20 | screen->drawString(x, y, text.c_str()); |
ofrasier | 0:5b56190e14e9 | 21 | } |
ofrasier | 0:5b56190e14e9 | 22 | |
ofrasier | 0:5b56190e14e9 | 23 | void Label::onClick(DmTftBase *screen, uint16_t cursorX, uint16_t cursorY) |
ofrasier | 0:5b56190e14e9 | 24 | { |
ofrasier | 0:5b56190e14e9 | 25 | return; |
ofrasier | 0:5b56190e14e9 | 26 | } |
ofrasier | 0:5b56190e14e9 | 27 | |
ofrasier | 0:5b56190e14e9 | 28 | void Mandelbrot::draw(DmTftBase* screen) |
ofrasier | 0:5b56190e14e9 | 29 | { |
ofrasier | 0:5b56190e14e9 | 30 | if (zoom == 0) { |
ofrasier | 0:5b56190e14e9 | 31 | printf("Error: Mandelbrot.zoom == 0\n\r"); |
ofrasier | 0:5b56190e14e9 | 32 | exit(0); |
ofrasier | 0:5b56190e14e9 | 33 | } |
ofrasier | 0:5b56190e14e9 | 34 | screen->drawString(x + width - 56, y + height - 16, "DRAWING"); |
ofrasier | 0:5b56190e14e9 | 35 | kernel(this, screen); |
ofrasier | 0:5b56190e14e9 | 36 | } |
ofrasier | 0:5b56190e14e9 | 37 | |
ofrasier | 0:5b56190e14e9 | 38 | void Mandelbrot::onClick(DmTftBase *screen, uint16_t cursorX, uint16_t cursorY) |
ofrasier | 0:5b56190e14e9 | 39 | { |
ofrasier | 0:5b56190e14e9 | 40 | // Origin centered on image, mathematical orientation |
ofrasier | 0:5b56190e14e9 | 41 | float xPos = (cursorX - x - width/2) / (float)(width/4); |
ofrasier | 0:5b56190e14e9 | 42 | float yPos = (cursorY - y - height/2) / (float)(width/4); |
ofrasier | 0:5b56190e14e9 | 43 | centerX += xPos/zoom; |
ofrasier | 0:5b56190e14e9 | 44 | centerY += yPos/zoom; |
ofrasier | 0:5b56190e14e9 | 45 | zoom *= 2; |
ofrasier | 0:5b56190e14e9 | 46 | draw(screen); |
ofrasier | 0:5b56190e14e9 | 47 | } |
ofrasier | 0:5b56190e14e9 | 48 | |
ofrasier | 0:5b56190e14e9 | 49 | #endif |