postscript
Budowa ścieżki
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