Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Turbo Pascal / Методические указание / Синтез графических образов простыми средствами.DOC
Скачиваний:
17
Добавлен:
15.06.2014
Размер:
205.82 Кб
Скачать

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

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

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

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

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

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

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

Рисунок 11

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

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. Задержка видимости образа определяет скорость преобразования. В приведенной ниже демонстрационной программе задается исходный контур из 12 точек X1[i],Y1[i] - координаты узлов на квадрате, а целевой контур из 12 точекX2[i],Y2[i]- координаты вершин звезды ( рисунок 12).

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:=0; InitGraph(Gd, Gm, 'c:\tp7\bgi');

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)*pi/6;

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:=50; { количество промежуточных образов}

for k:=1 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]); Рисунок 12

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

if(k=1)and(j=1) then readkey; { задержка до начала движения }

if j=1 then delay(100) { время видимости очередного образа }

end end;

readkey; CloseGraph end.

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