#include #include "../libpng/img.h" #define BAIL_OUT 64 #define MAX_ITER 8192 #define WIDTH 800 #define HEIGHT 800 double map(int value, int min, int max, int map_min, int map_max) { double R = (double) (map_max - map_min) / (double) (max - min); double y = map_min + (value * R) + R; return y; } 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; for (x = 0; x < w; x++) { for (y = 0; y < h; y++) { xPrime = map(x, 0, w, -2, 2); yPrime = map(y, 0, h, -2, 2); x2 = xPrime; y2 = yPrime; // 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 imaginary = 2 * xPrime * yPrime; // x = real + c xPrime = real + x2; // y = imaginary + c yPrime = imaginary +y2; if ((xPrime * xPrime + yPrime * yPrime) > bail_out) { break; } } if (k == max_iter) { field[x * h + y] = max_iter; } else { field[x * h + y] = k; } } } } int main(int argc, char **argv) { double pix_field[WIDTH][HEIGHT]; mandelbrot((double *) pix_field, WIDTH, HEIGHT, BAIL_OUT, MAX_ITER); pix_row rows[WIDTH]; pix p; char filename[30]; image img; p.r = 200; p.g = 200; p.b = 200; 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); rows[i].p[j] = p; } } sprintf(filename, "mandel.png"); img = initialize_png("image000", filename, WIDTH, HEIGHT); write_image(&img, rows); finish_image(&img); for (int i = 0; i < WIDTH; i++) { free(rows[i].p); } return (0); }