我怎么旋转?

时间:2016-03-25 15:49:35

标签: rotation ghostscript postscript

如何只旋转我的代码的一部分'

我的代码:

%!

/Helvetica findfont 8 scalefont setfont
/ang1 {-141} def
/ang2 {-2 ang1 mul} def
/linelen {36} def
/depth {0} def
/down {/depth depth 1 add def} def
/up {/depth depth 1 sub def} def


/CrownPos
{
    /x {300} def
    /y {300} def
    x y moveto
} def

/DoLine 
{ 
    rotation rotate
    0 linelen rlineto 
    currentpoint stroke 
    translate 0 0 moveto 
} def

/Print
{ 
    gsave 
    .62 .62 scale
    2 setlinewidth
    down 0 DoLine
    depth 8 le
    {
        ang1 rotate Print
            ang2 rotate Print
    } if
    up
    grestore 
} def

/Crown
{
    /rotation {0} def
    CrownPos Print
    stroke
    /rotation {270} def
    CrownPos Print
    stroke
    /rotation {90} def
    CrownPos Print
    stroke
} def



    Crown
    0 -25 translate
    Crown 
    showpage

我想将我的下冠旋转180度,所有内容都显示在附带的图片上

它给了我这样的东西: original
enter image description here

但我想要这样的东西: after rotation
enter image description here

1 个答案:

答案 0 :(得分:2)

您的代码是特殊的'至少,您正在以奇怪且可能性能下降的方式使用过程(可执行数组)。你有这样的代码:

/depth {0} def

这将创建一个可执行数组,在执行时,将0置于操作数堆栈上。它会更简单,解释器通常会更快地执行它,以便:

/depth 0 def

我认为你并没有真正掌握PostScript的基于堆栈的操作。

您在/ Print中有一个程序也有错误:

down 0 DoLine

执行' down',然后将0置于操作数堆栈上,然后执行' DoLine'。然而,没有任何东西可以删除' 0'来自操作数堆栈。在程序结束时,操作数堆栈上有3600个对象(值为0的所有整数)。这很浪费,可能会降低解释器的速度,使调试变得困难,甚至可能在一些非常有限的PostScript实现中导致堆栈溢出错误。

说完了这一切。当然,您的问题的答案是,您可以使用'旋转'旋转绘图。运营商。我会想到你已经在递归过程中使用了旋转,这很明显。当然,由于您的绘图偏移300,300,您必须确保将偏移应用于CTM,并旋转它,以便第二次执行显示在正确的位置。

以下是更新后的更正版本,可根据您的要求进行绘制:

%!

/Helvetica findfont 8 scalefont setfont
/ang1 -141 def
/ang2 {-2 ang1 mul} def
/linelen 36 def
/depth 0 def
/down {/depth depth 1 add def} def
/up {/depth depth 1 sub def} def


/CrownPos
{
    /x 300 def
    /y 300 def
    x y moveto
} def

/DoLine 
{ 
    rotation rotate
    0 linelen rlineto 
    currentpoint stroke 
    translate 0 0 moveto 
} def

/Print
{ 
    gsave 
    .62 .62 scale
    2 setlinewidth
    down DoLine
    depth 8 le
    {
        ang1 rotate Print
            ang2 rotate Print
    } if
    up
    grestore 
} def

/Crown
{
    /rotation 0 def
    CrownPos Print
    stroke
    /rotation 270 def
    CrownPos Print
    stroke
    /rotation 90 def
    CrownPos Print
    stroke
} def



    Crown
600 600 translate
180 rotateCrown 
    showpage