Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
метод_лаб_КИТ_КЭМ_new.doc
Скачиваний:
6
Добавлен:
06.02.2016
Размер:
640.51 Кб
Скачать

Задание к лабораторной работе №1

Написать на языке PostScript программу рисования произвольной композиции, содержащей различные плоские геометрические фигуры( прямоугольники, дуги, овалы и т.п.).

Лабораторная работа №2

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

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

Методические указания к лабораторной работе

Словарь (dictionary) - PostScript-словарь связывает объект, именуемый ключом, с другим объектом - значением этого ключа. Интерпретатор языка PostScript может искать по ключу в словаре и получать его значение, если такой ключ есть в таблице. PostScript всегда имеет два словаря: системный и пользовательский. Системный словарь объединяет имя каждого встроенного в язык оператора, с соответствующим ему действием. Словарь пользователя ассоциирует имена с процедурами и переменными, определенными в программе. Когда интерпретатор встречает имя, он сначала просматривает словарь пользователя, а затем системный. Если имя в словаре найдено, то выполняются соответствующие ему действия: либо объект помещается в стек, либо выполняются некоторый набор операторов. Если имя не найдено, то выдается сообщение об ошибке. Словари хранятся в стеке словарей: словарь пользователя в верху стека, системный - внизу. Таким образом слово ищется начиная с вершины стека. Программа может создать новые словари, которые будут размещены в вершине стека словарей. Словарь, находящийся в вершине стека и, следовательно, просматриваемый первым, называется текущим словарем.

Переменные:

Чтобы определить переменную в PostScript, ее имя и значение нужно занести в текущий словарь. Это делается с помощью оператора DEF, как в следующем примере:

/name 47 def

Косая черта перед именем переменной показывает, что интерпретатору следует поместить это имя в стек как литерал, а не пытаться сразу же искать его в словаре. Вслед за именем в стек заносится число 47. И наконец DEF берет оба эти объекта из стека и помещает их в текущий словарь. Второй элемент стека name становится ключом, с которым ассоциировано значение первого элемента (47). Определенное с помощью DEF значение переменной может быть изменено либо новым оператором DEF, либо другими операторами, например:

/name 52 def

Если дальше в программе появится строка:

13 name add

то интерпретатор сделает следующее:

- поместит число 13 в стек;

- найдет в стеке словарей значение для ключа name и поместит его в стек;

- сложит два числа из вершины стека и поместит на их место результат.

Следующий оператор умножает значение переменной name на 12:

/ name name 12 mul def

Процедуры:

Процедура в PostScript - это набор операторов, сгруппированных под общим именем. Имя процедуры является ключом в словаре, а набор операторов ассоциируется как его значение. Когда имя процедуры появляется в программе, то выполняется связанный с ним набор операторов. Процедуры в PostScript определяются точно так же, как и переменные, с тем только отличием, что набор операторов процедуры должен быть заключен в фигурные скобки. Следующая строка, например, описывает процедуру inch (дюйм), полезную для перевода дюймов в систему единиц, используемую в PostScript по умолчанию.

/inch {72 mul} def

Любое появление слова inch после этой строки заставит интерпретатор поместить в стек число 72, умножить его на число лежащее в стеке ниже его и поместить в стек вместо двух этих чисел результат их произведения, таким образом следующие две строки эквивалентны:

3 72 mul

3 inch

Так как PostScript ориентирован на работу со стеком, естественный способ передачи параметров - размещение их в стеке. Перепишем программу рисования двух перекрывающихся областей из лабораторной работы №1:

/inch {72 mul} def

/box { % в стеке: x y

newpath

moveto

1 inch 0 rlineto

0 1 inch rlineto

-1 inch 0 rlineto

closepath

} def

/fillgray { % в стеке: уровень серого цвета

setgray fill

} def

% Основная программа

2 inch 3 inch box

.9 fillgray

2.5 inch 3.5 inch box

.7 fillgray

showpage

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

Работа со шрифтами:

Текстовые данные представлены в PostScript объектами типа string (строка). Строка может содержать любую последовательность символов, заключенную в круглые скобки. Строка может быть помещена в стек, присвоена переменной или напечатана. Однако перед тем, как строка будет помещена на текущей странице, интерпретатору PostScript необходимо указать какую гарнитуру и размер шрифта использовать при печати.

Шрифт - это набор символов, имеющих единый дизайн. Дизайн конкретного шрифта называется гарнитурой. Набор гарнитур, разработанных для совместного использования, называется семейством гарнитур. Наиболее популярные гарнитуры: Таймс, Курьер, Журнальная и др. PostScript-шрифты относятся к классу векторных и, следовательно, масштабируемых шрифтов. Существующие методы описания векторных шрифтов позволяют автоматически менять размер шрифта (кегель) с минимальными искажениями его начертания при преобразовании размера.

Чтобы задать шрифт, нужно выполнить следующие действия:

  • найти описание шрифта в словаре шрифтов;

  • отмасштабировать шрифт до нужного размера. Его размер задается минимальным расстоянием по вертикали между строками текста, необходимым, чтобы эти строки не накладывались одна на другую, например обычный шрифт часто задается высотой в 12 или 14 пунктов (напомним, что 1 пункт = 1/72 дюйма);

  • установить отмасштабированный шрифт в качестве текущего шрифта, которым и будет печататься текст.

Опрераторы для работы со шрифтами:

- Name findfont - ищет в словаре шрифтов с названием FontDictionary и устанавливает шрифт с именем Name. Если шрифт найден, то ссылка на него помещается в стек для дальнейшей работы. В противном случае выдается ошибка.

- Size scalefont - масштабирует текущий шрифт на величину Size.

- Font setfont - определят шрифт с именем Font как текущий.

- String show - рисует заданную строку на странице, используя при этом текущее состояние графики ( текущий шрифт, текущий размер шрифта, уровень серого либо цвет, текущую матрицу преобразований, текущее положение). Текущее положение определяется левой нижней точкой базовой линии текста, которая после выполнения оператора перемещается в самую правую позицию базовой линии текста.

- String bool charpath - добавляет траекторию контура строки из вершины стека к текущей. Если bool = true, то полученный результат (текст) можно использовать для заливки и отсечения, иначе нельзя.

ПРИМЕР: работа со шрифтами.

Пример написан с использованием процедур и показывает, как во время печати текста можно менять размер шрифта. Определим процедуру, устанавливающую шрифт нужного размера.

/newsize { % в стеке размер

scalefont setfont

} def

/getfont {

/Helvetica findfont

} def

% Основная программа

getfont 8 newsize

72 250 moveto (example) show

getfont 10 newsize

72 275 moveto (example) show

getfont 12 newsize

72 300 moveto

(example) show

showpage

Эта программа напечатает три раза слово EXAMPLE шрифтом разного размера. Процедуры NEWSIZE и GETFONT можно объединить, если учесть порядок следования аргументов в стеке. (Очевидно, что в нем хранится не сам словарь шрифта непосредственно, а ссылка на него).

/scaleHelv { % в стеке размер

/Helvetica findfont

exch % кегель в вершине стека

scalefont

setfont

} def

Теперь запись строки программы станет еще компактней:

6 scaleHelv

Для печати текста часто требуются различные операции по выравниванию слов по границам страницы, выравниванию промежутков между буквами (КЕРНИНГ), чтобы напечатанный текст выглядел приятно. Для этой цели в PostScript имеется 4 варианта оператора SHOW:

- ashow - при печати строки добавляет после каждого символа заданный промежуток;

- widthshow - при печати строки добавляет заданный промежуток после каждого появления некоторого символа (например, после каждого пробела);

- awidthshow - является комбинацией двух предыдущих операторов;

- kshow - выполняет заданную процедуру между каждой парой символов в строке.

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

{pop pop (-) show} (World) kshow

напечатает его с дефисом между каждой парой букв:

W-o-r-l-d

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

Используя оператор ARCTO, нарисуем какую-нибудь карточку:

/clearstack {

4 { pop } repeat

} def

200 300 translate

0 20 moveto

0 72 108 72 20 arcto

clearstack

108 72 108 0 20 arcto

clearstack

108 0 0 0 20 arcto

clearstack

0 0 0 72 20 arcto

clearstack

fill

0.5 setgray

80 45 20 0 360 arc

fill

/Helvetica findfont

25 scalefont

setfont

30 50 moveto

(My Card) show

showpage

Преобразование системы координат:

В PostScript не существует различия между графикой и текстом. Символ текста рассматривается как один из графических объектов, размещаемых на текущей странице. Поэтому для совмещения на ней текста и графики не требуется никаких специальных действий. Все графические операторы PostScript выполняют свои действия в пространстве пользователя, которое независимо от какого-либо физического устройства, и результат работы операторов PostScript при печати автоматически преобразуется в систему координат устройства. Однако иногда бывает удобно выполнять графические преобразования, изменяя пользовательскую систему координат с помощью применения следующих операторов:

х у translate - перенос начала координат в точку с координатами х, у. Причем, каждый следующий перенос системы координат осуществляется уже относительно предъидущей системы координат, а не относительно исходной.

х rotate - поворот системы координат на заданный угол (угол в градусах отсчитывается от вертикальной оси против часовой стрелки).

/neworigin {

250 150 translate

60 rotate

} def

/treangl {

0 0 moveto

90 0 lineto

x y lineto

closepath

fill

} def

treangl

neworigin

treangl

neworigin

2 2 scale % увеличим в два раза масштаб по осям

treangl

showpage

Сохранение состояния графики PostScript:

Состояние графики - это набор данных, которые описывают, как операторы будут влиять на текущую страницу. Пара взаимодополняющих операторов, GSAVE и GRESTORE, позволяют сохранить текущее состояние графики, а затем в нужный момент восстановить его. Это может потребоваться до и после использования оператора FILL, который очищает текущую траекторию. Если нужно продолжить рисование из какой-либо точки фигуры, заполняемой оттенком серого, то удобно просто восстановить состояние графики, сохраненное до выполнения FILL. Оператор GSAVE сохраняет копию текущего состояния графики в стеке состояния графики. Этот стек может хранить до 32-х состояний графики, включая текущее состояние.

Оператор GRESTORE восстанавливает состояние графики, сохраненное в стеке самым последним. Все характеристики текущего графического состояния, включая текущий путь, цвет, уровень серого цвета, ширину линии и систему пользовательских координат возвращаются в состояние, в котором они были перед выполнением оператора GSAVE.