Начала графики
Язык 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-программы интерпретатором игнорируется.