Методические указания и задания к лабораторным работам по курсу “




НазваниеМетодические указания и задания к лабораторным работам по курсу “
страница1/7
Дата публикации02.12.2013
Размер0.88 Mb.
ТипМетодические указания
uchebilka.ru > Информатика > Методические указания
  1   2   3   4   5   6   7


МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ УКРАИНЫ

ДОНЕЦКИЙ НАЦИОНАЛЬНЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ

МЕТОДИЧЕСКИЕ УКАЗАНИЯ И ЗАДАНИЯ

К ЛАБОРАТОРНЫМ РАБОТАМ ПО КУРСУ

МЕТОДЫ И СПОСОБЫ КОМПЬЮТЕРНЫХ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ ”



для студентов специальности 6.050101

“ Компьютерный эколого-экономический мониторинг”

Утверждено на заседании кафедры

“Компьютерные системы мониторинга”

протокол № 3 от 26.11.10
Утверждено на заседании

учебно-издательского совета ДонНТУ

протокол № __ от __________

^

Донецк – ДонНТУ - 2010

УДК 681.3




Методические указания и задания к лабораторным работам по курсу “Методы и способы компьютерных информационных технологий“, (для студентов специальности 7.080407 “Компьютерный эколого-экономический мониторинг ”/

^

сост.: доц. Губенко Н.Е., асс. Миргород В.С. – Донецк: ДонНТУ, 2010 - 96с.



Приведены теоретические сведения, методические рекомендации, примеры и задания для выполнения лабораторных работ по следующим разделам дисциплины:

  • Программирование растровых изображений на языке PostScript;

  • работа с манипулятором «мышь»;

  • работа с драйверами CD-ROM;

- программирование видеокарты;

- работа с LPT портом.


Составители: Губенко Н.Е., к.т.н., доцент

Миргород В.С., ассистент
Рецензент:


^ Лабораторная работа №1

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

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

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

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

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

  • описание страницы во много раз компактнее даже сильно сжатого изображения;

  • процесс подготовки печатной страницы требует значительного времени: если пересылается описание, то подготовкой к печати занимается процессор принтера или дисплейный процессор, что освобождает процессор персонального компьютера (ПК) для выполнения другой работы и тем самым повышает его производительность;

  • самое важное преимущество - это независимость описания от типа устройства.

Текущая страница (ТС) - "идеальная" страница в памяти, на которой рисует PostScript. Она не зависит от физических характеристик устройства, на который страница будет вводиться. В начале работы программы это совершенно чистая страница.

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

Текущая траектория обрезки (ТТО) или траектория отсечения - это границы области, в которой может быть нарисовано изображение.

Пространство устройства (ПУ) - определяет встроенную систему координат растрового устройства для адресации точек на странице.

Пространство пользователя (ПП) - используется для удобства независимого программирования с использованием понятия СИСТЕМА КООРДИНАТ ПОЛЬЗОВАТЕЛЯ (СКП). Позиция элемента на странице задается парой X,Y. PostScript допускает преобразование пространства пользователя:

  • начало СКП можно переносить в любую точку;

  • оси СКП могут быть повернутыми в любую сторону;

  • масштаб по каждой из осей может быть изменен, то есть можно задать линейное преобразование из ПП в ПУ.

Преобразование из ПП в ПУ осуществляется при выводе с помощью ТЕКУЩЕЙ МАТРИЦЫ ПРЕОБРАЗОВАНИЙ (ТМП), имеющей размеры 3х3.

Графический статус системы - определяется текущей траекторией и текущей матрицей преобразований.

Стек:

При программировании на PostScript широко используется концепция стека. СТЕК есть линейная структура, доступ к которой возможен только через ее вершину. PostScript оперирует четырьмя различными стеками: операндов, словарей, выполнения и состояния графики.

Стек операндов - содержит собственно объекты PostScript и результаты действий над ними. Операторы PostScript получают операнды только через стек.

Стек словарей - содержит переменные и словари, открытые в настоящий момент.

Словарь - суть набор пар «имя-значение». Все поименованные значения хранятся в словарях. Операнды также хранятся в словарях вместе с их кодами. Если программа ссылается на некоторое имя, то интерпретатор просматривает стек сверху вниз и ищет первое вхождение этого имени.

Занесение чисел в стек:

Любое число, появившееся в исходном файле PostScript-программы заносится в стек. Например, напишем строку:

-81 110.4 +777

Интерпретатор по мере ее чтения слева направо выполнит следующие действия:

- заносит в стек число -81;

- перемещает указатель на следующую свободную позицию;

- заносит в стек число 110.4;

- перемещает указатель на следующую позицию и т. д.

Стек будет иметь вид:

777

110.4

-81

Число 777 размещается в вершине стека, и оно может быть использовано первым в какой-либо операции. Остальные числа используются в порядке, обратном порядку их занесения в стек.

Таким же образом в стек заносятся PostScript-объекты любого вида: массивы, строки и словари.

Набор символов:

Все символы делятся на специальные и регулярные. Все виды скобок (круглые, квадратные, фигурные, угловые) и знак процента являются для PostScript специальными знаками. Остальные символы -подмножество кода ASCII, используются в программе без ограничений и называются регулярными символами.

Имя - любая последовательность символов, которую нельзя интерпретировать как число и построенная из любых символов, кроме скобок, пробелов, знаков % и /. Если перед именем стоит символ «/», то имя помещается в стек как операнд, иначе оно ищется в стеке словарей. Если найденное имя есть процедура, то она выполняется, иначе имя помещается в стек операндов.

Типы даннях:

Данные делятся на основные и дополнительные. Основные: целые, действительные, логические, массивы и строки. Дополнительные: mark (отметка, метка) и dictionary (словарь).

Константы:

В PostScript используются константы трех типов: целые, действительные и строковые.

Примеры записи целых:

+745 -61 48889 0

Если величина числа превышает предел для представления целых чисел, оно автоматически конвертируется интерпретатором в число типа real.

Примеры записи действительных чисел:

-122.0 33.3E-5 +.0065

Беззнаковые целые числа могут быть записаны в любой позиционной системе счисления с использование префикса в виде:

база#число

где:
база - основание системы счисления (десятичное целое число от 2 до 36);
число - представление числа в указанной базой системе счисления.

Цифры в системах счисления по основанию больше 10 представляются буквами латинского алфавита от A до Z. Например:

18#75cb2e 8#5347 2#11001011

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

Массивы - последовательность объектов, заключенных в квадратные скобки. Они могут быть двух типов: регулярные (содержащие объекты одного типа) и нерегулярные (содержать объекты разных типов).

Комментарий - любой текст, начинающийся символом «%».

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

При разработке программы необходимо учитывать, что операнды-объекты любого вида предварительно размещаются в стеке операндов, а не адресуются непосредственно указанием имени переменной. Такой стиль программирования, при котором операнды задаются до операции над ними, называется ПОСТФИКСНОЙ НОТАЦИЕЙ или польской инверсной записью. Выполняемый оператор забирает операнды из вершины стека, совершает над ними действие и, в общем случае, возвращает результат в вершину стека. Поэтому операторы записываются в следующем виде:

arg1 arg2 … argN operator result

Так запись операции сложения двух чисел, допустим 24+115, в PostScript будет выглядеть следующим образом:

24 115 add

Разделители объектов - пробелы, символы табуляции и новой строки, а также круглые и квадратные скобки.
Гибкость языка:

Несмотря на большое количество встроенных операторов в PostScript нет зарезервированных слов. Любое слово переопределяемо. Программа в PostScript может рассматриваться как данные.

Арифметические операторы:

Унарная операция:

neg – изменить знак числа в вершине стека.

Пример: -543 neg = > 543

Бинарные операции:

Add - сложение,

Sub - вычитание,

div - деление,

idiv - целочисленное деление.

mod - остаток от деления.

Операнды операторов MOD и IDIV должны быть целыми числами.

Mul - перемножает два числа в вершине стека, помещая вместо них их произведение.

При выполнении этих операций оба операнда извлекаются из вершины стека. Вторым операндом всегда выступает число из вершины стека, а вторым - число, находящееся под ним.

Примеры записи арифметических выражений:

Обратите внимание на то, что выражения на языке PostScript можно представить несколькими способами!

  1. 23 + ( 8 : 2 )

    1. а) 8 2 div 23 add

    2. б) 23 8 2 div add

  2. 39 - ( 4*7 )

    1. а) 39 4 7 mul sub

    2. б) 4 7 mul 39 exch sub

В случае б) оператор EXCH меняет местами положение двух верхних чисел в вершине стека. Применение оператора EXCH вызвано тем, что SUB вычитает число в вершине стека из следующего за ним, что без EXCH приводит к неверному порядку действий.

Операторы управления стеком:

Эта группа операторов добавляет, удаляет и изменяет порядок следования элементов в стеке.

Clear - очистка стека - удаляет из стека все элементы

а1...аn clear

Сount - число элементов в стеке.

a1...an count a1...an n

Dup - дублирует в стеке его верхний элемент

a1 dup a1 a1

8 dup -> 8 8

Pop - удаляет из стека его верхний элемент

an...a2 a1 pop -> an...a2

25 31 4 pop -> 25 31

Roll - циклически сдвигает элементы стека. При этом число и направление сдвига задается первым (верхним) элементом, а количество сдвигаемых элементов - вторым. Если первый элемент положительный, сдвиг осуществляется вправо, иначе - влево.

15 7 8 9 3 1 roll -> 15 9 7 8

15 7 8 9 3 -1 roll -> 15 8 9 7

Copy дублирует n верхних элементов стеков

a1...an n copy a1...an a1...an

= = удаляет элемент из вершины стека и отображает его на экране.

Pstack - печатает все содержимое стека, не изменяя его.

Формирование графических изображений:

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

- конструирование траектории;

- нанесение ее на текущую поверхность;

- вывод страницы.

Операторы конструирования траектории:

x y moveto - точку с координатами х, у делает текущей на текущей странице;

dx dy rmoveto - перемещает текущую точку на текущей странице на величину dx dy;

х у lineto добавляет к траектории отрезок прямой от текущей точки до точки с координатами х у;

dx dy rlineto добавляет к траектории отрезок прямой от текущей точки до точки с координатами х + dx у + dy;

x y r angl1 angl2 arc - добавляет к заданной траектории дугу (окружность) и требует наличия в стеке пяти аргументов: координат х, у центра окружности, радиуса, угла начала дуги, угла конца дуги. Дуга строится против часовой стрелки:

100 100 42 30 110 arc

Аналогичный ARC оператор ARCN строит угол по часовой стрелке. Сравните:

100 100 42 30 110 arcn

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

Чтобы нарисовать окружность, нужно задать ARC угол в 360 градусов, например:

150 200 60 0 360 arc

x1 y1 x2 y2 r arcto - сглаживание углов. Пересекающиеся линии часто бывает необходимо соединить плавной кривой. В стеке задаются координаты двух точек и радиус. Оператор рисует сегмент прямой линии от текущей точки по направлению к точке х1, у1, а затем дугу до её пересечения со второй прямой. ARCTO возвращает в стеке координаты начала и конца дуги. Если они не нужны, то эти числа следует удалить из стека:

4 {pop} repeat
Операторы управления выводом:
- newpath - очищает текущую траекторию и готовит систему к началу конструирования новой траектории. Оператор необходим перед началом любой новой траектории;
- closepath - закрывает текущую траекторию, добавляя при этом отрезок, начало котрого - текущая точка, а конец - начальная точка траектории;
- stroke - вызывает рисование сконструированного нами пути на текущей странице с учетом текущих атрибутов ( текущей толщины линии, текущего цвета пера, текущего образа линии, текущего способа соединения линий).

В системе координат, принятой в PostScript по умолчанию, начало координат находится в нижнем левом углу страницы. Координата х увеличивается вправо, а у - при движении вверх. Единица длины в этой системе равна 1/72 дюйма. По умолчанию текущий цвет пера - черный, а текущий образ линии - сплошная.

- showpage - отображает (печатает) текущую страницу и подготавливает новую.

ПРИМЕР:

Написать программу, рисующую квадрат со стороной один дюйм, расположенный в центре страницы:

newpath

200 300 moveto

0 72 rlineto

0 -72 rlineto

-72 0 rlineto

stroke

showpage
Наш квадрат, как вы заметили, имеет выщерблину в левом нижнем углу, так как линии соединяются без учета толщины. Чтобы избежать этого явления, следует использовать оператор CLOTHEPATH.
Операторы управления свойствами:

- setlinewidth - позволяет вам установить ширину линии Х * 1/72 дюйма. Данный оператор действует на все линии, помещаемые на текущую страницу, пока не встретится другой оператор setlinewidth;

- fill - закрывает текущую траекторию и заполняет ее текущим цветом (уровнем серого) и очищает текущую траекторию. Используется вместо stroke ;

- setgray - задает уровень серого цвета для заполнения фигуры в долях от единицы (в интервале от 0 - черный цвет до 1 - белый);

- R G B setrgbcolor - задает сочетание интенсивностей трех основных цветов (красного, зеленого и синего); интенсивность выражается числом в диапазоне от 0 до 1 (0 - полное отсутствие соответствующего цвета, 1 - максимальная его интенсивность);

- H S B sethsbcolor - задает тон (цвет), насыщенность, яркость. Тон определяет цвет как точку на цветовом круге (0 градусов - чистый красный. 120 градусов – чистый зеленый, 240 градусов - чистый синий; остальные цвета спектра определяются смешением двух соседних цветов). Насыщенность цвета задается числом (0 - отсутствие цвета, 1 - максимальная насыщенность). Яркость, то есть содержание белого цвета в данном, задается числом от 0 до 1 (0 - черный, 1 - белый).

ПРИМЕР: Рисование перекрывающихся областей

При рисовании перекрывающихся областей цвет их пересечения определяется цветом, нанесенным на текущую страницу последним. Нарисуем два перекрывающихся прямоугольника.

%!

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 также очищает текущую траекторию.

Задание к лабораторной работе №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.

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

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

^ Лабораторная работа №3

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

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

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

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

12 5 sub

и

{ 12 5 sub }

В первом случае числа 12 и 5 будут помещены в стек и выполнена операция вычитания, а во втором - эти числа и оператор SUB будут помещены в массив, который затем будет занесен в стек. Выполняемому массиву может предшествовать имя, задаваемое в виде литерала, а закрывать его может оператор DEF, который ассоциирует его с именем в текущем словаре.

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

Оператор if:

Прежде чем рассмотреть этот, посмотрим, как записываются операции сравнения чисел. Вспомним, что в PostScript операторы сравнения следуют за сравниваемыми величинами.

Оператор

Значение

eg

= (равно)

gt

> (больше)

ge

>= (больше или равно)

ne

<> (не равно)

lt

< (меньше)

le

<= (меньше или равно)

Логические операторы: NOT, AND, OR и XOR.

Результат операции сравнения или логической операции - логическое значение TRUE или FALSE.

условие {proc} if

Оператор IF берет из стека логический объект, получаемый в результате вычисления условия, и выполняемый массив. Если значение логического объекта TRUE, то выполняются операции, записанные в этом массиве.

Например:

%%% Определяем переменные

/step 15 def

/rightmargin 450 def

%%% Определяем функцию

/checkmargin {

currentpoint pop % оставляет в стеке координату х текущей точки

rightmargin

gt { % Если число на вершине стека больше 450

0 step % то переходим в начало следующей строки

translate

0 0 moveto

} if % в противном случае ничего не делаем

} def

Процедура получает координату текущей точки и сравнивает её со значением правой границы рабочего поля. Если условие выполняется, то происходит перенос начала координат на следующую строку.

Оператор ifelse:

Позволяет выбрать в зависимости от условия выполнение одной или другой последовательности операторов. Его формат:

Bool {proc1} {proc2} ifelse

Если значение в вершине стека равно TRUE, выполняется последовательность {PROC1}, иначе - {PROC2}.

Циклы:

В языке PostScript имеется три основных конструкции циклов: простой, с параметром и с условием.

Простой цикл имеет следующую структуру:

<количество повторений> <повторяемая процедура> repeat

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

{pop} repeat

Цикл с параметром напоминает конструкцию цикла 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
Цикл с условием соответствует REPEAT...UNTIL в Паскале и имеет конструкцию: <выполняемая процедура> LOOP.

Процедура выполняется до тех пор, пока в ней не встретится оператор EXIT, который заканчивает циклическое выполнение. Если в повторяемой процедуре нет оператора exit, то цикл будет бесконечным, например:

Напишем программу рисования конечной последовательности кругов двух диаметров, центры которых лежат на прямой, параллельной оси Х.

%%% Определение процедур

/pagewidth 8 72 mul def % Ширина страницы

/circle { % Рисование круга

x y radius

0 360 arc

stroke

} def

/new-x { % Новая позиция для следующего. круга

x radius add % Это эквивалентно: х=х+radius

/x exch def } def

/DoLineOfCrle { % Рисуем линию из окружностей

/y exch def % заносим значения из стека в переменные

/radius exch def

/x 0 def

{ % условный цикл рисования окружностей до конца страницы

x pagewidth le % центр нового круга в пределах границы?

{circle new-x} % да - рисуем и вычисляем новую позицию

{exit} % иначе - выход из цикла

ifelse

} loop

} def

%%%% Рисуем две линии кругов

15 200 DoLineOfCrle

45 200 DoLineOfCrle

showpage
Массивы:

PostScript работает со сложными структурами (записями), которые называются одномерными массивами. Они определяются как набор объектов (возможно разного типа), заключенный в квадратные скобки. Так

[ (PC Magazine) 1991 (сор) true]

Операции внутри квадратных скобок выполняются по обычным правилам PostScript, так после вычисления

[(add) 10 5 6 mul add]

получим массив из двух элементов [(add) 40] .

Массив может быть также определен с помощью оператора ARRAY, который берет из стека число и создает массив такой длины.

8 array

Эта строка оставит в стеке массив из 8 элементов. Его элементы - NULL-объекты. Элементы массива нумеруются с нуля, что нужно учитывать при вычислении их индексов.

При анализе массива интерпретатор просматривает строку слева направо. Открывающая (левая) квадратная скобка оставляет в стеке объект, называемый маркером (MARK). После маркера интерпретатор просматривает строку программы дальше и помещает в стек все встречающиеся ему объекты до правой квадратной скобки. Эта скобка является оператором, создающим массив из хранящихся в стеке объектов: от вершины до маркера. При этом маркер удаляется из стека, а массив остаётся.

Массивы, строки и словари - всё это примеры объектов сложных типов. Их значения хранятся отдельно от самого объекта (то есть PostScript работает в этом случае не со значением, а с указателем на него).

Для работы с элементами массивов служат операторы PUT и GET.

Оператор PUT берет из стека три аргумента: массив, индекс элемента в массиве и объект. Он помещает объект в массив в позицию, заданную индексом:

/MyArray 12 array def

MyArray 5 (Jerry) put

У оператора GET два аргумента: массив и индекс. Он возвращает в стеке элемент массива с заданным индексом. После выполнения строки

[0 1 2 3 4 5] 5 get

в вершине стека будет число 4.

Оператор LENGTH, возвращает длину массива (то есть число его элементов).

Пример программы. которая распечатывает массив, находящийся в стеке.

/LeftM 60 def

/TmpString 40 string def

/Helvetica findfont

11 scalefont

setfont % задали шрифт
/newln {

currentpoint 15 sub exch pop % y-15

LeftM exch moveto

} def
/printarr { % в стеке массив

/arr exch def % поместить массив в переменную

0 1 % параметры цикла: от шаг

arr length 1 sub % до (ДлинаМассива - 1)

{

arr exch get % следующий элемент

TmpString cvs % преобразуем вго в строков тип

show newln % печатаем и нач. новую строку

} for

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

LeftM 400 moveto % печатаем отсюда

% задаем массив

[(Julia) % строка

15 % число

/SimplName % литерал

[8 3 4] % массив

{NewLN} % исполняемый массив

LeftM % переменная

]

printarr % печатаем его

showpage

Перед каждым выполнением цикла оператор for помещает в стек счетчик, который используется в качестве индекса в строке arr exch get. (В этой строке берется не сам массив из стека, а ссылка на него по имени переменной, поэтому и делается exch).

Результат работы программы:

Julia

15

SimplName

--nostringval--

--nostringval--

60
Как видно из примера обычные действия над массивом в PostScript достаточно утомительны. Так как наиболее частой операцией над массивом в этом языке является применение некоторой процедуры к каждому его элементу, то для этого целесообразно применить специальный оператор цикла FORALL. Предыдущий пример можно записать с его помощью более компактно:

arr {30 string cvs show} forall
^ Задание к лабораторной работе №3

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

  1   2   3   4   5   6   7

Добавить документ в свой блог или на сайт

Похожие:

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания и задания к лабораторным работам по курсу «Архитектура компьютеров (АК)»
Методические указания к лабораторным работам по курсу “Архитектура компьютеров предназначены для студентов специальностей «Системное...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам по курсу «Системы моделирования и обработки данных»
Методические указания к лабораторным работам по курсу «Системы моделирования и обработки данных» (для студентов всех форм обучения...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания и задания к лабораторным работам по курсу «Информационная безопасность»
Методические указания предназначены для усвоения теоретических основ и формирования практических навыков по курсу «информационная...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания и задания к лабораторным работам по курсу «Программные...
Методические указания предназначены для усвоения теоретических основ и формирования практических навыков по курсу «Программные системы...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам по курсу “Основы автоматизированного...
Методические указания к лабораторным лаботам по курсу «Основы автоматизированного проектирования» (для студентов специальности 090202...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам для студентов специальности 092203, 7092205 одесса
Методические указания к лабораторным работам по курсу «Микропроцессорные системы управления» для студентов специальностей 092203,...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам по курсу «Диагностика...
Методические указания предназначены для студентов, обучающихся по направлению

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам по дисциплине «Электротехника»
Методические указания к лабораторным работам по дисциплине «Электротехника». Ч постоянный ток. / Донецкий институт железнодорожного...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к лабораторным работам по дисциплине «Электроника и микросхемотехника»
Методические указания к лабораторным работам по дисциплине «Электроника и микросхемотехника». Ч / Донецкий институт железнодорожного...

Методические указания и задания к лабораторным работам по курсу “ iconМетодические указания к практическим занятиям по курсу «Статистика в машиностроении»
Методические указания к лабораторным работам по курсу «Статистика в машиностроении» (для студентов всех форм обучения направления...

Вы можете разместить ссылку на наш сайт:
Школьные материалы


При копировании материала укажите ссылку © 2013
контакты
uchebilka.ru
Главная страница


<