DEVELOPMENT ENVIRONMENT

~alex/mandelbrot-set-gen

ref: 84158eb038ec5ea29c996a64223d56da4b6db5b6 mandelbrot-set-gen/src/main.c -rw-r--r-- 2.1 KiB
84158eb0Alejandro Laguna feat: basic .ppm output a month ago
                                                                                
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
#include <stdio.h>

// the mandelbrot set, basically, is a set of points on the complex plane -
// those points are found using the following equation:
//
// z = z^2 + c
//
// c is an initial point on this complex plane. if the value of z is bigger than
// 2 (which means that it's distance from the origin is larger than 2), it means
// the value is out of the set.
//
// but what's going on with all the shapes and colors? this is a recursive
// function.
//
// we start with z as 0, and then with the equation we get a new z, and then put
// that new z onto the equation and we do that over and over. if z doesn't grow
// over 2, then c is part of the set. if it does pass 2, we know for how many
// iterations we have checked and we color based on that

int mandelbrot_iterations(double cr, double ci, int max_iter) {
    double zr = 0.0, zi = 0.0;
    int iter = 0;
    while (iter < max_iter) {
        double zr2 = zr * zr;
        double zi2 = zi * zi;
        // avoids checking for sqrt
        if (zr2 + zi2 > 4.0) {
            break;
        }
        zi = 2.0 * zr * zi + ci;
        zr = zr2 - zi2 + cr;
        iter++;
    }
    return iter;
}

void get_color(int iter, int max_iter, int* r, int* g, int* b) {
    if (iter == max_iter) {
        *r = *g = *b = 0; // black inside the set
        return;
    }
    double t = (double)iter / max_iter;
    int gray = (int)((1.0 - t) * 255); // whiter the furthest it was
    *r = *g = *b = gray;
}

int main() {
    int width = 800;
    int height = 600;
    int max_iter = 100;

    double x_min = -2.0, x_max = 1.0;
    double y_min = -1.2, y_max = 1.2;

    // PPM header (P3 = ASCII, width, height, max color value)
    printf("P3\n%d %d\n255\n", width, height);

    for (int py = 0; py < height; py++) {
        for (int px = 0; px < width; px++) {
            double cr = x_min + (x_max - x_min) * px / (width - 1);
            double ci = y_min + (y_max - y_min) * py / (height - 1);
            int iter = mandelbrot_iterations(cr, ci, max_iter);
            int r, g, b;
            get_color(iter, max_iter, &r, &g, &b);
            printf("%d %d %d ", r, g, b);
        }
        printf("\n");
    }
    return 0;
}