aboutsummaryrefslogtreecommitdiffstats
path: root/demos/mandelbrot/main.c
blob: 0c8dc47d2d4cb2bad772622f7c31ee0ed5279505 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
/*
    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"

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);

	/* 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;	
	}
}