Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [ 51 ] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133

program Hilbert(pf,output);

{изображение кривых Гильберта порядка от I до п]

const и = 4; АО = 512;

var i,h,x,y,xO,yO: integer;

pf: Ше of integer; [plot file]

procedure A(i: integer);

begin if i > 0 then

begin X)(i-1); л; := x-h; plot;

- y--~ y-h; plot;------

(i-1); X :~ x+h; plot;

t J5(f-1)

* end

end ;

procedure £(i: integer); begin if / > 0 then

begin C(i-1); у y+h; plot; £(i-l); X := x+h; plot; B{i~l); у y-h; plot; A(j-i) end

end ;

procedure C(i; integer); begin if I > б then

begin .B(i-1); x := x+h; plot; , C{i~\); у y+h; plot:

: 1); л::~ x-h; plot;

end:

procedure D(i: integer); begin if I > 0 then

begin A{i-\); у :== y-h; plot; Щ-1); X : x-h; plot; ; D{i-\); у'. y+h; plot;

Cii-1)

nd ;

begin startplot;

i := 0; h := Л0; лО := h div 2; >0 :=xO; . repeat {изображение кривой Гильберта порядка i]

i :== i+l; h := h div 2; [ лО := лО + (А div 2); jO := yO -b (A div 2); .X := xO; у := >0; л'й'/о?;



A(i) nnffl = и; endplot end .

Программа 3.1. Кривые Гильберта.

сующую Hi в виде композиции четырех частей, каждая . которых рисует Hi-x соответствующего размера и с нужныц поворотом. Если мы обозначим эти четыре части А, В, С -rJ] а подпрограммы, рисующие соединительные линии, - в вид{ стрелок, указывающих соответствующее направление, то по-лучим следующую рекурсивную схему (см. рис. 3.3):

----Eivl: Л1Л В^

ПБ: CBBiA

tJ С: B->C]CD

Если длину соединительной линии обозначить через h, то процедуру, соответствующую схеме А, можно легко выразить с помощью рекурсивных обращений к описанным аналогичным образом процедурам В и D и самой процедуры А:

procedure A{i: integer);

begin if i > О then

\№фа D{i-l); X : x-h; plot;

Л(1-1); у := y-h; plot; (3,20)

A{i-l); X := x+h; plot;

B(i~l)

Эта процедура инициируется один раз основной nporpaMMoi для каждой кривой Гильберта, которые накладываются одн^ на другую, образуя данный рисунок. Основная программ задает исходную точку для кривой, т. е. начальные значснй X и у, и единичное приращение h. Величина Ло соответствуй щирине всей страницы и должна удовлетворять равенств) 110 = 2 для некоторого kn (см. рис. 3.4). Программа Р сует всего п кривых Гильберта (см. программу 3.1 и рис. 3.5) Похожий, но несколько более сложный и эстетически уто^ ченный рисунок приведен на рис. 3.7. Он также получен помощью наложения нескольких кривых; две такие кривЫ' показаны на рис. .3.6. Кривая Si называется кривой СерпЛ^. ского t-ro порядка. Какова рекурсивная схема для тако



3.3. Два примера рекурсивных программ


Рис. 3.4. Ра.мка для кривых.

Я1 Ш=Ы R

ira LiFEJ I]

HJ гтып

i=t£]

fn mil

R

Я1 lMJ

til ii IJfriH-

LWJ I]

rB--fn

gtra E=bff3

грьрг

Рис. 3.5. Кривые Гильберта порядка Hi, ,.., Яб-




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 [ 51 ] 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133