postscript
Sökvägskonstruktion
Sök…
Rita (beskriva) en polygon
Detta exempel försöker efterlikna beteendet hos de inbyggda vägkonstruktionsoperatörerna som arc
.
Om det finns en aktuell punkt drar poly
först en linje till (x, y) + (r, 0), annars börjar det med att flytta till den punkten.
I stället för gsave
... grestore
(som har den oönskade effekten att kassera själva förändringarna i den aktuella sökvägen som vi vill), sparar den en kopia av den aktuella transformationsmatrisen (CTM) som den existerar när funktionen startar.
Sedan gör det lineto
till varje efterföljande punkt, som genom att skala och rotera matrisen alltid är på (0,1). Slutligen kallar det för closepath
och återställer sedan den sparade matrisen som 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
Iterating genom en väg
Det här utdraget dumpar innehållet i den aktuella sökvägen till stdout. Den använder ghostscript-proceduren =only
som kanske inte är tillgänglig för alla tolkar. En motsvarande procedur på Adobe-tolkar kallas =print
.
pathforall
är en looping-operatör som tar fyra procedurorgan som argument som krävs för de specifika typerna av vägelement, resultatet av moveto
, lineto
, curveto
, closepath
och alla andra operatörer för vägkontroll som kokar ner till dessa element.
{ 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
Graf papper
/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