Breaking
Down Fractals With Postscript
In this tutorial, we will use what we have learned in the previous tutorials
to break down what is happening in a couple fractal files. A text editor
will be used to write postscript (notepad is sufficient). GSview will
also be used to view our files.

What is a Fractal?
We will use the following definition:
Term coined by Benoit Mandelbrot in 1975, referring to objects built
using recursion, where some aspect of the limiting object is infinite
and another is finite, and where at any iteration, some piece of the
object is a scaled down version of the previous iteration.

Siepenski Triangle
Lets start by viewing some code:

%!

% Sierpinski gasket

% By John Fouhy.

/maxdepth 10 def

/length 500 def

/xoff 60 def

/yoff 300 def

/root3 1.7320508 def

% draw a (roughly) equilateral triangle

/triangle { newpath x y moveto a 0 rlineto 120 rotate a 0 rlineto
240 rotate closepath stroke } def

% usage: a x y depth rec

% where a is the side length, (x,y) are the coords of the lower
left corner, and depth is the recursion depth

/rec {

/depth exch def

/y exch def /x exch def /a exch def

triangle

depth maxdepth lt

{

/newa a 2 div def

/newdepth depth 1 add def

newa x y newdepth

newa x a 4 div add y root3 a mul 4 div add newdepth

newa x newa add y newdepth rec rec rec

}

if

} def

0 setlinewidth

length xoff yoff 1 rec

showpage

The code is fairly straight-forward here.

Fern

This is a little more difficult to understand (Let me know what you
figure out after you take linear algebra):

%!PS-Adobe-1.0

%%Title:Random Fern

%%Creator:Eric Wicklund

% Last modified: MLO 02 Jan 1993 11:24:14

/m1 [ 0.00 0.00 0.00 0.16 0.00 0.00 ] def

/m2 [ 0.85 -0.04 0.04 0.85 0.00 1.60 ] def

/m3 [ 0.20 0.23 -0.26 0.22 0.00 1.60 ] def

/m4 [ -0.15 0.26 0.28 0.24 0.00 0.44 ] def

/point 72 def

/length 0 def

%%EndProlog

%%Page: 1 1

/zzz save def

% will draw inside a 8 inch square centered on 8.5 by 11 inch page

4.25 point mul 1.5 point mul translate

0.8 point mul dup scale

% x coordinate ranges from -5 to 5

% y coordinate ranges from 0 to 10

1 setlinecap

0.005 setlinewidth

% First point at origin

0 0

300000 {

% Pick a transformation matrix probabilistically

/r rand 100 mod def

r 1 lt { /m m1 def }

{ r 86 lt { /m m2 def }

{ r 93 lt { /m m3 def }

{ /m m4 def } ifelse } ifelse } ifelse

% Make a linear transformation, then

% plot a point at current location

m transform 2 copy moveto

length length rlineto

stroke

} repeat

showpage

zzz restore

%%Trailer

That's all folks!