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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow