2016-03-25 9 views
2

Wie kann ich nur einen Teil meiner ‚Code‘ drehenWie kann ich drehen?

mein Code:

%! 

/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 

ich will meine untere Krone um 180 Grad drehen, ist alles auf enthalten Bilder

es gezeigt gibt mir so etwas wie dieses: original
enter image description here

aber ich so etwas wie dies wollen: after rotation
enter image description here

Antwort

2

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 
+0

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. –