TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

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.

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

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz