Ihr Code ist ‚eigentümlich‘ zumindest, Sie werden unter Verwendung von Verfahren (ausführbare Arrays) in einer ungeraden und möglicherweise Leistung abnimmt Art und Weise. Sie haben Code wie folgt:
/depth {0} def
Dies erstellt ein ausführbares Array, das, wenn ausgeführt, 0 auf dem Operandenstapel setzt. Es wäre einfacher, und der Dolmetscher wird dies in der Regel schneller ausführen, setzen:
/depth 0 def
Ich glaube nicht, dass Sie wirklich den Stack-basierten begriffen haben den Betrieb von Postscript.
Sie haben auch einen Fehler in einem Verfahren, in/Drucken Sie haben:
0 nach unten Doline
Dies führt 'down', legt dann 0 auf dem Operandenstapel, führt dann 'Doline'. Nichts entfernt jedoch die '0' aus dem Operandenstapel. Am Ende Ihres Programms befinden sich 3600 Objekte (alle Ganzzahlen mit dem Wert 0) auf dem Operandenstapel. Dies ist verschwenderisch, kann den Interpreter verlangsamen, macht das Debuggen schwierig und kann sogar in einigen sehr begrenzten PostScript-Implementierungen einen Stapelüberlauffehler verursachen.
Nach all dem gesagt. Die Antwort auf Ihre Frage ist natürlich, dass Sie Ihre Zeichnung mit dem Operator "Drehen" drehen können. Ich hätte daran gedacht, dass du schon in einem rekursiven Verfahren drehst, dass dies offensichtlich wäre. Da Ihre Zeichnung um 300, 300 versetzt ist, müssen Sie natürlich darauf achten, dass Sie einen Versatz auf den CTM anwenden und ihn drehen, so dass die zweite Ausführung an der richtigen Position erscheint.
Hier ist eine korrigierte Version wie gewünscht zu ziehen aktualisiert:
%!
/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
Sorry für meinen eigentümlichen Code, ich bin neu in Postscript. Vielen Dank, ich dachte, die Drehfunktion nimmt meine aktuelle Position als einen Punkt an, der als Reflexion dient. Jetzt verstehe ich diese Sprache mehr. Danke für die Tipps mit {} Ich wusste nichts über Arrays in PostScript. –