Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
_МЕТ№2.DOC
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
247.81 Кб
Скачать

5. Запоминание и вывод изображений

Имеется возможность запоминать двоичный образ экрана в памяти ЭВМ и выдавать его на экран. Таким образом создается мультипликация. Для этого используются следующие процедуры и функции модуля Graph:

1) ImageSize (X1,Y1,X2,Y2:Word): Word; - Функция, которая определяет размер блока памяти в байтах для сохранения двоичного образца прямоугольной области экрана с координатами левого верхнего (X1,Y1) и правого нижнего (X2,Y2) углов.

Пример.

Size: = ImageSize (1,1,100,50);

2) GetMem(Var p: Pointer;размер: Word);

Эта процедура создает динамическую переменную указанного размера и помещает ее адрес в переменную-указатель р. Maксимальный размер блока равен 64 Кбайт. Указатель Р^ хранит начальный адрес выделенной области.

Пример.

GetMem (P, Size); – выделена область для образа размером

Size из предыдущего примера.

3) GetImage(X1,Y1,X2,Y2: Word; Var указатель);

Сохраняет в буфере двоичный образ заданной области экрана (область задается координатами (X1,Y1) и (X2,Y2) ). Адрес области памяти записывается в указателе Р^.

Пример.

GetImage (1,1,100,50, P^);

4) PutImage(X,Y: Word; Var указатель^ ; двоичный_оператор:Word);

Из буфера в заданную область экрана выводится двоичный образ.

Область экрана задается координатами (X,Y) – верхний левый угол. Двоичный оператор определяет, как будет осуществляться вывод на экран двоичного образа. Он может иметь следующие значения:

NormalPut=0; - нормальное (обычное) изображение

XOrPut=1; - обратное изображение (цвета фона и рисунка противо положные), используется для стирания

OrPut=2;

........

NotPut=4; - негативное изображение

Пример.

PutImage(20,10,P^,NotPut);

Пример.

Составить программу, которая передвигает горизонтально по экрану круг радиуса 20 (пикселей).

Алгоритм

1.1. Задать драйвер и режим

1.2. Инициировать Graph

2. Если Ошибка=GrOk то

2.1. Очистить экран

2.2. Задать тип и цвет линии

2.3. Нарисовать и закрасить круг

2.4. Задать границы области, которую нужно сохранить,

например: x1=120; y1=90; x2=190; y2=150

2.5. Сохранить образ

2.6. Повторять

а) Задержать вывод;

б) Стереть изображение;

в) Изменить координату х1, например: х1=х1+10;

г) вывести изображение

Пока не нажата клавиша

2.7. Закрыть Graph

3. Закончить.

Программа, которая реализует описанный алгоритм приведена ниже.

Program MoveCircle;

Uses

Crt,Graph;

Var

p:pointer;

Size: Word;

Er,Gd,Gm:Integer;

x1,y1,x2,y2:Integer;

Begin

Gd:=Detect;

Gm:=VgaHi;

InitGraph(Gd,Gm,'');

Er:=Graphresult;

If Er=GrOk then

Begin {Графика}

SetBkColor(Blue);

Cleardevice;

Setcolor(Red);

SetlineStyle(0,0,3);

Circle(150,120,20);

SetFillStyle(8,Yellow); { штриховка ххх желтым }

{ заштриховать до красного }

FloodFill(150,120,Red);

{ координаты сохраняемой области }

x1:=120; y1:=90;

x2:=190; y2:=150;

{Сохранение образа}

Size:=ImageSize(x1,y1,x2,y2);

GetMem(p,Size);

GetImage(x1,y1,x2,y2,P^);

Repeat

Delay(50);

{Стираем старое изображение}

PutImage(x1,y1,P^, XorPut);

{Перемещение круга}

x1:=x1+10;

PutImage(x1,y1,P^, NormalPut);

Until KeyPressed; { Останов изображения }

CloseGraph;

End

Else

Writeln('Ошибка графики',Er);

Readln;

End.

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

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