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