Szukaj…


Rysowanie (opisywanie) wielokąta

Ten przykład próbuje naśladować zachowanie wbudowanych operatorów budowy ścieżek, takich jak arc .

Jeśli jest punkt bieżący, poly najpierw rysuje linię do (x, y) + (r, 0), w przeciwnym razie zaczyna się od przejścia do tego punktu.

Zamiast gsave ... grestore (który ma niepożądany efekt odrzucenia samych zmian w bieżącej ścieżce, której chcemy), zapisuje kopię bieżącej macierzy transformacji (CTM), jaka istnieje w chwili uruchomienia funkcji.

Następnie lineto z każdym kolejnym punktem, który poprzez skalowanie i obracanie macierzy ma zawsze wartość (0,1). Na koniec wywołuje closepath a następnie przywraca zapisaną macierz jako 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

Iterowanie ścieżką

Ten fragment zrzuca zawartość bieżącej ścieżki na standardowe wyjście. Używa procedury ghostscript =only która może nie być dostępna we wszystkich tłumaczach. Analogiczna procedura dla interpreterów Adobe nazywa się =print .

pathforall jest operatorem zapętlającym, który przyjmuje 4 ciała procedur jako argumenty wywoływane dla określonych typów elementów ścieżki, wyniku moveto , lineto , curveto , closepath i wszystkich innych operatorów closepath ścieżki, które sprowadzają się do tych elementów.

{ 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 milimetrowy

/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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow