postscript
La construction du chemin
Recherche…
Dessiner (décrire) un polygone
Cet exemple tente de reproduire le comportement des opérateurs de construction de chemin intégrés tels que arc
.
S'il y a un point actuel, poly
trace d'abord une ligne vers (x, y) + (r, 0), sinon il commence par se déplacer vers ce point.
Au lieu de gsave
... grestore
(qui a pour effet indésirable de supprimer les modifications que nous souhaitons), il enregistre une copie de la matrice de transformation actuelle (CTM) telle qu'elle existe au démarrage de la fonction.
Ensuite, il fait un lineto
à chaque point suivant, ce qui en lineto
à l'échelle et en tournant la matrice est toujours à (0,1). Enfin, il appelle closepath
puis restaure la matrice enregistrée en tant que 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
Itérer à travers un chemin
Cet extrait extrait le contenu du chemin actuel vers stdout. Il utilise la procédure ghostscript =only
qui peut ne pas être disponible sur tous les interpréteurs. Une procédure équivalente sur les interpréteurs Adobe est appelée =print
.
pathforall
est un opérateur de boucle qui prend 4 corps de procédure comme arguments appelés pour les types spécifiques d'éléments de chemin, le résultat de moveto
, lineto
, curveto
, closepath
et tous les autres opérateurs de construction de chemin qui se résument à ces éléments.
{ 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
Papier graphique
/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