Colour images.
authorClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 01:32:05 +0000 (01:32 +0000)
committerClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 01:32:05 +0000 (01:32 +0000)
commit702198f081c208957d77323fac0b713c131ab422
tree7e5da318c23aa6920fdbe26e29fd7bc6cfdc212d
parent4ecccb39c916dca81a60860029b23aeb62a2a1b7
Colour images.

So far our images have progressed from black and white to greyscale,
with the grey level based on the escape time.  We're writing PGM files,
part of the PNM family of formats, and this family include PPM which
supports colour.  The text header for PPM is very similar to PGM, with
the magic number P6 in place of PGM's P5.  With the maxval of 255 that
we are using, each pixel has 3 bytes, for the red, green and blue colour
channels (in that order, tightly packed).

We rename our existing render to render_grey, and write a new
render_colour to output the modified header and pixel data.  Between
calculating the escape time and outputting the pixel data, we need
to turn the linear value into a point in 3D colour space.  About the
simplest way to do this is to vary the speed at which the output colour
channels change with respect to the input value.  We define a colour()
function in the mandelbrot.h header because it doesn't depend on the
floating point type used for calculations, and make the red channel
change more quickly and the blue channel chnage more slowly.

In the main program we handle another command line argument, to switch
between greyscale rendering and colour rendering.  With 3 number types
and 2 colour types, we have ended up with 6 render functions to choose
from in our now-nested switch statements.  We increase the maximum
iteration limit to show more detail near the main body of the Mandelbrot
set, and switch the default number type to double because it is both
faster and more precise than float (though we still need to choose the
float type argument if we want to specify a colour type).

Now let's render a sequence of images zooming in towards a miniature
copy within the Mandelbrot set, to compare colour with greyscale:

    $ time for exp in $(seq -w 0 15)
      do
        ./mandelbrot \
          -1.759937295271429505091916757 0.012591790526496335594898047 \
          2e-${exp} 2 0 > ${exp}-grey.pgm
        ./mandelbrot \
          -1.759937295271429505091916757 0.012591790526496335594898047 \
          2e-${exp} 2 1 > ${exp}-colour.ppm
      done
    real    7m41.621s
    user    7m40.925s
    sys     0m0.492s

This is a bash shell script, which loops over the sequence of numbers from
0 to 15, and each pass through the loop it runs our program twice, using the
number as radius exponent, once for greyscale and once for colour.  We end
up with 32 images to browse through.
mandelbrot.c
mandelbrot.h
mandelbrot_imp.c