Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Revision 0:8a49a4178a0e, committed 2018-06-17
- Comitter:
- ensonic
- Date:
- Sun Jun 17 18:44:38 2018 +0000
- Commit message:
- Mandelbrot renderer for pokitto.
Changed in this revision
diff -r 000000000000 -r 8a49a4178a0e My_settings.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/My_settings.h Sun Jun 17 18:44:38 2018 +0000 @@ -0,0 +1,16 @@ +/* This is an example of how to set your own project settings + +To use + +1. make a copy of this file by pressing right mouse button on top of this file +in the mbed online compiler, then choose "Clone" + +2. See that the copy is in the root of the project (where your main cpp files are), not inside the PokittoLib folder +Drag & drop to move if needed + +3. rename the clone to "My_settings.h" + +*/ + +#define PROJ_HIRES 0 // 1 = high resolution (220x176) , 0 = 110x88 fast mode +#define PROJ_ENABLE_SOUND 0 // 0 = all sound functions disabled
diff -r 000000000000 -r 8a49a4178a0e PokittoLib.lib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/PokittoLib.lib Sun Jun 17 18:44:38 2018 +0000 @@ -0,0 +1,1 @@ +https://os.mbed.com/users/Pokitto/code/PokittoLib/#74201663ba8b
diff -r 000000000000 -r 8a49a4178a0e main.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp Sun Jun 17 18:44:38 2018 +0000
@@ -0,0 +1,159 @@
+#include "Pokitto.h"
+
+Pokitto::Core game;
+
+#define RGB888_565(r, g, b) ((r >> 3) | ((g >> 2) << 5) | ((b >> 3) << 11))
+#define GRAY888_565(g) ((g >> 3) | ((g >> 2) << 5) | ((g >> 3) << 11))
+
+// TODO: need more colors, palette is always PALETTE_SIZE=256
+const uint16_t palette[] =
+{
+ GRAY888_565(0x00),
+ GRAY888_565(0x10),
+ GRAY888_565(0x20),
+ GRAY888_565(0x30),
+ GRAY888_565(0x40),
+ GRAY888_565(0x50),
+ GRAY888_565(0x60),
+ GRAY888_565(0x70),
+ GRAY888_565(0x80),
+ GRAY888_565(0x90),
+ GRAY888_565(0xA0),
+ GRAY888_565(0xB0),
+ GRAY888_565(0xC0),
+ GRAY888_565(0xD0),
+ GRAY888_565(0xE0),
+ GRAY888_565(0xF0),
+};
+
+/* calculate mandelbrot/julia set
+ * KEYS
+ * - color cycle: left, right
+ * - zoom-in/out: up, down
+ * - move center: A + up/down/left/right
+ *
+ * TODO:
+ * - increase/decrease max iter: B + up/down
+ * - switch between mandel/julia: C
+ * - will also reset x1/x2/y1/y2 and max-iter
+ */
+
+static const uint8_t width = (POK_LCD_W / 2);
+static const uint8_t height = (POK_LCD_H / 2);
+
+static float x1 = -2.2;
+static float x2 = 1.5;
+static float xd = x2 - x1;
+static float xs = xd / width;
+static float y1 = -1.5;
+static float y2 = 1.5;
+static float yd = y2 - y1;
+static float ys = yd / height;
+
+static uint16_t mandel_pixel(float startReal, float startImag) {
+ float zReal = startReal;
+ float zImag = startImag;
+
+ for (uint16_t counter = 0; counter < 50; counter++) {
+ // z := z*z + c
+ float r2 = zReal * zReal;
+ float i2 = zImag * zImag;
+ if (r2 + i2 > 4.0) {
+ return counter;
+ }
+ zImag = 2.0 * zReal * zImag + startImag;
+ zReal = r2 - i2 + startReal;
+ }
+ return 0;
+}
+
+static void mandel_screen(void) {
+ for (uint8_t ypos = 0; ypos < height; ypos++) {
+ float startImag = y1 + (ys * ypos);
+ for (uint8_t xpos = 0; xpos < width; xpos++) {
+ float startReal = x1 + (xs * xpos);
+ uint8_t color = mandel_pixel(startReal, startImag) % 0x0f;
+ game.display.drawPixel(xpos, ypos, color);
+ }
+ game.display.update();
+ }
+}
+
+int main () {
+ game.begin();
+ game.display.load565Palette(palette);
+
+ // don't clear the screen
+ game.display.persistence = 1;
+ bool recalc = true;
+
+ while (game.isRunning()) {
+ if (game.update()) {
+ if (game.aBtn()) {
+ // scroll
+ if (game.leftBtn()) {
+ float mx = 10.0 * xs;
+ x1 -= mx;
+ x2 -= mx;
+ recalc = true;
+ } else if (game.rightBtn()) {
+ float mx = 10.0 * xs;
+ x1 += mx;
+ x2 += mx;
+ recalc = true;
+ } else if (game.upBtn()) {
+ float my = 10.0 * ys;
+ y1 -= my;
+ y2 -= my;
+ recalc = true;
+ } else if (game.downBtn()) {
+ float my = 10.0 * ys;
+ y1 += my;
+ y2 += my;
+ recalc = true;
+ }
+ } else {
+ // cycle colors & zoom
+ if (game.leftBtn()) {
+ game.display.rotatePalette(-1);
+ } else if (game.rightBtn()) {
+ game.display.rotatePalette(1);
+ } else if (game.upBtn()) {
+ // zoom in
+ xd /= 2.0;
+ float xm = x1 + xd;
+ x1 = xm - xd / 2.0;
+ x2 = xm + xd / 2.0;
+ xs = xd / width;
+
+ yd /= 2.0;
+ float ym = y1 + yd;
+ y1 = ym - yd / 2.0;
+ y2 = ym + yd / 2.0;
+ ys = yd / height;
+
+ recalc = true;
+ } else if (game.downBtn()) {
+ // zoom out
+ float xm = x1 + xd / 2.0;
+ x1 = xm - xd;
+ x2 = xm + xd;
+ xd *= 2.0;
+ xs = xd / width;
+
+ float ym = y1 + yd / 2.0;
+ y1 = ym - yd;
+ y2 = ym + yd;
+ yd *= 2.0;
+ ys = yd / height;
+
+ recalc = true;
+ }
+ }
+ if (recalc) {
+ mandel_screen();
+ recalc = false;
+ }
+ }
+ }
+}
\ No newline at end of file