Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
PASСAL_a4_2007.doc
Скачиваний:
31
Добавлен:
13.09.2019
Размер:
2.51 Mб
Скачать

Лабораторная работа 14. Дополнительные возможности при работе с графикой

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

Задание 1

Скопируйте в Ваш каталог файлы arcs.pas, arc_fill.pas, userln.pas и palette1.pas.

Задание 2

Запустите среду Turbo Pascal. Загрузите файл arcs.pas. Прочитайте комментарии к программе. Разберитесь в тексте программы. Выполните программу. Поэкспериментируйте с ней.

Задание 3

Загрузите файл arc_fill.pas. Прочитайте комментарии. Разберитесь в тексте программы. Проверьте, как она работает. Поэкспериментируйте.

Задание 4

Загрузите файл userln.pas. Прочитайте комментарии. Выполните предложенные там задания.

Задание 5

Загрузите файл palette1.pas. Выполните задание, приведенное в комментариях.

Задание 6

Завершите работу в среде Turbo Pascal. Запустите программу - справочник по процедурам библиотеки GRAPH (папка SPRAV, исполняемая программа graphpas.exe). Повторите известные Вам процедуры и ознакомьтесь с новыми.

Теоретическая работа г. Динамические объекты: считывание картинок в память и вывод их на экран

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

Вы уже знаете, что в качестве “объектов”, с которыми может работать программа, могут выступать числа (целые и вещественные) и текст. В качестве объекта может выступать и небольшая (не больше 1/4 размера экрана) картинка. Эту картинку одной командой можно выводить на экран в произвольном месте, передвигать по экрану, стирать, перекрашивать и т.п. Для работы с таким “объектом” необходимо мысленно заключить эту картинку в прямоугольную рамку (рис. 6).

Рис. 6. Прямоугольная рамка с картинкой

В языке Pascal имеется возможность “считать” прямоугольную область экрана в память и затем вывести ее в любое место экрана. Для этого используются следующие процедуры и функции:

а) функция

ImageSize(x1, y1, x2, y2 : integer) : word;

возвращает размер необходимой памяти для сохранения прямоугольного участка экрана с координатами (x1,y1,x2,y2);

б) процедура

GetMem(var block: pointer; Size: Word);

предназначена для выделения места в памяти для картинки заданного размера Size;

в) процедура

GetImage(x1, y1, x2, y2 : integer; var BitMap);

позволяет запомнить прямоугольный участок экрана с координатами (x1,y1,x2,y2) в участке памяти, на который указывает BitMap. Эта переменная должна быть типа pointer (подробнее об этом типе данных см. ниже);

г) процедура

PutImage(X, Y : integer; var BitMap; BitBlt word);

обеспечивает вывод на экран прямоугольную картинку, на которую указывает переменная BitMap, так, чтобы координаты левого верхнего угла этой картинки были (x,y). Параметр BitBlt может принимать значения, описанные в подразделе констант, для различного вида выводимого изображения и наложения его на существующее.

В программе следует придерживаться следующего порядка действий:

1) в блоке var описать переменную для хранения АДРЕСА ОБЛАСТИ ПАМЯТИ12, в которой будет размещаться картинка:

var block : pointer;

2) в программе определить размер памяти, необходимый для хранения картинки:

Size:=ImageSize(x,y,x1,y1);

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

Здесь Size - переменная типа Word. Т.к. значение переменной не может превышать 65535, память для хранения картинки также ограничена этим значением 64Кб;

3) затем выделяется память для размещения картинки:

GetMem(block,Size);

Эта процедура обеспечивает выделение в памяти места размером Size и в переменную block записывается адрес выделенной области;

4) последний подготовительный шаг: с помощью процедуры GetImage считать картинку с экрана в выделенную с помощью GetMem память:

GetImage(x,y,x1,y1,block^);

Здесь (x,y), (x1,y1) - координаты диагонали прямоугольной области, в которой расположена считываемая картинка, block - это адрес области памяти, block^ - собственно картинка;

5) теперь хранящуюся картинку можно вывести в любое место экрана с помощью процедуры PutImage:

PutImage(x2,y2,block^,XorPut);

Так осуществляется вывод картинки, хранящейся в переменной block^, в прямоугольную область с координатой верхнего левого угла (x2,y2).

Простейшая программа чтения с экрана картинки и вывода ее в другое место экрана выглядит следующим образом:

program Images_0;

{ Данная программа демонстрирует работу функций getimage и putimage.}

uses Graph,Graph0; { - подключение библиотеки подпрограмм, используемой в ДАННОЙ программе }

Const { - блок описания констант }

path=’d:\tp70\bgi’; { - путь к библиотеке Graph}

var block:pointer; { - переменная данного типа позволяет хранить АДРЕС блока памяти}

Size: Word;

begin

Init(path); { - перевод дисплея в графический режим }

{ ШАГ 1. Рисование двух кружков }

SetFillStyle(1,LightBlue); { задание цвета и закраски }

SetColor(White); { цвет рисуемых линий }

Circle(30,36,10); { голубой кружок }

FloodFill(30,36,White); { закрасили его красным цветом }

SetFillStyle(1,LightRed); { задание цвета и закраски }

SetColor(LightMagenta);

Circle(37,43,10); { верхний кружок }

FloodFill(37,43,LightMagenta); { закрасили его желтым цветом }

{ ШАГ 2. Выделяем место для хранения картинки }

Size:=ImageSize(20,20,50,60);

{ данная функция определяет место в памяти компьютера, необходимое для хранения картинки. В качестве параметров выступают координаты диагонали прямоугольной области, в которую входит картинка}

GetMem(block,Size);

{ процедура GetMem обеспечивает выделение в памяти места размером size, и в переменную block записывается АДРЕС выделенной области }

{ ШАГ 3. Считываем картинку в память }

GetImage(20,20,50,60,block^);

{ данная процедура обеспечивает копирование картинки, размещенной в прямоугольной области c координатами диагонали (20,30), (40,60) в область памяти, адрес которой хранится в переменной block. block^ - СОДЕРЖИМОЕ области, адрес которой хранится в block }

{ ШАГ 4. Выводим картинку на экран }

putimage(200,100,block^,XorPut);

{ вывод картинки, хранящейся в памяти, в прямоугольную область экрана с координатами верхнего левого угла (200,100) }

Readln;

CloseGraph; { команда закрытия графики }

end.

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

NormalPut

=

0

замена существующего изображения на копию. В этом случае изображение на новом месте стирается и на это место помещается копия из памяти;

XorPut

=

1

исключающее “ИЛИ”. Повторный вывод изображения на то же место сотрет эту часть экрана. Если операцию применить дважды к одному и тому же месту экрана, то вид изображения на экране не изменится;

OrPut

=

2

режим вывода картинки “ИЛИ”;

AndPut

=

3

режим вывода “И”;

NotPut

=

4

меняет цвета выводимой картинки на “противопо­лож­ные” (инверсное изображение).

На практике используются чаще всего режимы вывода NormalPut, XorPut и NotPut. Как конкретно компьютер выводит изображения? Здесь используются логические операции, указанные в именах режимов, которые в данном случае применяются к числам, кодирующим цвет изображения. Для компьютера число 0 - это False, 1 - True. Так, например, если в режиме OrPut на точку малинового цвета (Magenta) (номер 5, двоичная запись 0101) вывести точку бирюзового цвета (номер 3, двоичная запись 0011), то результирующий цвет можно определить следующим образом:

0101

- малиновый

or

0011

- бирюзовый

0111

- номер 7 , т.е. светло-серый.

Задание

В рассмотренном примере в переменной Block хранится картинка. Составьте фрагмент программы, который позволит нарисовать на экране:

а) ряд из 15 таких картинок;

б) картинки по периметру экрана.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]