Final radius colouring.
authorClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 13:35:37 +0000 (13:35 +0000)
committerClaude Heiland-Allen <claude@mathr.co.uk>
Sat, 21 Dec 2013 13:35:37 +0000 (13:35 +0000)
commitbbd262f1df0b02d41c829800db414930c3f94e54
tree5d348530980cfe0ac9402ac5bcd5cf4213f7161e
parentbd7aa445bfe2b02a2883dccdb561c58dcc620aeb
Final radius colouring.

We've got the final z iterate, but we're only using the phase because
we weren't sure how to scale the magnitude.  We know the magnitude is
greater than the escape radius: |z_n| > R.  We also know that the previous
iterate's magnitude must have been less than R, otherwise we would have
broken out of the loop earlier: |z_{n-1}| <= R.  Combining with the definition
of the iteration, z_n = z_{n-1}^2 + c, and using the triangle inequality
|a+b| <= |a|+|b|, we get:

   R < |z_n| <= |z_{n-1}|^2 + |c| <= R^2 + |c|

If we make R bigger, so that |c| fades into insignificance, we get the
approximation  R < |z_n| <= R^2  , and taking base-R logarithms we get

   1 < log |z_n| / log R <= 2

Now we can subtract 1 to get a value in [0,1], which we know how to pack
into a 24bit PPM file.  We can use this for colouring, and we can vary
the escape radius to see how big it needs to be for the approximation to
give acceptable results:

    $ for er in 2 4 8 16 32 64 128 256 512 1024
      do
        ./render 0 0 4 ${er} ${er} &&
        ./colour ${er} > ${er}.ppm
      done
    $

Looking at the output images, it's clear that the approximation behaves
badly for small R, with glitches at the edges of the bands.  We also see
that the shapes change, with the cells formed by the angle colouring
becoming longer and thinner.  With the escape radius at 512, the cells
look almost square, and there are no visible gltiches.
colour.c
mandelbrot.h
render.c