Mandelbrot program

The Mandelbrot set is a fascinating example of a fractal complexity that can be generated from a very simple equation: z = z*z + c. Here is a program to generate an image of the Mandelbrot set:

/*
A program to generate an image of the Mandelbrot set.

Usage: ./mandelbrot > output
where "output" will be a binary image, 1 byte per pixel
The program will print instructions on stderr as to how to
process the output to produce a JPG file.

Michael Ashley / UNSW / 13-Mar-2003
*/

// Define the range in x and y here:

const double yMin = -1.0;
const double yMax = +1.0;
const double xMin = -2.0;
const double xMax = +0.5;

// And here is the resolution:

const double dxy = 0.005;

#include <stdio.h>
#include <limits.h>

int main(void) {

double cx, cy;
double zx, zy, new_zx;
unsigned char n;
int nx, ny;

// The Mandelbrot calculation is to iterate the equation
// z = z*z + c, where z and c are complex numbers, z is initially
// zero, and c is the coordinate of the point being tested. If
// the magnitude of z remains less than 2 for ever, then the point
// c is in the Mandelbrot set. We write out the number of iterations
// before the magnitude of z exceeds 2, or UCHAR_MAX, whichever is
// smaller.

for (cy = yMin; cy < yMax; cy += dxy) {
for (cx = xMin; cx < xMax; cx += dxy) {
zx = 0.0;
zy = 0.0;
n = 0;
while ((zx*zx + zy*zy < 4.0) && (n != UCHAR_MAX)) {
new_zx = zx*zx - zy*zy + cx;
zy = 2.0*zx*zy + cy;
zx = new_zx;
n++;
}
write (1, &n, sizeof(n)); // Write the result to stdout
}
}

// Now calculate the image dimensions. We use exactly the same
// for loops as above, to guard against any potential rounding errors.

nx = 0;
ny = 0;
for (cx = xMin; cx < xMax; cx += dxy) {
nx++;
}
for (cy = yMin; cy < yMax; cy += dxy) {
ny++;
}

fprintf (stderr, "To process the image: convert -depth 8 -size %dx%d gray:output out.jpg\n",
nx, ny);
return 0;
}

If you enjoyed that, have a look for the program "fracint" for Windows machines, and "mxp" for GNU/Linux. Here are some examples from "mxp", showing the complete Mandelbrot set first, and then enlargements of various sections of it:

The following is an improved version of the above program, using integer arithmetic in the "for" loop, to guarantee the size of the image.

/*
A program to generate an image of the Mandelbrot set.

Usage: ./mandelbrot > output
where "output" will be a binary image, 1 byte per pixel
The program will print instructions on stderr as to how to
process the output to produce a JPG file.

Michael Ashley / UNSW / 13-Mar-2003
*/

const double xCentre = -0.75;
const double yCentre = +0.0;
const int nx = 400;
const int ny = 400;

const double dxy = 0.005;

#include <stdio.h>
#include <limits.h>

int main() {

double cx, cy;
double zx, zy, new_zx;
unsigned char n;
int i, j;

// The Mandelbrot calculation is to iterate the equation
// z = z*z + c, where z and c are complex numbers, z is initially
// zero, and c is the coordinate of the point being tested. If
// the magnitude of z remains less than 2 for ever, then the point
// c is in the Mandelbrot set. We write out the number of iterations
// before the magnitude of z exceeds 2, or UCHAR_MAX, whichever is
// smaller.

for (j = 0; j < ny; j++) {
cy = yCentre + (j - ny/2)*dxy;
for (i = 0; i < nx; i++) {
cx = xCentre + (i - nx/2)*dxy;
zx = 0.0;
zy = 0.0;
n = 0;
while ((zx*zx + zy*zy < 4.0) && (n != UCHAR_MAX)) {
new_zx = zx*zx - zy*zy + cx;
zy = 2.0*zx*zy + cy;
zx = new_zx;
n++;
}
write (1, &n, sizeof(n)); // Write the result to stdout
}
}

fprintf (stderr, "To process the image: convert -depth 8 -size %dx%d gray:output out.jpg\n",
nx, ny);
return 0;
}


And here is a version using the C-99 complex numbers:
/*
A program to generate an image of the Mandelbrot set.

Usage: ./mandelbrot > output
where "output" will be a binary image, 1 byte per pixel
The program will print instructions on stderr as to how to
process the output to produce a JPG file.

Michael Ashley / UNSW / 23-Apr-2004
*/

const double xCentre = -0.75;
const double yCentre = +0.0;
const int nx = 400;
const int ny = 400;

const double dxy = 0.005;

#include <stdio.h>
#include <unistd.h>
#include <limits.h>
#include <complex.h>

int main() {

double complex c, z;
unsigned char n;
int i, j;

// The Mandelbrot calculation is to iterate the equation
// z = z*z + c, where z and c are complex numbers, z is initially
// zero, and c is the coordinate of the point being tested. If
// the magnitude of z remains less than 2 for ever, then the point
// c is in the Mandelbrot set. We write out the number of iterations
// before the magnitude of z exceeds 2, or UCHAR_MAX, whichever is
// smaller.

for (j = 0; j < ny; j++) {
for (i = 0; i < nx; i++) {
c = xCentre + (i - nx/2)*dxy + I * (yCentre + (j - ny/2)*dxy);
z = 0.0;
n = 0;
while ((cabs(z) < 2.0) && (n != UCHAR_MAX)) {
z = z*z + c;
n++;
}
write(1, &n, sizeof(n)); // Write the result to stdout
}
}

fprintf (stderr, "To process the image: convert -depth 8 -size %dx%d gray:output out.jpg\n",
nx, ny);
return 0;
}