Курсовая по СПО (538457), страница 3
Текст из файла (страница 3)
4.2.4 Обзор универсальных команд
Для описания команд используется следующая нотация:
аргумент! аргумвнт2, ... команда @ результат! результат2} ... %комментарий
Имя команды выделяется специальным шрифтом. Слева от имени описывается состояние стека до исполнения команды, а справа от стрелки — после ее исполнения. Минус вместо аргумента или результата обозначает отсутствие значения. Данные обозначаются словами, производными от названии типов или математических обозначений, характеризующих операцию. Такая запись приближена к записи текста программы. Например, описание операции сложения выглядит так:
р q add -> p+q
Запись команды в тексте PostScript-файла может быть такой:
4М 5.0 add
или
1710 add
Целые числа обозначаются буквами i, j, n, вещественные числа — х, у, z, логические (булевы) значения — буквой b, координаты — х, у. Буквами р, q, г, s обозначаются любые числа, как целые, так и вещественные^ если их тип не имеет значения. Строки, массивы и процедуры указываются вместе со скобками, в которых они определяются.
PostScript имеет команды общего назначения для работы c данными (присваивание, работа со стеком)^операторы вызова подпрограмм, ветвления и циклы. Операторов безусловного перехода и меток нет. Имеются команды ввода/вывода> но при печати на принтере они теряют смысл, так как PostScript-файл передается в принтер и обрабатывается в нем автономно, без связи с компьютером.
При интерпретации команды интерпретатор PostScript ищет ее имя в стеке словарей. Если имя найдено, соответствующее значение либо заносится в стек операндов (если это не процедура), либо исполняется (если это процедура). Если имя не найдено ни в одном из словарей, возникает ошибка и интерпретация PostScript-файла завершается. Имена стандартных команд представляют собой имена процедур, записанные в системном словаре. При необходимости эти имена можно переопределить. Команда load выполняет поиск указанного имени, но в любом сяучае заносит найденное значение в стек. Эту команду можно применять для того, чтобы использовать описанную ранее процедуру в качестве тела цикла или условного оператора.
Условный оператор if удаляет из стека операндов процедуру и логическое значение, после чего, либо исполняет процедуру,, либо нет. Процедура может использовать значения в стеке операндов, записанные до того, как туда было записано логическое значение. Условный оператор ifelse удаляет из стека операндов обе процедуры и логическое значение, после чего исполняет одну из процедур. В этом случае обе процедуры должны одинаково использовать старые значения в стеке и оставлять там одинаковое количество новых значений.
Оператор цикла for удаляет из стека операндов все свои 4 аргумента и
устанавливает. значение параметра цикла равным рнач. После этого он циклически выполняет следующие действия: проверяет, не вышло ли текущее значение параметра за допустимую границу sK0Hj помещает значение параметра цикла в стек операндов, выполняет процедуру, увеличивает значение параметра на величину qшar. Шаг может быть как положительным, так и отрицательным. Если начальное значение больше конечного при положительном шаге или меньше конечного при отрицательном шаге, процедура не выполняется. Процедура может использовать предыдущие значения в стеке, а также значение параметра цикла. После окончания цикла стек не восстанавливает автоматически свое прежнее состояние, что может привести к его переполнению, поэтому, в частности, необходимо удалять из стека операндов очередное значение параметра цикла.
В табл. 1 приведен обзор некоторых универсальных команд.
Таблица 1
Описание команды | Примечание |
р q add->p+q | - |
р q sub->p-q | - |
р qmul->p*q | - |
р q div->p/q. | - |
ijidiv->[i/j] | Целая часть от деления. Аргументы только целого типа. |
i j mod->imodj | Остаток от деления. Аргументы только целого типа. |
p neg~>-p | Изменение знака |
p abs->|p| | Модуль числа - |
p cv.i->i | Преобразование к целому типу. У вещественного числа отбрасывается дробная часть. |
p cvr->x | Преобразование к вещественному типу. |
p round ->q | Округление числа. Тип результата совпадает стипом аргумента. |
(строка) cvi~> i | Преобразование символьного представления числаГ1 в целое |
(строка) cvr->x | Преобразование символьного представления числа в вещественное |
| Функции |
a0 sin —> sin(o:D) | Угол задается в градусах |
P sqrt-> 4~p | Квадратный корень |
p ln-»ln(p) | Натуральный логарифм |
plog-Hgt» | Десятичный логарифм |
-rand->i | Генератор псевдослучайных чисел в диапазоне от 0 до 231-1 - - |
Отношения | |
P q eq->p=q | В стек помещается логическое значение true или false |
pq ne->p*q |
|
pq le->p<q |
|
p q lt->p<q |
|
P-q #->p>q |
|
Логические операции | |
bTb2and->blAb2 | Логическое И . |
bl b2or->blvb2 | Логическое ИЛИ |
Ы Ь2 хог->М=Ь2 | Исключающее-ИЛИ |
bnot->£ | Логическое отрицание |
4.2.5 Графический контекст
В операторах вывода графики используются неявные параметры, влияющие на их выполнение. Совокупность этих параметров называется графическим контекстом. Графический контекст составляют положение, ориентация и масштаб системы координат, толщина и стиль рисования линии, область рисования, текущий путь построения линии и некоторые другие. В PostScript имеются команды для работы с графическим контекстом.
Среди них команды, которые заносят в специальный стек графических контекстов текущий графический контекст и могут восстановить ранее записанное состояние. Это позволяет изменять параметры вывода одной части рисунка и возвращаться к предыдущему
состоянию перед выводом другой его части. Команда gsave выполняет запись в стек графических контекстов, а команда grestore считывает из этого стека графический контекст, делая его текущим. Таким образом, все изменения параметров рисования, произведенные с момента сохранения контекста, перестают действовать на последующие команды вывода графических объектов. Команда grestoreall восстанавливает самое первое состояние, записанное в стек командой gsave.
Более «мощные» команды save и restore кроме сохранения графического контекста сохраняют еще и область памяти виртуальной ЭВМ, содержащую все переменные, и восстанавливают как графический контекст так и значения переменных. Эти команды можно использовать для предотвращения побочных эффектов при печати страниц, если среди команд печати встречаются команды изменения каких-либо объектов. Команда grestoreall восстанавливает последний графический контекст, сохраненный командой save, или, если таких команд не было, самый первый (верхний в стеке), сохраненный командой gsave. Образ памяти, создаваемый командой save, рекомендуется хранить в стеке операндов и использовать команду restore, предварительно убрав из стека все записанные чуда .позже операнды.
Команды save/restore рекомендуется использовать в начале и в конце описания каждой страницы.
Такой стиль программирования позволит в начале каждой страницы получать тот графический контекст и переменные, которые были определены в прологе программы. Использование в начале/конце описания страниц команд gsave/grestore позволяет сохранять графический контекст, но не освобождает память от определенных, но уже не используемых значений. Эти команды выполняются быстрее, чем save/restore? поэтому при печати больших файлов они могут оказаться более эффективными, В табл. 2 приведены команды для работы с графическими объектами.
Таблица 2
Описание команд | Примечание |
Сохранение и восстановление графического контекста | |
-gsave->- | Запись текущего графического контекста в стек графических контекстов |
-grestore-> | Восстановление текущего графического контекста из сохраненного командой gsave |
-save-> образ памяти метка | Сохранение текущего графического контекста в стеке и запись в стек операндов образа памяти |
образ памяти restor->- |
|
Изменение системы координат | |
х у translated | Перенос начала координат |
a°rotate-> | Поворот координатных осей |
Sx Sy scale-> | Изменение масштаба осей координат |
Создание графического пути | |
-newpath-> | инициализация нового графического пути |
-closepath->- | Замыкание участка графического пути из текущей точки в начальную точку пути |
xymoveto->- . | Установка текущей точки без проведения линии ; |
-currenlpoint->x у | Определение координат текущей точки |
x у lineto->- | Добавление отрезка прямой линии 1 |
Использование графического пути для вывода фигур | |
-stroke->- | Построение линии вдоль графического пути |
-fill-> | Закрашивание текущим цветом фигуры, ограниченной замкнутым графическим путем . |
-pathbbox-> | Определение координат прямоугольника, охватывающего текущий путь |
-clippath->- | Создание нового графического пути вокруг всех ъКтгъггоГг |
4.2.7 Рисование и закраска фигур
Отличительным аспектом PostScript является то, что даже текст - это разновидность графики. Первой задачей будет рисование линий для создания изображения.
^Основные шаги рисования и закраски фигур:
• Начать путь оператором newpath;
- Собрать путь из отрезков и кривых (не обязательно смежных);
• Нарисовать линию оператором stroke или закрасить оператором fill.
Эта последовательность действий может быть изменена для получения более
сложных результатов.