mandelbrot
diff src/mbrot.c @ 0:4d85805eb875
mandelbrot initial import
author | John Tsiombikas <nuclear@mutantstargoat.com> |
---|---|
date | Tue, 19 Jun 2012 06:48:38 +0300 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/mbrot.c Tue Jun 19 06:48:38 2012 +0300 1.3 @@ -0,0 +1,75 @@ 1.4 +/* 1.5 +A simple interactive mandelbrot fractal explorer 1.6 +Copyright (C) John Tsiombikas <nuclear@member.fsf.org> 1.7 + 1.8 +This program is free software: you can redistribute it and/or modify 1.9 +it under the terms of the GNU General Public License as published by 1.10 +the Free Software Foundation, either version 3 of the License, or 1.11 +(at your option) any later version. 1.12 + 1.13 +This program is distributed in the hope that it will be useful, 1.14 +but WITHOUT ANY WARRANTY; without even the implied warranty of 1.15 +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 1.16 +GNU General Public License for more details. 1.17 + 1.18 +You should have received a copy of the GNU General Public License 1.19 +along with this program. If not, see <http://www.gnu.org/licenses/>. 1.20 +*/ 1.21 +#include "mbrot.h" 1.22 +#include "palette.h" 1.23 + 1.24 +static int mandelbrot(double cx, double cy, int iter); 1.25 + 1.26 +void draw_mandelbrot(unsigned char *pix, int xsz, int ysz, struct area *area, int iter) 1.27 +{ 1.28 + int i, j; 1.29 + double x, y, dx, dy; 1.30 + 1.31 + dx = area->width / (double)xsz; 1.32 + dy = area->height / (double)ysz; 1.33 + 1.34 + y = area->y; 1.35 + for(i=0; i<ysz; i++) { 1.36 + x = area->x; 1.37 + for(j=0; j<xsz; j++) { 1.38 + int res = mandelbrot(x, y, iter); 1.39 + /* visualize according to the number of iterations 1.40 + * required to determine membership in the mandelbrot set. 1.41 + * Members of the set will have res = iter and so col = PAL_SIZE-1 1.42 + */ 1.43 + int col = (PAL_SIZE - 1) * res / iter; 1.44 + *pix++ = palette[col].r; 1.45 + *pix++ = palette[col].g; 1.46 + *pix++ = palette[col].b; 1.47 + *pix++ = 0; 1.48 + 1.49 + x += dx; 1.50 + } 1.51 + y += dy; 1.52 + } 1.53 +} 1.54 + 1.55 +static int mandelbrot(double cx, double cy, int iter) 1.56 +{ 1.57 + int i; 1.58 + double zx, zy; /* complex number Z */ 1.59 + 1.60 + /* start with Z0 = C */ 1.61 + zx = cx; 1.62 + zy = cy; 1.63 + 1.64 + for(i=0; i<iter; i++) { 1.65 + /* calculate Zn+1 = Zn * Zn + C */ 1.66 + double x = (zx * zx - zy * zy) + cx; 1.67 + double y = (zy * zx + zx * zy) + cy; 1.68 + zx = x; 1.69 + zy = y; 1.70 + 1.71 + /* escape if ||Z|| > 2 */ 1.72 + if((x * x + y * y) > 4.0) { 1.73 + break; 1.74 + } 1.75 + } 1.76 + 1.77 + return i; 1.78 +}