Построение фрактала Дерево
.doc
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.