BreezeWind
BreezeWind

Reputation: 678

Why is this postscript code not drawing anything?

%!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

Answers (1)

luser droog
luser droog

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

Related Questions