TURBO PASCAL |
Новости |
1. 15. 5. 4. Модификация контурного изображения
В производстве мультфильмов широко
используется следующий метод анимации (плавной
модификации контурного изображения):
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.
Координаты точек промежуточных образов
можно определять не только равномерным
разбиением прямых линий между исходным и
целевым изображениями, но и соединяя соответствующие
точки исходного и целевого контуров по
кривым линиям с неравномерной разбивкой. |
(с) Все права защищены. По всем интересующим вопросам прошу писать электронный адрес |