|
|||||||||||||||||||||
АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
Модификация контурного изображения
В производстве мультфильмов широко используется следующий метод анимации (плавной модификации контурного изображения): 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; Поиск по сайту: |
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.) |