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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow