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

Построение фрактала Дерево

.doc
Скачиваний:
52
Добавлен:
01.05.2014
Размер:
142.85 Кб
Скачать

program Vetka2;

uses Graph, CRT;

const

min = 1;

var

gd, gm : Integer;

procedure lineto1(x, y : Integer; l, u : real);

begin

Line(x, y, Round(x + l * cos(u)), Round(y - l * sin(u)));

end;

procedure Draw(x, y : Integer; l, u : real);

begin

if KeyPressed then exit;

if l > min then begin

lineto1(x, y, l, u);

x := Round(x + l * cos(u));

y := Round(y - l * sin(u));

Draw(x, y, l*0.4, u - pi/4);

Draw(x, y, l*0.4, u + pi/4);

Draw(x, y, l*0.7, u);

end;

end;

begin

gd := Detect;

InitGraph(gd, gm, 'c:\bp\bgi');

Draw(320, 460, 120, pi/2);

ReadKey;

CloseGraph;

end.

...

procedure Draw(x, y : Integer; l, u : real);

begin

if KeyPressed then exit;

if l > min then begin

lineto1(x, y, l, u);

x := Round(x + l * cos(u));

y := Round(y - l * sin(u));

Draw(x, y, l*0.4, u - pi/4);

Draw(x + Round(l*0.4*cos(u)),

y - Round(l*0.4*sin(u)), l*0.4, u + pi/4);

Draw(x, y, l*0.7, u);

end;

end;

...

program Tree3;

uses CRT, Graph;

var

gd, gm: Integer;

procedure FrTree(x, y, l, u : Real; t : Integer);

begin

if t>0 then begin

l := l*0.5;

Line(Round(x),Round(y),Round(x+l*cos(u)),Round(y-l*sin(u)));

x := Round(x + l * cos(u));

y := Round(y - l * sin(u));

FrTree(x, y, l, u, t-1);

FrTree(x, y, l, u+pi/4, t-1);

FrTree(x, y, l, u-pi/4, t-1);

end;

end;

begin

gd:=Detect;

InitGraph(gd, gm, 'c:\bp\bgi');

FrTree(320, 460, 350, pi/2, 6);

FrTree(320, 460, 350, 3*pi/4, 6);

FrTree(320, 460, 350, pi/4, 6);

ReadKey;

CloseGraph

end.

При написании последней программы использовался код, предоставленный Аслановым А.М.

IFS Деревья

Tree_1 {

0 0 0 0.50 0 0 0.05

0.42 -0.42 0.42 0.42 0 0.2 0.4

0.42 0.42 -0.42 0.42 0 0.2 0.4

0.1 0 0 0.1 0 0.2 0.15

}

Tree_2 {

0.195 -0.488 0.344 0.443 0.4431 0.2452 0.25

0.462 0.414 -0.252 0.361 0.2511 0.5692 0.25

-0.058 -0.07 0.423 -0.111 0.5976 0.0969 0.15

-0.035 0.07 -0.469 0.022 0.4884 0.5069 0.15

-0.637 0 0 0.501 0.8562 0.2513 0.2

}

Tree_3 {

0.28421 -0.35644 0.32632 0.44555 0.00625 0.56275 0.166

0.37895 0.38614 -0.27368 0.34653 -0.08171 0.54063 0.166

0.41053 0 0 0.55446 -0.02832 0.53347 0.166

-0.62105 0 0 0.43564 -0.09537 0.35772 0.166

-0.03158 -0.07921 0.55790 -0.08911 -0.00755 0.51196 0.166

-0.08421 0.08911 -0.55790 -0.05941 -0.17617 0.40587 0.166

}

Tree_4 {

0.05 0 0 0.4 -0.06 -0.47 0.026

-0.05 0 0 -0.4 -0.06 -0.47 0.02640

0.03 -0.14 0 0.26 -0.16 -0.01 0.01030

-0.03 0.14 0 -0.26 -0.16 -0.01 0.01030

0.56 0.44 -0.37 0.51 0.3 0.15 0.59187

0.19 0.07 -0.01 0.15 -0.2 0.28 0.03854

-0.33 -0.34 -0.33 0.34 -0.54 0.39 0.29620

}

Tree_5 {

0.05 0 0 0.6 0 0 0.028

0.05 0 0 -0.5 0 1 0.02326

0.45963 -0.32139 0.38567 0.38302 0 0.6 0.27907

0.46985 -0.15391 0.17101 0.42286 0 1.1 0.20930

0.43301 0.275 -0.25 0.47631 0 1 0.25581

0.42133 0.25712 -0.35353 0.30642 0 0.7 0.20465

}

Tree_6 {

0.45881 -0.22565 0.07268 0.60187 -0.00177 0.31948 0.31

0.34268 0.37561 -0.20337 0.54642 -0.02210 0.32976 0.2

0.13582 0.50273 -0.31347 0.13846 -0.02004 0.21706 0.16

0.25326 -0.48975 0.30798 0.34989 -0.00740 0.19810 0.23

0.06641 0 0 0.47942 -0.01492 -0.02422 0.1

}

    Одним из приложений теории фракталов является генерация фрактальных деревьев. Следущая программа генерирует фрактальное дерево весьма похожее на реальное. Программа написана на языке Pascal. Советую поэкспериментировать с параметрами и палитрой, например, можно получить осеннее дерево.      Приведенный алгоритм строит плоские деревья, но желающие могут его преобразовать в трехмерный вариант. Идея проста, как и все в этом мире. Берется строится ствол дерева случайной длины, от него строятся несколько ветвей тоже случайной длины, при этом толщина уменьшается, далее от каждой ветки строится еще несколько веток (хотя от некоторых ничего не строится совсем), и цикл повторяется. При этом на каждом шаге проверяется длина ветки, если она меньше некоторой заранее определенной величины, то заместо веток рисуется лист, и для этой ветки процесс прекращается. При этом можно изменять самые разные параметры, от ветвистости, толщины ствола и веток, до угла наклона веток и цвета листьев.

program FracTree;

uses Graph, CRT;

procedure Tree(x, y: Integer; a: Real; l: Integer);

var

x1, y1: Integer;

p, s : Integer;

i : Integer;

a1 : Real;

begin

if l<8 then exit;

x1 := Round(x + l*cos(a));

y1 := Round(y + l*sin(a));

if l > 100 then p:=100 else p:=l;

if p < 40 then begin

{Генерация листьев}

if Random > 0.5 then SetColor(10) else SetColor(2); {4, 14}

for i:=0 To 3 do Line(x+i, y, x1, y1)

end

else begin

{Генерация веток}

SetColor(6);

for i:=0 to (p div 6) do Line(x+i-(p div 12), y, x1, y1);

end;

{Следующие ветки}

for i:=0 to 9-Random(9) do begin

s := Random(l-l div 6) + (l div 6);

a1:= a + 1.6*(0.5-Random); {Угол наклона веток}

x1:= Round(x + s*cos(a));

y1:= Round(y + s*sin(a));

Tree(x1, y1, a1, p-5-Random(30)); {Чем меньше вычетаем,

тем пышнее дерево}

end;

end;

var

gd, gm: Integer;

begin

Randomize;

gd:=Detect;

InitGraph(gd, gm, 'c:\bp\bgi');

Tree(320, 480, 3*pi/2, 200);

ReadKey;

CloseGraph;

end.