Previous: , Up: Samples   [Index]


1.4.3 Fractal Image Output

# Write a Mandelbrot PGM image, square, of specified size, on standard output.

# byte buffer
data b;
file f;
integer w, h;
integer i, iter, x, y;
real Zr, Zi, Cr, Ci, Tr, Ti;

f_open(f, "/dev/stdout", OPEN_WRITEONLY, 0);

# N is (to be) provided externally, it is the size of the image

w = N;
h = N;

# resize the byte buffer
b_size(b, N);

iter = 50;

# write the PGM header 
f_plan(f, "P5\n", N, " ", N, "\n", 255, "\n");

y = 0;
while (y < h) {
    Ci = (2r * y / h - 1);

    x = 0;
    while (x < w) {
        Zr = 0;
	Zi = 0;
	Tr = 0;
	Ti = 0;
        Cr = 2r * x / w;
	Cr -= 1.5;

	i = iter;
        while (i && Tr + Ti < 4) {
	    Zi *= 2;
            Zi = Zr * Zi + Ci;
            Zr = Tr - Ti + Cr;
            Tr = Zr * Zr;
            Ti = Zi * Zi;

	    i -= 1;
        }

	# set pixel in line, sort of:
	# b[x] = ?
	if (4 < Tr + Ti) {
	    b_replace(b, x, 255);
	} else {
	    b_replace(b, x, 0);
	}

	x += 1;
    }

    # write line
    f_data(f, b);

    y += 1;
}

Run as:

aime FILE integer N 256 > fractal.pgm