postscript
Costruzione del percorso
Ricerca…
Disegnare (descrivere) un poligono
Questo esempio tenta di imitare il comportamento degli operatori di costruzione del percorso integrati come l' arc
.
Se c'è un punto corrente, poly
prima disegna una linea a (x, y) + (r, 0), altrimenti inizia spostandosi verso quel punto.
Invece di gsave
... grestore
(che ha l'effetto indesiderato di scartare le stesse modifiche al percorso corrente che vogliamo), salva una copia della matrice di trasformazione corrente (CTM) così com'è quando inizia la funzione.
Quindi esegue il lineto
su ciascun punto successivo, che ridimensionando e ruotando la matrice è sempre a (0,1). Infine, chiama closepath
e quindi ripristina la matrice salvata come CTM.
% x y n radius poly -
% construct a path of a closed n-polygon
/poly {
matrix currentmatrix 5 1 roll % matrix x y n radius
4 2 roll translate % matrix n radius
dup scale % matrix n
360 1 index div exch % matrix 360/n n
0 1 {lineto currentpoint moveto}stopped{moveto}if % start or re-start subpath
{ % matrix 360/n
dup rotate % matrix 360/n
0 1 lineto % matrix 360/n
} repeat % matrix 360/n
pop % matrix
closepath % matrix
setmatrix %
} def
Iterando attraverso un percorso
Questo snippet scarica il contenuto del percorso corrente su stdout. Usa la procedura ghostscript =only
che potrebbe non essere disponibile su tutti gli interpreti. Una procedura equivalente sugli interpreti Adobe viene chiamata =print
.
pathforall
è un operatore di loop che prende 4 corpi di procedure come argomenti che sono chiamati per i tipi specifici di elementi di percorso, il risultato di moveto
, lineto
, curveto
, closepath
e tutti gli altri operatori di costruzione del percorso che si riducono a questi elementi.
{ exch =only ( ) print =only ( ) print /moveto =}
{ exch =only ( ) print =only ( ) print /lineto =}
{ 6 -2 roll exch =only ( ) print =only ( ) print
4 2 roll exch =only ( ) print =only ( ) print
exch =only ( ) print =only ( ) print /curveto =}
{ /closepath = }
pathforall
Carta millimetrata
/in {72 mul} def
/delta {1 in 10 div} def
/X 612 def
/Y 792 def
0 delta Y {
0 1 index X exch % i 0 X i
moveto exch % 0 i
lineto
stroke
} for
0 delta X {
0 1 index Y % i 0 i Y
moveto % i 0
lineto
stroke
} for
showpage