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

         

Индексируемый цикл напоминает широко известную



Задание.

Нарисуйте последовательность из N вложенных кругов, квадратов, эллипсов.
Индексируемый цикл напоминает широко известную по Бейсику конструкцию for... to... next. Оператор for берет из стека четыре операнда: начальное значение счетчика цикла, его приращение, конечное значение счетчика цикла и повторяемую процедуру. За исключением последнего операнда всё выглядит как и в обычной конструкция for. Следует учитывать, что непосредственно перед выполнением этой процедуры for помещает в стек текущее значение счетчика и, если он не используется, то его следует оттуда явным образом удалять.
Следующая строка напечатает звездочку через каждые 15 единиц на странице:
0 15 450 {0 moveto (*) show } for



Задание.

Нарисуйте пунктирную линию.
Вторая важная особенность for в том, что его операнды не обязательно должны быть целыми числами. Вот пример использования этого для возможной модификации шрифта:
/Helvetica findfont 30 scalefont setfont
/printword
{ 0 0 moveto (PC Magazine) show} def
200 300 translate
.95 -.05 0 % начало приращения, конец
{setgray printword -1.5 translate} for
1 setgray printword
showpage
<рис. файл p4_1.ps>


Условный цикл соответствует конструкции repeat...until в Паскале. Строится он из двух операторов: loop и exit. Опертор loop повторяет выполнение процедуры до тех пор пока в ней не встретится оператор exit, который заканчивает циклическое выполнение, причем не только в конструкции loop, но и в for, repeat и forall (об этой специальной форме цикла будет расказано ниже). Если в повторяемой процедуре нет оператора exit, то цикл будет бесконечным, например:
{(PC Magazine) show} loop
будет бесконечно печатать слово PC Magazine.
Нарисуем незамысловатую последовательность кругов просто, чтобы продемонстрировать работу loop - exit.
/pagewidth 8 72 mul def
/circle
{x y radius 0 360 arc stroke} def
/new-x
{x radius add
/x exch def} def
/dolineofcrle
{/y exch def
/radius exch def
/x 0 def
{x pagewidth le
{circle new-x}
{exit} ifelse
} loop
} def
% main
15 200 dolineofcrle
25 200 dolineofcrle
showpage



Задание

. Чтобы почувствовать разницу между двумя этими правилами, нарисуйте с помощью PostScript две одинаковых пятиугольных звезды (не убирая внутренние линии) и заполните их внутренние области с помощью операторов fill и eofill соответственно.
Для того, чтобы поместить графическое изображение на страницу, используется оператор image.
Синтаксис:
ширина высота бит/точка матрица процедура image à -
Изображение помещается в прямоугольную область размером ширина на высоту точек, каждая из которых представлена значением из бит/точка данных (1, 2, 4 или 8 битов на точку). Данные изображения считываются как последовательность символов, причём, если точка кодируется менее 8 битами, то данные упакованы в байте слева направо.
Изображение на странице имеет свою собственную систему координат, за начало которой (0,0) принят нижний левый угол прямоугольной области изображения, а верхний правый угол имеет координаты (ширина, высота). Операнд матрица задаёт преобразование из пространства пользователя в систему координат изображения.
Последний операнд (процедура) последовательно выполняется оператором image, чтобы получить данные изображения. Обычно эти данные читаются из файла с помощью оператора readhexstring.

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