Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
15.06.2014
Размер:
226.82 Кб
Скачать

2. Приемы создания динамичных графических образов.

2.1. Перерисовывание объекта.

Наиболее простой метод моделирования движущегося объекта состоит в многократном его перерисовывании со смещением координат - на текущем шаге по текущим координатам объект рисуется, запоминаются старые и определяются его новые координаты, задается задержка (ее величина определит скорость объекта). Затем следует рисование цветом фона по старым координатам и повторение процесса на следующем шаге.

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

{ "снег" - движение массива пикселов с остановкой на преградах. }

Gx:=GetmaxX; Gy:=GetmaxY;

for i:=1 to 200 do begin

X[i]:= random( Gx);

Y[i]:= random( Gy div 2); PutPixel( X[i], Y[i], 15) end;

Repeat

for i:=1 to 200 do begin

if ( Y[i] < Gy ) and ( GetPixel( X[i],Y[i]+1 ) = 0 ) { анализ границы }

{ и цвета пиксела }

then begin PutPixel( X[i],Y[i], 0); Y[i]:= Y[i]+1;

PutPixel( X[i],Y[i],15) end { движение пикселов }

else begin { образование новых пикселов }

Y[i]:= random(Gy div 10);

X[i]:= random(Gx); PutPixel( X[i],Y[i], 15) end

end

Until keypressed;

В примере сначала генерируется набор координат X[i],Y[i] в верхней половине экрана и выводятся белые точки (снежинки). Затем каждая точка гасится, смещается по оси Y на один пиксел и высвечивается вновь. Если точка по ходу движения достигнет нижнего края экрана или встретит "преграду" (точку не черного цвета), то она не гасится и генерируются новые координаты этой точки в верхней части экрана.

2.2. Плавная модификация контурного изображения.

Метод используется для анимации образов, задаваемых набором координат узловых точек. Этапы реализации метода:

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

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

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

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;

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