Информатика -продвинутый курс



         

РЕКУРСИВНЫЕ АЛГОРИТМЫ - часть 3


/p>

Векторы, соединяющие отдельные элементы кривых, образуют с осью абсцисс углы, кратные pi/4; средние векторы во всех схемах имеют длину, в два раза большую, чем крайние. Для построения вектора длины U под углом T*pi/4 к оси абсцисс в программе описана процедура linep(T,U:integer):

Программа 40

program serpinsk;

uses crt,graph;

const sq=512;

var i, xO, yO, x, y, t, u, gd, gm: integer; ch:chart;

procedure linep(t,u:integer);

var xl, yl:integer;

begin x:=x+round(u*cos(t*pi/4)) ;

y:=y-round(u*sin(t*pi/4)); lineto(x,y) ;

end;

procedure b(i:integer); forward;

procedure с(i:integer); forward;

procedure d(i:integer); forward;

procedure a(i:integer);

begin

if i>0 then begin a(i-l); linep(7,u); b(i-l); linep(0,2*u);

d(i-l); linep(l,u); a(i-l)

end end; •

procedure b;

begin

if i>0 then begin b(i-l); linep(5,u); c(i-l); linep(6,2*u);

a(i-l); linep(7,u); b(i-l)

end end;

procedure c;

begin

if i>0 then begin c(i-l); linep(3,u); d(i-l); linep(4,2*u) ;

b(i-l); linep(5,u);C(i-l)

end end;

procedure d;

begin

if i>0 then begin d(i-l); linep(l,u); a(i-l); linep(2,2*u);

c(i-l); linep(3,u); d(i-l) end. end;

begin gd:=0; initgraph(gd, gm, ' ' );

u:=sq div 4; x0:=320; y0:=128; i:=0;

repeat

i:=i+l; x0:=x0-u; u:=u div 2; y0:=y0-u;

x:=x0; y:=y0; setcolor(2*i);

moveto(x,y); a(i); linep(7,u); b(i);

linep(5,u); c(i); linep(3,u);

d(i); linep(l,u); delay(2000) until i=5;

settextstyle(0,0,1) ;

outtextxy(200, 470, 'КРИВЫЕ

СЕРПИНСКОГО

S1 - S5');

readln; closegraph

end.

В 1891 г. Д. Гильберт открыл серию рекурсивных кривых, которые получили название кривых Гильберта. Кривая Гильберта Hi, подобно кривым Серпинского, может быть получена из четырех экземпляров кривой H(i-l) вдвое меньшего размера, повернутых должным образом и соединенных отрезками. Ниже приводится программа, рисующая узор из шести кривых Гильберта.

Программа 41

program hilbert;

uses crt,graph;

const sq=448;

var i,x0,y0,x,y,t,u,gd,gm:integer; ch:char;

procedure linep(t,u:integer);




Содержание  Назад  Вперед