Reputation: 678
%!PS-Adobe-3.0 EPSF-3.0
%%Title: L-System
%%Creator: (me)
%%BoundingBox: 0 0 500 500
%%EndComments
%
% %% BeginProlog ... %% EndProlog are document structuring comments
% to give definitions of new "resources" (operators, fonts, etc.)
%
% %% BeginResource ... %% EndResource encloses a resource
% as a set of operators (procset).
%
%%BeginProlog
%%BeginResource: procset (graphisme tortue) 1.0 0
% --------- definition of operations for turtle graphics
%
% The coordinate system follows the movements and turns of the turtle,
% so that the tourtue is always at the origin with the next rotates
% towards the X axis.
%
% Operations:
% T: move advances the turtle
% T: draw advances the turtle by drawing a line between the start and finish points
% T: turn turns the turtle's nose
/T: move% d T: move -
% advances the turtle by d (number --- positive, negative or 0)
{
0 translate % put the origin at this new position
} def
/T:draw % d T: draw -
% advance the turtle by d drawing a line
{
newpath
0 0 moveto
0 lineto
currentpoint
stroke
translate
} def
/T:turn % angle T: turn -
% turns the turtle's nose by the angle (in degrees)
{
rotate
} def
/T:init % x y angle T: init -
% initial state of the turtle
{
3 1 roll translate
rotate
} def
%%EndResource
%%BeginResource: procset (random rule) 1.0 0
realtime srand % random seed --- during tests, use a fixed value (e.g., 30 rand) if necessary for repeatability
/L: rnd % [op1 op2 ...] L.rnd -
% chooses an operator at random and executes it
% op1, op2 etc are names (start with /)
{
rand % random number between 0 and 2 ^ 31-1
1 index length % length of the array
mod % random number between 0 and len-1
get
cvx % conversion to executable
exec % execute
} def
%%EndResource
% ---------------- BEGIN
/L:d 1.5 def
/L:a 60 def
/L
{
dup 0 eq
{
L:d T:draw
pop
}{
1 sub
dup L
L:a T:turn
dup R
L:a T:turn
L:a T:turn
dup R
L:a neg T:turn
dup L
L:a neg T:turn
L:a neg T:turn
dup L
L
L:a neg T:turn
dup R
L:a T:turn
}ifelse
}def
/R
{
dup 0 eq
{
L:d T:draw
pop
}{
1 sub
L:a neg T:turn
dup L
L:a T:turn
dup R
dup R
L:a T:turn
L:a T:turn
dup R
L:a T:turn
dup L
L:a neg T:turn
L:a neg T:turn
dup L
L:a neg T:turn
R
}ifelse
}def
/omega
{
L
} def
%%EndResource
%%EndProlog
500 500
90
T:init
3
omega
%%EOF
Why is it not working? I try to run it with the default pdf viewer from mac OS and it says that it was unable to convert this eps file to a pdf (Which usually works).
This code is to be divided in three parts the first part is where the turtle operations are defined. We want this file to allow us to draw things on screen.
/T: move% d T: move -
% advances the turtle by d (number --- positive, negative or 0)
{
0 translate % put the origin at this new position
} def
/T:draw % d T: draw -
% advance the turtle by d drawing a line
{
newpath
0 0 moveto
0 lineto
currentpoint
stroke
translate
} def
/T:turn % angle T: turn -
% turns the turtle's nose by the angle (in degrees)
{
rotate
} def
/T:init % x y angle T: init -
% initial state of the turtle
{
3 1 roll translate
rotate
} def
%%EndResource
%%BeginResource: procset (random rule) 1.0 0
realtime srand % random seed --- during tests, use a fixed value (e.g., 30 rand) if necessary for repeatability
/L: rnd % [op1 op2 ...] L.rnd -
% chooses an operator at random and executes it
% op1, op2 etc are names (start with /)
{
rand % random number between 0 and 2 ^ 31-1
1 index length % length of the array
mod % random number between 0 and len-1
get
cvx % conversion to executable
exec % execute
} def
%%EndResource
The second part of this file is where I specify what is to be drawn. Which is based upon rules of a specified L-System.
/L:d 1.5 def
/L:a 60 def
/L
{
dup 0 eq
{
L:d T:draw
pop
}{
1 sub
dup L
L:a T:turn
dup R
L:a T:turn
L:a T:turn
dup R
L:a neg T:turn
dup L
L:a neg T:turn
L:a neg T:turn
dup L
L
L:a neg T:turn
dup R
L:a T:turn
}ifelse
}def
/R
{
dup 0 eq
{
L:d T:draw
pop
}{
1 sub
L:a neg T:turn
dup L
L:a T:turn
dup R
dup R
L:a T:turn
L:a T:turn
dup R
L:a T:turn
dup L
L:a neg T:turn
L:a neg T:turn
dup L
L:a neg T:turn
R
}ifelse
}def
/omega
{
L
} def
The third part of the file is where we call for something to be drawn
500 500
90
T:init
3
omega
%%EOF
It is normally supposed to draw a hexamaze.
Upvotes: 1
Views: 98
Reputation: 19504
/T: move
It looks like an extra space here is causing the interpreter to try to execute move
which is not defined. Same problem farther down:
/L: rnd
There should be no space when defining these names for the first time (and no space later when trying to call them).
Another possible issue I see is realtime
. In my experience interpreters (like ghostscript) usually don't give a useful result from this operator. In some situations like Unix systems, you can read from /dev/urandom
to get a good seed. But of course you can't do this in an EPS where file operators are forbidden.
If you're interested, I wrote some PS code to do L-Systems some time ago link. And more over on codegolf.
Upvotes: 1