aboutsummaryrefslogtreecommitdiffstats
path: root/demos
diff options
context:
space:
mode:
authorJoel Bodenmann <joel.bodenmann@hevs.ch>2012-10-25 15:40:17 +0200
committerJoel Bodenmann <joel.bodenmann@hevs.ch>2012-10-25 15:40:17 +0200
commitc15b2b42002977321bd1e2071189bc72044a452a (patch)
tree97e1fcbd57ce186d87cfa075e4c7f56dc8b66ae8 /demos
parent6c23777b5b121cb294ee87eac2b2b89f987f241e (diff)
downloaduGFX-c15b2b42002977321bd1e2071189bc72044a452a.tar.gz
uGFX-c15b2b42002977321bd1e2071189bc72044a452a.tar.bz2
uGFX-c15b2b42002977321bd1e2071189bc72044a452a.zip
updated mandelbrot demo
Diffstat (limited to 'demos')
-rw-r--r--demos/mandelbrot/main.c40
-rw-r--r--demos/mandelbrot/mandelbrot.c126
2 files changed, 38 insertions, 128 deletions
diff --git a/demos/mandelbrot/main.c b/demos/mandelbrot/main.c
index c0c699ed..0c8dc47d 100644
--- a/demos/mandelbrot/main.c
+++ b/demos/mandelbrot/main.c
@@ -22,17 +22,53 @@
#include "hal.h"
#include "gdisp.h"
+void mandelbrot(float x1, float y1, float x2, float y2) {
+ unsigned int i,j;
+ uint16_t iter;
+ color_t color;
+
+ float sy = y2 - y1;
+ float sx = x2 - x1;
+ const int MAX = 512;
+
+ for(i = 0; i < 320; i++) {
+ for(j = 0; j < 240; j++) {
+ float cy = j * sy / 240.0f + y1;
+ float cx = i * sx / 320.0f + x1;
+ float x=0.0f, y=0.0f, xx=0.0f, yy=0.0f;
+ for(iter=0; iter <= MAX && xx+yy<4.0f; iter++) {
+ xx = x*x;
+ yy = y*y;
+ y = 2.0f*x*y + cy;
+ x = xx - yy + cx;
+ }
+ color = ((iter << 8) | (iter&0xFF));
+ //color = RGB565CONVERT(iter*4, iter*13, iter*10);
+ gdispDrawPixel(i, j, color);
+ }
+ }
+}
+
int main(void) {
+ float cx, cy;
+ float zoom = 1.0f;
+
halInit();
chSysInit();
gdispInit();
gdispSetOrientation(GDISP_ROTATE_270);
- mandelbrotInit(128, 128, 512);
+ /* where to zoom in */
+ cx = -0.086f;
+ cy = 0.85f;
while(TRUE) {
-
+ mandelbrot(-2.0f*zoom+cx, -1.5f*zoom+cy, 2.0f*zoom+cx, 1.5f*zoom+cy);
+
+ zoom *= 0.7f;
+ if(zoom <= 0.00001f)
+ zoom = 1.0f;
}
}
diff --git a/demos/mandelbrot/mandelbrot.c b/demos/mandelbrot/mandelbrot.c
deleted file mode 100644
index 70417ffa..00000000
--- a/demos/mandelbrot/mandelbrot.c
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- ChibiOS/GFX - Copyright (C) 2012
- Joel Bodenmann aka Tectu <joel@unormal.org>
-
- This file is part of ChibiOS/GFX.
-
- ChibiOS/GFX is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3 of the License, or
- (at your option) any later version.
-
- ChibiOS/GFX is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "ch.h"
-#include "hal.h"
-#include "gdisp.h"
-
-int count = 0;
-float mag = 1;
-float offsetx = -0.756423894274328;
-float offsety = 0.064179410646170;
-static float width, height;
-static uint16_t iterations, screen_off_x, screen_off_y;
-static uint16_t *FrameBuffer;
-
-static int generateColor(int count, int base) {
- int r,g,b;
- int d = (count % base) * 256 / base;
- int m = (int)(d / 42.667);
-
- switch(m) {
- case 0: r=0; g=6*d; b=255; break;
- case 1: r=0; g=255; b=255-6*(d-43); break;
- case 2: r=6*(d-86); g=255; b=0; break;
- case 3: r=255; g=255-6*(d-129); b=0; break;
- case 4: r=255; g=0; b=6*(d-171); break;
- case 5: r=255-6*(d-214); g=0; b=255; break;
- default: r=0; g=0; b=0; break;
- }
-
- return (((r >> 3) & 0x1f) << 11) | (((g >> 2) & 0x3f) << 5) | ((b >> 3) & 0x1f);
-}
-
-static void complex_mult(float ar,float ai,float br,float bi, float *cr,float *ci) {
- // C = A * B
- *cr = ar * br - ai * bi;
- *ci = ar * bi + ai * br;
-}
-
-static float complex_abs2(float r,float i) {
- float ar,ai;
- complex_mult(r,i,r,-i,&ar,&ai);
-
- return ar;
-}
-
-void mandelbrotInit(uint16_t mandel_width, uint16_t mandel_height, uint16_t mandel_iterations) {
- const char *msg = "ChibiOS/GFX";
-
- width = (float)mandel_width;
- height = (float)mandel_height;
- iterations = mandel_iterations;
-
- FrameBuffer = chHeapAlloc(NULL, width * height * sizeof(uint16_t));
- if(FrameBuffer == NULL)
- return;
-
- screen_off_x = (gdispGetWidth() - width) / 2;
- screen_off_y = (gdispGetHeight() - height) / 2;
-
- gdispClear(Black);
- gdispDrawString((gdispGetWidth() - gdispGetStringWidth(msg, &fontUI2Double)) / 2, 5, "ChibiOS/GFX", &fontUI2Double, White);
-
- while(TRUE) {
- mandelbrotLoop();
- }
-}
-
-void mandelbrotLoop() {
- int x, y;
- int pos = 0;
-
- for(y = 0; y < height; y++) {
- for(x = 0; x < width; x++) {
- float cr = (x - width/2.) / (width/2.) / mag + offsetx;
- float ci = (y - width/2.) / (width/2.) / mag + offsety;
- float zr = 0;
- float zi = 0;
- int t;
-
- for(t = 0; t < iterations; t++) {
- if(complex_abs2(zr,zi) > 4)
- break;
- complex_mult(zr,zi,zr,zi,&zr,&zi);
- zr += cr;
- zi += ci;
- }
-
- FrameBuffer[pos++] = generateColor(t, 64);
- }
- }
-
- gdispBlitArea(screen_off_x, screen_off_y, width, height, FrameBuffer);
-
- // magnification
- mag = mag * 1.2;
-
- // panning
- //offsety += 0.001;
- //offsetx += 0.0016;
-
- if(count++ > 80) {
- offsetx = -0.756423894274328;
- offsety = 0.064179410646170;
- mag = 1;
- count = 0;
- }
-}
-