
- •210100 "Управление и информатика в технических системах" и
- •1. Построение графиков функций и траекторий движения
- •1.3. Построение траекторий движения
- •2. Приемы создания динамичных графических образов.
- •2.1. Перерисовывание объекта.
- •2.2. Плавная модификация контурного изображения.
- •2.3. Мультипликация с запоминанием части экрана
- •2.4. Мультипликация с чередованием видеостраниц
- •2.5. Управление движением образа.
- •210100 "Управление и информатика в технических системах" и 210300 "Роботы и робототехнические системы"
2.3. Мультипликация с запоминанием части экрана
Метод применяется для сложных объектов, которые заранее запоминаются как массив пикселей части графического экрана. Прежде чем сохранить фрагмент экрана, под него нужно отвести память, размер которой определяют с помощью функции
ImageSize( X1,Y1, X2,Y2),
параметры которой определяют границу прямоугольной области графического экрана подобно процедуре Rectangle. Функция определяет число байт для хранения области. Этот размер можно также вычислить по формуле (X2-X1+1) *(Y2-Y1+1). Размер отводимой памяти должен быть меньше 64 Кбайт.
Далее определяем параметр P (типа pointer), который будет содержать начальный адрес области памяти ( буфера) размером Size, отводимый для хранения двоичного образа прямоугольной области экрана процедурой:
GetMem( P, Size ).
Сохраняем двоичный образ прямоугольной области в ОЗУ (буфере) процедурой:
GetImage( X1,Y1, X2,Y2, P^ ).
Сохраненный массив пикселов можно выводить на экран из буфера процедурой:
PutImage( X, Y, P^, N );
Здесь X,Y - позиция вывода верхнего левого угла прямоугольной области, P^ обозначает содержимое буфера с начальным адресом Р.
N - режим вывода, соответствующий логическим операциям с битами, определяющими цвет пикселов на экране и соответствующих значений цвета пикселов, выводящихся из буфера:
N=0 (CopyPut) - замена изображения на экране изображением из буфера.
N=1 (XorPut) - "исключающее ИЛИ" (результат равен 1, если значения битов различны),
N=2 ( OrPut) - "ИЛИ" (результат равен 1, если один из битов равен 1),
N=3 ( AndPut) - "И" (результат равен 1, если оба бита равны 1),
N=4 ( NotPut) - "НЕ" (замена изображения на экране инверсным изображением из буфера).
Последовательный вывод в режиме XorPut удобно использовать при создании движущихся изображений, поскольку при первом выводе получаем изображение из буфера, а при втором - восстанавливаем изображение на экране.
Для создания движущегося изображения в буфер помещают, как правило, несколько различных образов, например, рисунок человечка с различным положением рук и ног. На экран выводится первое изображение в режиме XorPut, затем следует задержка выполнения программы, снова выводится первое изображение в режиме XorPut в том же месте (происходит восстановление изображения на экране), далее выводится (обычно в другой позиции) второе изображение в режиме XorPut и т. д.
Пример программы - мультипликации с использованием процедур GetImage / PutImage в режиме вывода XorPut:
uses Graph, Crt;
var Gd, Gm, i, j, k, Size, x, y: Integer; P1,P2: Pointer; { тип указатель }
Begin
Gd:=VGA; Gm:=2; InitGraph(Gd, Gm, 'c:\tp7\bgi');
Size := ImageSize( 0,0, 20,100); { размер области } SetLineStyle( 0,0,3);
{ первый образ } PieSlice(10, 10, 0, 360, 10);
FillEllipse(10, 40, 10, 20);
Line(8, 60, 0, 100); Line(12, 60, 20, 100);
{ второй образ } PieSlice(60, 10, 0, 360, 10);
FillEllipse(60, 40, 10, 20);
Line(60, 60, 60, 100);
GetMem( P1, Size); { P1 - указатель адреса хранения первого образа }
GetImage(0,0, 20,100, P1^);{P1^ - содержимое (двоичный код) образа }
GetMem( P2, Size);
GetImage(50, 0, 70,100, P2^);
x:=0; y:=200; { координаты начальной точки }
Readln; ClearDevice; Line( 0, 300, 600, 300); { "дорога" }
Repeat { имитация движения чередованием образов со смещением }
PutImage( x, y, P1^, 1); delay(50); PutImage( x, y, P1^, 1);
x:=x+10; { смещаем позицию на полшага }
PutImage( x, y, P2^, 1); delay(50); PutImage( x, y, P2^, 1);
x:=x+10
Until (x > GetmaxX -20) or ( KeyPressed );
FreeMem( P1, Size); FreeMem( P2, Size); {освободить память} CloseGraph End.