#include // 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; }