ppmforge - fractal forgeries of clouds, planets, and starry skies


   ppmforge [-clouds] [-night] [-dimension dimen] [-hour hour]
            [-inclination|-tilt angle] [-mesh size] [-power factor]
            [-glaciers level] [-ice level] [-saturation sat] [-seed seed]
            [-stars fraction] [-xsize|-width width] [-ysize|-height


   ppmforge  generates  three  kinds  of ``random fractal forgeries,'' the
   term coined by Richard F. Voss of the IBM  Thomas  J.  Watson  Research
   Center for seemingly realistic pictures of natural objects generated by
   simple algorithms embodying  randomness  and  fractal  self-similarity.
   The techniques used by ppmforge are essentially those given by Voss[1],
   particularly the technique of  spectral  synthesis  explained  in  more
   detail by Dietmar Saupe[2].

   The  program  generates  two varieties of pictures: planets and clouds,
   which are just different renderings of data generated in  an  identical
   manner,  illustrating  the unity of the fractal structure of these very
   different  objects.   A  third  type  of  picture,  a  starry  sky,  is
   synthesised directly from pseudorandom numbers.

   The  generation  of planets or clouds begins with the preparation of an
   array of random data in the frequency domain.  The size of this  array,
   the  ``mesh  size,''  can  be set with the -mesh option; the larger the
   mesh the more realistic the  pictures  but  the  calculation  time  and
   memory  requirement  increases  as  the  square  of the mesh size.  The
   fractal dimension, which you can specify with  the  -dimension  option,
   determines  the  roughness of the terrain on the planet or the scale of
   detail in the clouds.  As the fractal dimension is increased, more high
   frequency components are added into the random mesh.

   Once  the  mesh  is  generated,  an  inverse  two  dimensional  Fourier
   transform is performed upon it.   This  converts  the  original  random
   frequency  domain  data  into  spatial  amplitudes.   We scale the real
   components that result from the Fourier transform into numbers  from  0
   to  1  associated  with each point on the mesh.  You can further modify
   this number by applying a ``power law scale'' to  it  with  the  -power
   option.    Unity  scale leaves the numbers unmodified; a power scale of
   0.5 takes the square root of the numbers in the  mesh,  while  a  power
   scale  of  3  replaces the numbers in the mesh with their cubes.  Power
   law scaling is best envisioned by thinking of the data as  representing
   the  elevation  of  terrain;  powers  less than 1 yield landscapes with
   vertical scarps that look like glacially-carved valleys; powers greater
   than  one  make fairy-castle spires (which require large mesh sizes and
   high resolution for best results).

   After these calculations,  we  have  a  array  of  the  specified  size
   containing  numbers  that range from 0 to 1.  The pixmaps are generated
   as follows:

   Clouds    A colour map is created that ranges from pure blue  to  white
             by  increasing  admixture  (desaturation) of blue with white.
             Numbers less than 0.5 are coloured blue, numbers between  0.5
             and 1.0 are coloured with corresponding levels of white, with
             1.0 being pure white.

   Planet    The mesh is projected onto a sphere.  Values  less  than  0.5
             are  treated as water and values between 0.5 and 1.0 as land.
             The water areas are coloured based upon the water depth,  and
             land  based on its elevation.  The random depth data are used
             to  create   clouds   over   the   oceans.    An   atmosphere
             approximately  like  the  Earth's  is  simulated;  its  light
             absorption is calculated to create a  blue  cast  around  the
             limb  of the planet.  A function that rises from 0 to 1 based
             on latitude is modulated by the local elevation  to  generate
             polar   ice  caps--high  altitude  terrain  carries  glaciers
             farther from the pole.  Based on the  position  of  the  star
             with  respect  to  the  observer, the apparent colour of each
             pixel of the planet is calculated  by  ray-tracing  from  the
             star  to  the  planet to the observer and applying a lighting
             model that sums ambient light  and  diffuse  reflection  (for
             most  planets ambient light is zero, as their primary star is
             the only source of illumination).  Additional random data are
             used to generate stars around the planet.

   Night     A  sequence of pseudorandom numbers is used to generate stars
             with a user specified density.

   Cloud pictures always contain 256 or fewer colours and may be displayed
   on  most  colour  mapped  devices  without  further processing.  Planet
   pictures often contain tens of  thousands  of  colours  which  must  be
   compressed  with  ppmquant  or  ppmdither  before  encoding in a colour
   mapped format.  If the display resolution  is  high  enough,  ppmdither
   generally  produces  better  looking planets.  ppmquant tends to create
   discrete  colour  bands,  particularly  in  the   oceans,   which   are
   unrealistic  and  distracting.   The  number  of  colours in starry sky
   pictures  generated  with  the  -night  option  depends  on  the  value
   specified  for  -saturation.  Small values limit the colour temperature
   distribution of the stars and reduce  the  number  of  colours  in  the
   image.   If  the  -saturation  is  set  to 0, none of the stars will be
   coloured and the resulting image  will  never  contain  more  than  256
   colours.   Night  sky  pictures  with many different star colours often
   look best when colour compressed by pnmdepth rather  than  ppmquant  or
   ppmdither.   Try  newmaxval  settings of 63, 31, or 15 with pnmdepth to
   reduce the number of colours in the picture to 256 or fewer.


   -clouds   Generate clouds.  A pixmap of fractal  clouds  is  generated.
             Selecting  clouds  sets  the default for fractal dimension to
             2.15 and power scale factor to 0.75.

   -dimension dimen
             Sets the fractal dimension to the specified dimen, which  may
             be  any floating point value between 0 and 3.  Higher fractal
             dimensions create  more  ``chaotic''  images,  which  require
             higher  resolution  output and a larger FFT mesh size to look
             good.  If  no  dimension  is  specified,  2.4  is  used  when
             generating planets and 2.15 for clouds.

   -glaciers level
             The floating point level setting controls the extent to which
             terrain elevation causes ice to appear  at  lower  latitudes.
             The  default value of 0.75 makes the polar caps extend toward
             the equator across high terrain and  forms  glaciers  in  the
             highest  mountains,  as  on  Earth.   Higher  values make ice
             sheets  that  cover  more  and  more  of  the  land  surface,
             simulating  planets in the midst of an ice age.  Lower values
             tend to be boring, resulting  in  unrealistic  geometrically-
             precise ice cap boundaries.

   -hour hour
             When generating a planet, hour is used as the ``hour angle at
             the  central  meridian.''   If  you  specify  -hour  12,  for
             example,  the planet will be fully illuminated, corresponding
             to high noon at the longitude at the centre  of  the  screen.
             You can specify any floating point value between 0 and 24 for
             hour, but values which place most of the planet  in  darkness
             (0  to  4  and  20  to  24)  result in crescents which, while
             pretty, don't give you many illuminated pixels for the amount
             of   computing  that's  required.   If  no  -hour  option  is
             specified, a random hour angle is chosen, biased so that only
             25% of the images generated will be crescents.

   -ice level
             Sets  the  extent of the polar ice caps to the given floating
             point level.  The default level  of  0.4  produces  ice  caps
             similar  to  those  of  the Earth.  Smaller values reduce the
             amount  of  ice,  while  larger  -ice  settings  create  more
             prominent  ice  caps.  Sufficiently large values, such as 100
             or more, in conjunction with  small  settings  for  -glaciers
             (try 0.1) create ``ice balls'' like Europa.

   -inclination|-tilt angle
             The  inclination  angle  of  the  planet  with  regard to its
             primary star is set to angle, which can be any floating point
             value  from  -90 to 90.  The inclination angle can be thought
             of as specifying, in degrees, the ``season''  the  planet  is
             presently  experiencing  or,  more precisely, the latitude at
             which the star transits the zenith at local noon.  If 0,  the
             planet  is  at  equinox; the star is directly overhead at the
             equator.  Positive values represent summer  in  the  northern
             hemisphere,   negative   values   summer   in   the  southern
             hemisphere.  The Earth's inclination angle, for  example,  is
             about  23.5 at the June solstice, 0 at the equinoxes in March
             and September, and -23.5 at the  December  solstice.   If  no
             inclination  angle is specified, a random value between -21.6
             and 21.6 degrees is chosen.

   -mesh size
             A mesh of size by size will be  used  for  the  fast  Fourier
             transform   (FFT).    Note   that   memory  requirements  and
             computation speed increase as the  square  of  size;  if  you
             double  the  mesh  size,  the program will use four times the
             memory and run four times  as  long.   The  default  mesh  is
             256x256,  which  produces  reasonably  good  looking pictures
             while using half a megabyte for the 256x256 array  of  single
             precision  complex  numbers required by the FFT.  On machines
             with limited memory capacity, you may have to reduce the mesh
             size  to  avoid running out of RAM.  Increasing the mesh size
             produces better  looking  pictures;  the  difference  becomes
             particularly   noticeable  when  generating  high  resolution
             images with relatively high fractal dimensions  (between  2.2
             and 3).

   -night    A starry sky is generated.  The stars are created by the same
             algorithm used for the stars that surround  planet  pictures,
             but the output consists exclusively of stars.

   -power factor
             Sets   the   ``power   factor''   used  to  scale  elevations
             synthesised from the FFT to factor, which can be any floating
             point  number greater than zero.  If no factor is specified a
             default of 1.2 is used if a planet  is  being  generated,  or
             0.75  if  clouds  are  selected  by  the -clouds option.  The
             result of the FFT image synthesis is an  array  of  elevation
             values   between   0   and   1.   A  non-unity  power  factor
             exponentiates each  of  these  elevations  to  the  specified
             power.   For example, a power factor of 2 squares each value,
             while a power factor of 0.5 replaces  each  with  its  square
             root.   (Note  that  exponentiating  values  between  0 and 1
             yields values that remain within that range.)  Power  factors
             less  than  1  emphasise large-scale elevation changes at the
             expense of small variations.  Power factors  greater  than  1
             increase  the roughness of the terrain and, like high fractal
             dimensions, may require a larger FFT mesh size and/or  higher
             screen resolution to look good.

   -saturation sat
             Controls  the  degree  of colour saturation of the stars that
             surround planet pictures and fill starry skies  created  with
             the  -night  option.   The default value of 125 creates stars
             which resemble the sky as seen by the human eye from  Earth's
             surface.   Stars  are  dim;  only  the brightest activate the
             cones in the human retina, causing colour  to  be  perceived.
             Higher values of sat approximate the appearance of stars from
             Earth  orbit,  where  better  dark  adaptation,  absence   of
             skyglow,  and  the  concentration  of light from a given star
             onto a smaller area of the  retina  thanks  to  the  lack  of
             atmospheric  turbulence  enhances  the  perception of colour.
             Values greater than  250  create  ``science  fiction''  skies
             that, while pretty, don't occur in this universe.

             Thanks  to the inverse square law combined with Nature's love
             of mediocrity, there are  many,  many  dim  stars  for  every
             bright  one.   This  population  relationship  is  accurately
             reflected in the skies created by ppmforge.   Dim,  low  mass
             stars   live   much   longer   than   bright  massive  stars,
             consequently there are many  reddish  stars  for  every  blue
             giant.   This relationship is preserved by ppmforge.  You can
             reverse the proportion, simulating  the  sky  as  seen  in  a
             starburst galaxy, by specifying a negative sat value.

   -seed num Sets  the seed for the random number generator to the integer
             num.  The seed used to create each picture  is  displayed  on
             standard  output  (unless suppressed with the -quiet option).
             Pictures generated with the same seed will be identical.   If
             no  -seed  is  specified, a random seed derived from the date
             and time will be chosen.  Specifying an explicit seed  allows
             you  to re-render a picture you particularly like at a higher
             resolution or with different viewing parameters.

   -stars fraction
             Specifies the percentage of pixels, in tenths of  a  percent,
             which  will  appear  as stars, either surrounding a planet or
             filling the entire frame if -night is specified.  The default
             fraction is 100.

   -xsize|-width width
             Sets  the  width of the generated image to width pixels.  The
             default width is 256 pixels.  Images must be at least as wide
             as  they  are  high;  if  a  width  less  than  the height is
             specified, it will be increased to equal the height.  If  you
             must  have  a  long  skinny  pixmap,  make  a square one with
             ppmforge, then use pnmcut to extract a portion of  the  shape
             and size you require.

   -ysize|-height height
             Sets the height of the generated image to height pixels.  The
             default height  is  256  pixels.   If  the  height  specified
             exceeds  the  width, the width will be increased to equal the

   All flags can be abbreviated to their shortest unique prefix.


   The algorithms require the output pixmap to be at least as wide  as  it
   is  high,  and  the  width  to  be  an  even  number  of pixels.  These
   constraints are enforced by increasing the size of the requested pixmap
   if necessary.

   You  may  have  to  reduce  the  FFT  mesh size on machines with 16 bit
   integers and segmented pointer architectures.


   pnmcut(1), pnmdepth(1), ppmdither(1), ppmquant(1), ppm(5)

   [1]  Voss, Richard F., ``Random Fractal Forgeries,''  in  Earnshaw  et.
        al.,   Fundamental   Algorithms  for  Computer  Graphics,  Berlin:
        Springer-Verlag, 1985.

   [2]  Peitgen, H.-O., and Saupe, D. eds., The Science Of Fractal Images,
        New York: Springer Verlag, 1988.


        John Walker
        Autodesk SA
        Avenue des Champs-Montants 14b
        CH-2074 MARIN
        Usenet:  kelvin@Autodesk.com
        Fax:     038/33 88 15
        Voice:   038/33 76 33

   Permission  to  use, copy, modify, and distribute this software and its
   documentation for any  purpose  and  without  fee  is  hereby  granted,
   without any conditions or restrictions.  This software is provided ``as
   is'' without express or implied warranty.

   PLUGWARE!  If you like this kind of stuff, you may also  enjoy  ``James
   Gleick's  Chaos--The  Software''  for MS-DOS, available for $59.95 from
   your local software  store  or  directly  from  Autodesk,  Inc.,  Attn:
   Science   Series,   2320  Marinship  Way,  Sausalito,  CA  94965,  USA.
   Telephone: (800) 688-2344 toll-free or, outside the U.S. (415) 332-2344
   Ext  4886.   Fax:  (415)  289-4718.  ``Chaos--The Software'' includes a
   more comprehensive  fractal  forgery  generator  which  creates  three-
   dimensional  landscapes  as  well as clouds and planets, plus five more
   modules which explore other aspects of Chaos.  The user guide  of  more
   than  200  pages  includes an introduction by James Gleick and detailed
   explanations by Rudy Rucker of the mathematics and algorithms  used  by
   each program.

                            25 October 1991                    ppmforge(1)


Personal Opportunity - Free software gives you access to billions of dollars of software at no cost. Use this software for your business, personal use or to develop a profitable skill. Access to source code provides access to a level of capabilities/information that companies protect though copyrights. Open source is a core component of the Internet and it is available to you. Leverage the billions of dollars in resources and capabilities to build a career, establish a business or change the world. The potential is endless for those who understand the opportunity.

Business Opportunity - Goldman Sachs, IBM and countless large corporations are leveraging open source to reduce costs, develop products and increase their bottom lines. Learn what these companies know about open source and how open source can give you the advantage.

Free Software

Free Software provides computer programs and capabilities at no cost but more importantly, it provides the freedom to run, edit, contribute to, and share the software. The importance of free software is a matter of access, not price. Software at no cost is a benefit but ownership rights to the software and source code is far more significant.

Free Office Software - The Libre Office suite provides top desktop productivity tools for free. This includes, a word processor, spreadsheet, presentation engine, drawing and flowcharting, database and math applications. Libre Office is available for Linux or Windows.

Free Books

The Free Books Library is a collection of thousands of the most popular public domain books in an online readable format. The collection includes great classical literature and more recent works where the U.S. copyright has expired. These books are yours to read and use without restrictions.

Source Code - Want to change a program or know how it works? Open Source provides the source code for its programs so that anyone can use, modify or learn how to write those programs themselves. Visit the GNU source code repositories to download the source.


Study at Harvard, Stanford or MIT - Open edX provides free online courses from Harvard, MIT, Columbia, UC Berkeley and other top Universities. Hundreds of courses for almost all major subjects and course levels. Open edx also offers some paid courses and selected certifications.

Linux Manual Pages - A man or manual page is a form of software documentation found on Linux/Unix operating systems. Topics covered include computer programs (including library and system calls), formal standards and conventions, and even abstract concepts.