Сдам Сам

ПОЛЕЗНОЕ


КАТЕГОРИИ







Мультипликация с управлением движения образа





 

 

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

dx:= 1; dy:= 1; { пошаговые перемещения по осям X и Y }

x:= 100; y:= 100; { начальные координаты смещаемого образа }

Xmax:= GetMaxX; Ymax:= GetMaxY;

Repeat

PutImage(x, y, P1^, 1); { выводим образ (запомненный ранее в P1^) }

xold:= x; yold:= y; { запоминаем координаты }

c:= readkey; { считываем код клавиши в переменную типа char }

if c = #0 then c:= readkey;

case c of { анализируем код нажатой клавиши }

#72: if y > 1 then y:= y - dy; { смещение вверх }

#75: if x > 2 then x:= x - dx; { смещение влево }

#80: if y < Ymax-100 then y:= y + dy; { смещение вниз }

#77: if x < Xmax-20 then x:= x + dx end; { смещение вправо }

PutImage(xold, yold, P1^, 1) {стираем образ }

Until c = #27; { при нажатии клавиши Esc перемещение прекратится }

 

 

Практическое задание N 1. 65

 

1. Перемещать по экрану стрелку-указатель под управлением курсорных клавиш с озвучиванием движения разной частотой звука в зависимости от направления перемещения.

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

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

 

 

Модификация контурного изображения

 

 

В производстве мультфильмов широко используется следующий метод анимации (плавной модификации контурного изображения):

1. Задается массив координат узловых точек исходного (начального) контурного изображения (X1[1.. N], Y1[1.. N]). Соединяя определенным образом эти точки отрезками прямых, получаем изображение.

2. Задается массив координат узловых точек целевого (конечного) контурного изображения (X2[1.. N], Y2[1.. N]). Количество точек одинаково для обоих массивов.

3. Плавной модификацией исходного образа получаем целевое изображение. Для этого последовательно находятся наборы координат X[1.. N], Y[1.. N] промежуточных образов. Каждую i-точку промежуточного образа выбирают на отрезке прямой между соответствующими точками исходного и целевого контуров, т. е. между точкой (X1[i], Y1[i]) и точкой (X2[i], Y2[i]). Таким образом отрезок делится на "m" частей, где m - количество промежуточных образов, включая целевой. Промежуточные образы перерисовывают, постепенно удаляясь от исходного образа.

 

           
 
 
     
 
     

 

 


X1[i] X[i] X2[i]

Y1[i] Y[i] Y2[i]

 

В случае равномерного деления отрезков координаты узловых точек промежуточных образов можно рассчитать по формулам:

 

x[i]:= x1[i] + (x2[i] - x1[i])*k/m;

y[i]:= y1[i] + (y2[i] - y1[i])*k/m;

 

где k - номер промежуточного образа,

m - количество делений отрезка.

 

Перерисовку образов удобно делать двойным рисованием в режиме SetWriteMode(1), либо используя процедуры работы с видеопамятью в режиме XorPut. Задержка видимости образа (delay) определяет скорость преобразования. В приведенной ниже демонстрационной программе задается исходный контур из 12 точек X1[i], Y1[i] - координаты узлов на квадрате, а целевой контур из 12 точек X2[i], Y2[i] - координаты вершин звезды.

 

uses Graph, Crt;

var Gd, Gm, i, j, k, n, xc, yc, r, m: integer;

x, y, x1, y1, x2, y2: array[1..12] of integer; alfa: real;

Begin

Gd:=Detect; InitGraph(Gd, Gm, ''); SetWriteMode(1);

{ координаты узлов на квадрате - исходной фигуры: }

for i:=7 to 10 do begin x1[i]:= 10; y1[i]:= 10+(i-7)*40 end;

for i:=1 to 4 do begin x1[i]:=130; y1[i]:=130-(i-1)*40 end;

x1[11]:= 50; x1[12]:= 90; y1[11]:=130; y1[12]:=130;

x1[ 6]:= 50; x1[ 5]:= 90; y1[ 5]:= 10; y1[ 6]:= 10;

{ координаты узлов на звезде - целевой фигуры: }

xc:= 500; yc:= 300; { центр звезды }

for i:= 1 to 12 do begin alfa:= (1-i)*(2*pi)/12;

if (i mod 2)=0 then r:=30 else r:=100;

x2[i]:= xc + round(r*cos(alfa));

y2[i]:= yc + round(r*sin(alfa))

end;

m:= 60; { координаты узлов на промежуточных образах: }

for k:= 0 to m do begin

for i:=1 to 12 do begin x[i]:=x1[i]+round((x2[i]-x1[i])*k/m);

y[i]:=y1[i]+round((y2[i]-y1[i])*k/m)

end;

for j:= 1 to 2 do begin { перерисовка промежуточных образов }

moveto(x[12], y[12]);

for i:= 1 to 12 do LineTo(x[i], y[i]);

if j = 1 then delay(40)

End

end;

Readln; CloseGraph

End.

 

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

 

 

Практическое задание N 1. 66

 

1. Модификацией контурного изображения получить анимацию одного из образов в режиме SetWriteMode(1):

- раскрывающийся парашют,

- распускающийся цветок, либо листок (использовать полярные координаты),

- растущий гриб,

- растущая ель,

- сгорающая свеча,

- тающий снеговик,

- улетающий вдаль (или приближающийся) космический объект,

- сгибающаяся по тяжестью растущего плода ветка.

2. Модифицировать заполненные фигуры с использованием двух видеостраниц.

 







Что вызывает тренды на фондовых и товарных рынках Объяснение теории грузового поезда Первые 17 лет моих рыночных исследований сводились к попыткам вычис­лить, когда этот...

Живите по правилу: МАЛО ЛИ ЧТО НА СВЕТЕ СУЩЕСТВУЕТ? Я неслучайно подчеркиваю, что место в голове ограничено, а информации вокруг много, и что ваше право...

Что будет с Землей, если ось ее сместится на 6666 км? Что будет с Землей? - задался я вопросом...

Конфликты в семейной жизни. Как это изменить? Редкий брак и взаимоотношения существуют без конфликтов и напряженности. Через это проходят все...





Не нашли то, что искали? Воспользуйтесь поиском гугл на сайте:


©2015- 2024 zdamsam.ru Размещенные материалы защищены законодательством РФ.