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

为什么它不起作用?我尝试使用 mac OS 的默认 pdf 查看器运行它,它说它无法将此 eps 文件转换为 pdf(通常可以)。

这段代码分为三部分,第一部分是定义海龟操作的地方。我们希望这个文件允许我们在屏幕上绘制东西。

/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

该文件的第二部分是我指定要绘制的内容的地方。它基于指定的 L 系统的规则。

/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

文件的第三部分是我们要求绘制的地方

500 500
90
T:init

3
omega
%%EOF

它通常应该画一个hexamaze。

4

1 回答 1

1
/T: move 

看起来这里有一个额外的空间导致解释器尝试执行move未定义的执行。同样的问题更进一步:

/L: rnd 

第一次定义这些名称时不应有空格(以后尝试调用它们时也不应有空格)。

我看到的另一个可能的问题是realtime. 根据我的经验,解释器(如 ghostscript)通常不会从该运算符中给出有用的结果。在某些情况下,例如 Unix 系统,您可以读取 from/dev/urandom以获得良好的种子。但当然,您不能在禁止文件操作符的 EPS 中执行此操作。

如果你有兴趣,我前段时间写了一些 PS 代码来做 L-Systems链接。还有更多关于codegolf的内容。

于 2020-02-03T06:38:05.080 回答