В производстве мультфильмов широко используется следующий метод анимации (плавной модификации контурного изображения):
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;