Поиск…


Рисование (описание) многоугольника

Этот пример пытается имитировать поведение встроенных операторов построения пути, таких как 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow