#include #include "../libpng/img.h" #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) { 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 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++) { // 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; pix_field = malloc(WIDTH * HEIGHT * sizeof(double)); mandelbrot(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 * 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("mandelbrot", filename, WIDTH, HEIGHT); write_image(&img, rows); finish_image(&img); for (int i = 0; i < WIDTH; i++) { free(rows[i].p); } free(pix_field); return (0); }