2016-03-25 6 views
2

Как можно повернуть только одну часть моего «код»Как я могу повернуть?

мой код:

%! 

/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

ответ

2

Ваш код «своеобразно», по крайней мере, вы используете процедуры (исполняемые массивы) в нечетном и потенциально производительности убывающей образом. У вас есть такой код:

/depth {0} def 

Это создает исполняемый массив, который при выполнении помещает 0 в стек операнда. Было бы проще, и интерпретатор обычно выполнить это быстрее, чтобы положить:

/depth 0 def 

Я не думаю, что вы действительно поняли операции стека на основе из PostScript.

У вас также есть неисправность в одной процедуре, в/Печать у вас есть:

вниз 0 DoLine

Это выполняет «вниз», а затем помещает 0 в стек операндов, а затем выполняет «DoLine». Однако ничто никогда не удаляет «0» из стека операндов. В конце вашей программы есть 3600 объектов (все целые числа со значением 0) в стеке операндов. Это расточительно, может замедлить работу интерпретатора, затрудняет отладку и может даже в некоторых очень ограниченных реализациях PostScript вызвать ошибку переполнения стека.

Сказав это все. Ответ на ваш вопрос, конечно, заключается в том, что вы можете вращать рисунок с помощью оператора «rotate». Я подумал бы о том, что вы использовали поворот уже в рекурсивной процедуре, чтобы это было очевидно. Конечно, поскольку ваш чертеж смещен на 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 
+0

Извините за мой своеобразный код, я новичок в PostScript. Большое спасибо, я думал, что rotate fuction занимает мое текущее положение как точка, которая действует как отражение. Теперь я понимаю этот язык больше. Спасибо за советы с {} я ничего не знал о массивах в PostScript. –

Смежные вопросы