postscript
Construcción de caminos
Buscar..
Dibujar (describir) un polígono
Este ejemplo intenta imitar el comportamiento de los operadores de construcción de ruta incorporados como arc
.
Si hay un punto actual, poly
primero dibuja una línea en (x, y) + (r, 0), de lo contrario comienza moviéndose hacia ese punto.
En lugar de gsave
... grestore
(que tiene el efecto no deseado de descartar los cambios en la ruta actual que deseamos), guarda una copia de la matriz de transformación actual (CTM) tal como existe cuando se inicia la función.
Luego se lineto
con cada punto posterior, que al escalar y rotar la matriz siempre está en (0,1). Finalmente, llama a closepath
y luego restaura la matriz guardada como el 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 por un camino
Este fragmento vuelca el contenido de la ruta actual a la salida estándar. Utiliza el procedimiento ghostscript =only
que puede no estar disponible en todos los intérpretes. Un procedimiento equivalente en los intérpretes de Adobe se llama =print
.
pathforall
es un operador de bucle que toma 4 cuerpos de procedimiento como argumentos que se llaman para los tipos específicos de elementos de trayectoria, el resultado de moveto
, lineto
, curveto
, closepath
y todos los demás operadores de construcción de trayectoria que se reducen a estos elementos.
{ 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
Papel cuadriculado
/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