postscript
Строительство пути
Поиск…
Рисование (описание) многоугольника
Этот пример пытается имитировать поведение встроенных операторов построения пути, таких как arc
.
Если есть текущая точка, poly
сначала рисует линию (x, y) + (r, 0), в противном случае она начинается с перемещения к этой точке.
Вместо gsave
... grestore
(который имеет нежелательный эффект отбрасывания самих изменений в текущий путь, который мы хотим), он сохраняет копию текущей матрицы преобразования (CTM), как она существует при запуске функции.
Затем он делает lineto
для каждой последующей точки, которая, масштабируя и вращая матрицу, всегда находится в (0,1). Наконец, он вызывает closepath
а затем восстанавливает сохраненную матрицу как 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
Итерация по пути
Этот фрагмент сбрасывает содержимое текущего пути в stdout. Он использует процедуру ghostscript =only
которая может быть недоступна для всех интерпретаторов. Эквивалентная процедура для интерпретаторов Adobe называется =print
.
pathforall
- это оператор цикла, который принимает 4 тела процедуры как аргументы, которые вызывают для определенных типов элементов пути, результат moveto
, lineto
, curveto
, closepath
и всех других операторов построения пути, которые сводятся к этим элементам.
{ 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
Миллиметровая бумага
/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