Browse Source

mandelbrot: improve for larger images

cmte 5 years ago
parent
commit
9670fbc1c3
1 changed files with 16 additions and 15 deletions
  1. 16 15
      mandelbrot/mandelbrot.c

+ 16 - 15
mandelbrot/mandelbrot.c

@@ -2,13 +2,11 @@
 #include "../libpng/img.h"
 
 
-#define BAIL_OUT 64
-#define MAX_ITER 8192
-
-#define WIDTH 800
-#define HEIGHT 800
-
+#define BAIL_OUT 8192
+#define MAX_ITER 65536
 
+#define WIDTH 4096
+#define HEIGHT 4096
 
 double map(int value, int min, int max, int map_min, int map_max)
 {
@@ -21,7 +19,7 @@ void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
 {
 	double xPrime, yPrime, real, imaginary, realPrime,
 	    imaginaryPrime, x2, y2;
-	int bailed = 0, x, y, k;
+	int  x, y, k;
 	for (x = 0; x < w; x++) {
 		for (y = 0; y < h; y++) {
 			xPrime = map(x, 0, w, -2, 2);
@@ -31,7 +29,6 @@ void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
 
 			// iterate a^2 - b^2 + 2ab
 			for (k = 0; k < max_iter; k++) {
-				bailed = 0;
 				// a^2 - b^2
 				real = xPrime * xPrime - yPrime * yPrime;
 				// 2ab
@@ -40,7 +37,7 @@ void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
 				// x = real + c
 				xPrime = real + x2;
 				// y = imaginary + c
-				yPrime = imaginary +y2;
+				yPrime = imaginary + y2;
 
 				if ((xPrime * xPrime + yPrime * yPrime) >
 				    bail_out) {
@@ -60,9 +57,11 @@ void mandelbrot(double *field, int w, int h, int bail_out, int max_iter)
 int main(int argc, char **argv)
 {
 
-	double pix_field[WIDTH][HEIGHT];
+	double * pix_field;
 
-	mandelbrot((double *) pix_field, WIDTH, HEIGHT, BAIL_OUT,
+	pix_field = malloc(WIDTH * HEIGHT * sizeof(double));
+
+	mandelbrot(pix_field, WIDTH, HEIGHT, BAIL_OUT,
 		   MAX_ITER);
 
 	pix_row rows[WIDTH];
@@ -77,14 +76,14 @@ int main(int argc, char **argv)
 	for (int i = 0; i < WIDTH; i++) {
 		rows[i].p = malloc(HEIGHT * sizeof(pix));
 		for (int j = 0; j < HEIGHT; j++) {
-			p.r = map(pix_field[i][j], 0, MAX_ITER, 0, 255);
-			p.g = map(pix_field[i][j], 0, MAX_ITER, 0, 255);
-			p.b = map(pix_field[i][j], 0, MAX_ITER, 0, 255);
+			p.r = map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0, 255);
+			p.g = map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0, 255);
+			p.b = map(pix_field[i * HEIGHT + j], 0, MAX_ITER, 0, 255);
 			rows[i].p[j] = p;
 		}
 	}
 	sprintf(filename, "mandel.png");
-	img = initialize_png("image000", filename, WIDTH, HEIGHT);
+	img = initialize_png("mandelbrot", filename, WIDTH, HEIGHT);
 	write_image(&img, rows);
 	finish_image(&img);
 	for (int i = 0; i < WIDTH; i++) {
@@ -92,5 +91,7 @@ int main(int argc, char **argv)
 		free(rows[i].p);
 	}
 
+	free(pix_field);
+
 	return (0);
 }