Table of Contents
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 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 height.
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)
- Voss, Richard F., ``Random Fractal Forgeries,'' in Earnshaw et. al., Fundamental
Algorithms for Computer Graphics, Berlin: Springer-Verlag, 1985.
- 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
Suisse/Schweiz/Svizzera/Svizra/Switzerland
- Usenet:kelvin@Autodesk.comFax:038/33 88 15Voice: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.
Table of Contents