Практикум. Создание движущихся изображений

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

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

Движение плоских объектов. Любое сложное движение плоских объектов на экране складывается из базовых: перемещения, масштабирования и поворота. Формулы пересчета координат изображений для базовых видов движения следующие.

а б в

Рис. 8.9. Элементарные изменения изображения: а - перемещение; б - масштабирование; в - поворот


Перемещение (рис. 8.9, а)

Х| = х + dx, у, =y + dy,

где х, у - исходные координаты точки; xj, у| - координаты точки после перемещения; dx, dy - смещения по оси х и у соответственно.

Масштабирование относительно точки С (хс, ус) (рис. 8.9, б):

х, =(х-хс) Мх + Хс,

У1 =(У-Ус) Му + ус,

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

Поворот относительно точки С с координатами (хс, ус) (рис. 8.9, в):

xj = (х - хс) cosa + (у - ус) sin a + хс,

У1 = (у - Ус) cosa - (х - хс) sin a + ус ,

где а - угол поворота.

Пример 8.7. Разработать программу, которая демонстрирует на экране движение прямоугольника: прямоугольник улетает от нас к некоторой точке горизонта, одновременно вращаясь вокруг своей оси.

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

Начало:

Установить точку отсчета координат (условное время).

Рассчитать координаты квадрата.

Цикл-пока не истекло время или не нажата любая клавиша

Установить цвет рисования.

Изобразить квадрат.

Приостановить выполнение программы на время просмотра кадра.

Рис. 8.10. Разложение движения


Установить в качестве цвета рисования цвет фона.

Изобразить квадрат цветом фона - стереть.

Изменить точку отсчета (условное время).

Пересчитать координаты квадрата, все-цикл

Конец.

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

Пересчет координат вершин реализуем через разложение «движения» прямоугольника на элементарные составляющие (рис. 8.10): эффект удаления от зрителя получим, используя масштабирование относительно точки горизонта, эффект вращения - за счет поворота вокруг геометрического центра.

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

Program ex;

Uses Crt, Graph;

Const

r=100;

Type

mas=array[1..4] of integer;

Var

x, у xl, yl. mas;

, gd,gm,xn,yn,xc,yc, ij, kl .integer;

t,k:real;

{изображение квадрата по координатам его вершин}

Procedure Square(х,у:mas);

Begin

Line(x[l],y[l],x[2],y[2]);

Line(x[2J,y[2],x[3],y[3J);

Line(x[3],y[3],x[4J,y[4]);

Line(xf4],y[4J,x[lJ,y[IJ);

End;

{определение координат повернутой точки}

Procedure Pow(xc,yc,x,у:integer;t:real;var xl,yl-.integer); Begin

xl: =xc+round((x-xcj *cos(t))+round((y-ycj *sin(t)); yl: =yc+round((y-yc) *cos(t))-round((x-xc) *sin(t));

End;

{определение координат точки после масштабирования}

Procedure Massch(xc,ус,х,y:integer;k:real;var xl.yl.integer); Begin

xl:=round(x*k+(l-k) *xc); yl:=round(y*k+(l-k)*yc);

End;

{основная программа}

Begin

gd: =detect;

InitGraph(gd,gm, ’d:\bp\bgi ’);

SetColor(2); xn: =GetMaxX div 4; yn: =GetMaxYdiv 3*2; xc: =GetMaxX-xn; yc: =GetMaxY-yn;

{расчет начальных координат вершин квадрата}

х[1]:=хп-г; у[1]:-уп-г;

х[2]:=хп+г; у[2]:=уп-г;

х[3]:=хп+г; у[3]:=уп+г;

х[4]: =хп-г; у[4]: =-уп+г;

к:=0.99; t:=0;

{покадровый вывод на экран}

while (t

<< | >>
Источник: Иванова Г.С. Основы программирования. 2002

Еще по теме Практикум. Создание движущихся изображений:

  1. ДВИЖУЩИЕ СИЛЫ, ЗАКОНОМЕРНОСТИ И ПРИНЦИПЫ ПРОЦЕССА ВОСПИТАНИЯ
  2. ИЗОБРАЖЕНИЕ ДВОЙСТВЕННОЕ
  3. Микширование изображения
  4. МЕТОДОЛОГИЧЕСКАЯ ОСНОВА И ДВИЖУЩИЕ СИЛЫ ПРОЦЕССА ОБУЧЕНИЯ. ФУНКЦИИ ОБУЧЕНИЯ, ИХ ВЗАИМОСВЯЗЬ
  5. Совмещение изображений
  6. Название и изображение
  7. 7. Право на неприкосновенность личного изображения
  8. Стирание записи изображения и звука
  9. Соотношение изображения и слова
  10. Психологический практикум (к части II)
  11. Психологический практикум (к части I)
  12. Психологический практикум (к части IV)
  13. Психологический практикум (к части III)
  14. А.К. Быков. психолого­ педагогический практикум, 2006