Семь уроков по PostScript

       

Начала графики


Язык PostScript был разработан для получения графических изображений, для этого у него имеется большой набор операторов.

Рисование в PostScript начинается с конструирования пути на идеальной поверхности, называемой текущей страницей. Путь - набор прямых и кривых линий, определяющих область, которая будет заполнена, или траекторию, которая будет нарисована на текущей странице.

Конструируя путь, необходимо решить, что с ним делать: мы можем нарисовать линию заданной толщины или заполнить его, чтобы создать непрерывное изображение.

После того, как заполнение текущей страницы закончено, ее можно распечатать на физическом листе бумаги.

Начнем с простой задачи: нарисуем вертикальную линию длиной 5". Это выполнит следующая программа:

newpath

144 72 moveto

144 432 lineto

stroke

showpage

Разберем этот пример строка за строкой. Оператор newpath читает текущую страницу и объявляет, что начато рисование новой страницы. Конструирование пути начинается переносом воображаемого пера в заданную точку. Это перо при его переносах не оставляет "следа" на бумаге. Положение пера в каждый конкретный момент  называется текущей точкой на текущем пути.

Оператор movedo переносит перо в точку, координаты которой заданы его операндами. он извлекает из стека два числа и рассматривает их как координаты х и у точки, которая становится текущей.

В системе координат, принятой в PostScript по умолчанию, начало координат находится в нижнем левом углу страницы. Координата х увеличивается вправо, а у - при движении вверх. Единица длины в этой системе равна 1/72 дюйма. Таким образом, оператор moveto переместит текущую точку на два дюйма вправо (144/78) и один дюйм вверх (72/72).



Оператор lineto добавит сегмент к текущему пути, нарисуя линию между текущей точкой и точкой, координаты которой заданы его операндами, в данном случае 144 и 432. Точка, заданная как операнд lineto становиться текущей точкой. Обратите внимание, что lineto в действительности не рисует ничего на текущей странице. Он просто добавляет сегмент линии к текущему пути. Позже эту линию можно будет нарисовать, но это не происходит автоматически.


Оператор stroke вызывает рисование сконструированного нами пути на текущей странице. Теперь этот путь становится видимой линией.

И, наконец, оператор showpage печатает текущую страницу (отправляет ее на печать).

Таким образом можно выделить 3 этапа построения:

1) Конструирование пути (newpath, moveto, lineto);

2) нанесение его на текущую страницу (stroke);

3) вывод текущей страницы (showpage).

Задание: Написать программу, которая строит квадрат со стороной 1 дюйм.

Занятие второе

Перед тем как продолжить рассмотрение основ языка, замечу, что для отладки программ на PostScript удобно использовать программу RIP, хотя она и работает под DOS. Так как в разных моделях принтеров реализованы различные версии этого языка, то при выводе PostScript-программы на реальный принтер посмотрите его документацию. В частности иногда перед текстом примера следует поставить знак процента, за которым следует восклицательный знак, т. е. %!. Эта комбинация символов переключает на PostScript принтер, понимающий разные языки описания страниц (обычно ещё имеется PCL5).

Итак, продолжим рассмотрение команд перемещения. Как и в других языках описания страниц в PostScript имеется возможность задавать перемещение не в абсолютных координатах, а в приращениях относительно текущей точки. Для этого служат операторы rmoveto и rlineto. Пример из первого занятия можно записать так:

newpath

 144 72 rmoveto

 0 360 rlineto

stroke

showpage

Следующие две строки

144 432 moveto

    -216 rlineto

перемещают текущую точку вверх над сегментом первой линии и добавляют к траектории сегмент линии, проводя ее вертикально вниз (обратите внимание на отрицательный аргумент у) на 216 единиц от текущей точки.

Задание: Напишите программу, рисующую две пересекающиеся прямые (в этом случае текущий путь не будет последовательным). 

Траектория не обязательно должна быть единым связанным друг с другом куском. Она может содержать на текущей странице любой набор прямых линий и кривых.



Прямоугольник

Напишем программу, рисующую квадрат со стороной один дюйм, расположенный в центре страницы:

newpath

200 300 moveto

0 72 rlineto

0 -72 rlineto

-72 0 rlineto

5 setlinewidth

stroke  showpage

Использование приращений позволяет вам поместить квадрат в любое место страницы, исправив только одну строку. В этой программе новой является только предпоследняя строка

5 setlinewidth

Оператор setlinewidth позволяет вам установить ширину линии. В этой строке задана ширина 5/72 дюйма. Данный оператор действует на все линии, помещаемые на текущую страницу, пока не встретится другой оператор setlinewidth.

Рис. 1 (прогнать пример на принтере)

Наш квадрат, как вы заметили, имеет выщерблину в левом нижнем углу, так как у линий заметная толщина. Чтобы избежать этого явления, следует использовать новый оператор: closepath.

 newpath

200 300 moveto

0 72 rlineto

72 0 rlineto

0 -72 rlineto

closepath

5 setlinewidth

stroke  showpage

Оператор closepath добавляет к текущему пути линию, соединяющую текущую точку с начальной точкой адресуемой оператором moveto.

Научившись строить квадрат посмотрим как его можно заполнить. Для этой цели служит оператор fill, который "заливает" квадрат черными чернилами:

newpath

200 300 moveto

0 72 rlineto

72 0 rlineto

 0 -72 rlineto

сlosepath

fill

 showpage

Обратите внимание, что на этот раз  вместо перенесения прямых на текущую страницу (stroke), мы вызываем оператор fill, который заполняет некоторым цветом очерченную область. Уровень серого цвета для заполнения фигуры задается аргументом оператора setgray -- числом  в интервале от 0 (черный цвет) до 1(белый).

newpath

  200 300 moveto

  0 72 rlineto

  72 0 rlineto

  0 -72 rlineto

  .6 setgray

  fill

 showpage

Заданный уровень серого действует до появления следующего оператора setgray. Если setgray не задан, то по умолчанию область заполняется черным цветом. Так как у каждого типа принтера свой способ построения полутонов, то полутона одной и той же PostScript-страницы, выведенной на разных принтерах могут не совпадать. То, что вы получите  запустив эти программы может не совпадать по полутонам с рисунками в журнале.



Перекрывающиеся области

При рисовании перекрывающихся областей цвет их пересечения определяется цветом, нанесенным на текущую страницу последним. Пример: нарисуем два перекрывающихся прямоугольника.

newpath % серый квадрат

200 300 moveto

0 72 rlineto

72 0 rlineto

 0 -72 rlineto

сlosepath

0.5 setgray

fill

 newpath % светлый квадрат

236 336 moveto

0 72 rlineto

72 0 rlineto

 0 -72 rlineto

closepath

.8 setgray

fill

 showpage % послать на принтер

Обратите внимание, что каждый квадрат начинается с оператора moveto. Это связано с тем, что оператор fill очищает текущую траекторию и после него не определена текущая точка, поэтому lineto и rlineto не имеют начальной точки. Оператор stroke также очищает текущий путь. Каждый блок этой программы содержит также комментарий, который начинается со знака % и продолжается до конца строки. Все что следует за знаком % в строке PostScript-программы интерпретатором игнорируется.


Содержание раздела