The images generated by the complex functions shaders exhibit a number of
visible features.  These are briefly addressed here,  though only for the
built in colouring scheme.

These features are

  1 - Areas of smoothly varying colour
  2 - Sudden discontinuities in colour
  3 - Dark and white lines
  4 - Large white areas
  5 - Large black areas
  6 - "Noisy" or "speckled" areas
  7 - Movement

1 - Areas of smoothly varying colour

  In most cases the majority of the image will comprise one or more
  areas in which the colour smoothly varies across the area.  These
  colours are assigned according the the phase angle, i.e. theta in
  the R*exp(i*theta) representation, of the function's result.  The
  colours corresponging to 60 degree intervals are

       0 - Red
      60 - Yellow
     120 - Green
     180 - Cyan
     240 - Blue
     300 - Magenta
     360 - Red

  with the colours used for intermediate angles being  obtained  by
  interpolation.

2 - Sudden discontinuities in colour

  In general functions of a complex variable are multi-valued, i.e.
  for any z there will be more than one value for f(z). This is the
  case for functions in general, not just to complex functions, but
  is encountered more often for simple complex functions  than  for
  simple functions of real (ordinary) numbers.

  However, we can only use a single value of a multi-valued result,
  and the shader only calculates a single value. If we could handle
  all of the values for a multi-valued function we would  find  the
  colouration would be continuous at all but a few isolated points,
  but that in order to do this we would need to plot the results on
  several, in some cases an infinite number, of  connected "sheets"
  that wind around the isolated points mentioned  above.  Sometimes
  this winding could be represented as three dimensional helix, but
  in general the situation is more complicated and would need  more
  than three dimensions to represent.

  By restricting ourselves to just a single value of a multi-valued 
  function result we slect a single sheet of the results, in effect
  cutting it from the other sheets. These cuts are then seen in the
  final image as discontinuities in the smooth colouration.

  For another set of colour disconinuities see section 5 below.

3 - Dark and white lines

  If, as is the case for most of the example scenes,  contours have
  been enabled these will show up in the final  image  as  sets  of 
  dark lines and white lines overlaying the smooth colouration. The
  dark contours correspond to lines of equal x or equal y  for  the
  function result and the white lines correspond to lines of  equal
  R or equal theta, though in most examples the theta contours have
  been suppressed.

  Note, in most cases the contours are not equaly  spaced  as  this 
  would cause them to be very crowded in those areas  of  the  that
  correspond to peaks,  often infinitly high,  in  the value of the
  function.  To  avoid problems with this the contours are normally
  determined only after applying a mapping  function  that  reduces 
  the size of infinite peaks to some finite value. 

  Note, the contours are rendered as fuzzy lines which reach their
  most intense dark or white at the actual contour line. The width
  of these lines depends on the slope of the function such that if
  the function is slowly varying in the direction perpendicular to
  the contour line then the contour will be broad while thin lines
  correspond to places where the function is rapidly varying. Most
  often very broad lines will correspond to the bottom of a trough
  or the top of a ridge.

4 - Large black areas

  When evaluating a function the shader may sometimes  encounter  a
  situation where it is impossible to calculate a  result,  e.g. it
  may need to evaluate 0.0/0.0 - which does not have a well defined
  result. In these cases the IEEE floating point arithmetic used by
  the GPU delivers a special value called NaN,  standing for "Not A
  Number". As these are not numbers they can not sensibly used with
  the normal colouring algorithm and are instead represented in the
  output in the NanColour, which defaults to transparent - which is
  seen as black in most of the examples because there is nothing to
  be seen behind them, except in the "simple box" scenes.

  Although the NaN induced black areas are fundamentaly due   to  a
  a limitation in the shader's capabilities and may be regarded  as
  defects I find them,  in most cases,  quite aestheticly pleasing.
  However, unlike the rest of the image,  these areas may vary with
  the type of GPU used, in particular with how it handles "denorms"
  values  -  see separate file describing floating point arithmetic
  for the meaning of "denorms".

  A second source of black areas is those areas that are  discarded
  due to any domain trimming that has been selected for the  scene.
  These are rendered using the TrimColour  that  also  defaults  to
  transparent.

  In some cases the edges of a black area may be jagged due to loss
  of precision in the calculations used to create it. This can also
  be seen in other parts of the image but is most commonly seen  at
  the edges of areas of NaNs.  A particularly annoying case of this
  seen in some of the images where there is a  somewhat  rough  cut
  along part of the X axis, which is then exagerated if PrePower is
  greater than 1.0.

5 - Large white areas

  In the images geneated for some functions there are  large  white
  areas.  These are usualy extreme examples of contour lines and in
  most cases will correspond to "flat" areas for which the value of
  R is either 0.0 or infinity.  It should be noted that the limited
  precision of floating point numbers means that all floating point
  numbers above some large threshold value are integers,  hence  if
  contours are drawn at integer multiples then all points in  areas
  where R is large will be on a contour.

  Another cause of solid white areas,  especialy  those bordering a
  areas due to NaNs, correspond to areas where the function has the
  form a/b where a and b are both very small.  Consider the case of
  a region where a and b are slowly tending towards  0.0,  in  some
  region both will be reounded down to 0.0 and the result will be a
  Nan, but just outside of this region we may have eps / 0.0 (where
  eps is the smallest floating point value) which elavuates to inf,
  which will typically be rendered as white, or eps/eps = 1.0 which
  again will typically be rendered as white,  or 2*eps/eps = 2.0 or
  0.0/eps etc. all of which being exact integers will typically  be
  rendered as white. Though these white areas are the result of the
  contour colouring they are somewhat spurious being due to the way
  in which small numbers get rounded.  They  can, in most cases, be
  distinguished from real wide contours by having sharp  boundaries
  and because they border black Nan areas.

  Large white areas can also be the result of specifying white  for
  the TrimColour, as used in the Simple Room and Simple Box scenes,
  or for the NanColour.

6 - "Noisy" or "speckled" areas

  Noisy or speckled areas of the images correspond to  areas  where
  the image is varying more quickly  than  the  resolution  of  the 
  display can accomodate. There are two main reasons for this

     a - contour lines being crowded together.

     b - regions where the image comprises many
         tiny repetions of a common pattern.

   The first of these will normaly only occur if ContourMode 1 or a
   high contour density has been explicitly selected - the defaults
   for contour rendering being chosen to  avoid  the  problem.  The
   second is normaly only seen when functions are iterated.

7 - Movement

  There are two sources of movement within the images, not counting
  movement of the whole image due to animate clauses in  the  scene
  files (such as the rotations in the "simple box" scenes).   These
  are

     a - Time dependant phase for the function value.

     b - Morphing between functions.

  The first arises from replacing theta in the R*exp(i*theta)  with
  the time dependant R*exp(i*(theta+w*t)) where w is a constant and
  t is time. This causes the colours used to represent the phase to
  continuously change taking the dark (x,y) contours with them. The
  effect seen is that of continuous rotations  about  one  or  more
  points involving the colours, (x,y) and theta contours if enabled
  but not the white R contours. The effect is rather mechanical due
  to its repetitive nature.

  The second source of movement within the images arises  when  the
  option to transition between functions by interpolation is  used.
  In this case, during the transition periods,  the  function being
  plotted is of the form f2(z)*a + f1(z)*(1-a) where a  is  0.0  at
  the start of the transition and rises to 1.0  at  the  end.  This
  causes all parts of the image to change with time,  including the
  R contours.  The  effect is less mechanical than that due to just
  changing the phase of the result, and is often rather "organic".
