Перед тем как продолжить рассмотрение основ языка, замечу, что для отладки программ на 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-программы интерпретатором игнорируется.