如何只旋转我的代码的一部分'
我的代码:
%!
/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但我想要这样的东西:
after rotation
答案 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