Вторник, 15.06.2021, 17:57
Приветствую Вас Гость | RSS
Авторизация
Статистика


Rambler's Top100


Яндекс.Метрика
Контакты
356118831
Mr_Ser_Win
Поиск
Архив записей
Календарь
«  Май 2011  »
ПнВтСрЧтПтСбВс
      1
2345678
9101112131415
16171819202122
23242526272829
3031
Реклама

Книжный портал

Блог

Главная » 2011 » Май » 25 » Фрактальное дерево
21:44
Фрактальное дерево
Фрактальное дерево

Генерация фрактального дерева с помощью рекурсивной функции.

Сама генерация происходит при построении случайным образом листьев и веток дерева.
Для этого создаётся процедура Tree(x, y: Integer; a: Real; l: Integer).

На первом шаге эта процедура получает координаты начала дерева ((x, y: Integer), угол наклона ствола (a: Real) и длину основной ветви (l: Integer).

Во время работы процедуры проверяется длина вновь сгенерированной линии, при этом,если она слишком коротка, то мы будем считать её листом, а не веткой.
Координаты конца ветки вычисляются учитывая переданный угол "a":
x1 := Round(x + l*cos(a));
y1 := Round(y + l*sin(a));

Далее на основании длинны ветки, мы вводим дополнительную переменную и ее обработку для сохранения некоторых веток длинными. Те ветви, что будут признаны короткими следующим условием if p < 40 будут дополнительно обрисованы листвой. При рисовании листвы мы случайно выбираем цвет из двух близких для листвы и циклом for i:=0 to 3 , где 3 - это ширина основания листа, отрисовываем лист на основании ранее вычисленных координат paintbox1.Canvas.Line(x+i,y,x1,y1)
Если же длина ветви оказалась большой, мы рисуем ветку вместо листа в цикле for i := 0 to (p div 6).Здесь толщина ветки зависит от её длины.
Далее в цикле for i := 0 to 9 - Random(9) создаётся случайное число веток или листьев из одного узла (от 0 до 9),
вычисляется коэфициент длины будущих веток s := Random(l - l div 6) + (l div 6) и угол наклона будущих побегов a1 := a + 1.6 * (0.5 - Random).На основании s и a1 вычисляются длины будущих побегов:
x1 := Round(x + s * cos(a));
y1 := Round(y + s * sin(a));
Далее следует рекурсивный вызов процедуры Tree для прорисовки новых листьев и веток согласно полученному случайному количеству.Припередаче данных в процедуру Tree изменяется случайным образом длина веток. Чем меньше будет число отнимаемое от длины ветки, тем больше будет ветвление: Tree(x1, y1, a1, p - 5 - Random(30))


unit Unit1; 
 
{$mode objfpc}{$H+}
 
interface
 
uses
 Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
 StdCtrls, ExtCtrls;
 
type
 
 { TForm1 }
 
 TForm1 = class(TForm)
 Button1: TButton;
 PaintBox1: TPaintBox;
 procedure Button1Click(Sender: TObject);
 procedure Tree(x, y: Integer; a: Real; l: Integer);
 private
 { private declarations }
 public
 { public declarations }
 end; 
 
var
 Form1: TForm1;
 kount:integer;
 
implementation
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 
 Tree(320, 580, 3*pi/2, 200);
end;
 
procedure TForm1.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
 paintbox1.Canvas.Pen.Color:=clgreen
 
 else
 paintbox1.Canvas.Pen.Color:=rgbtocolor(90,139,5);
 
 for i := 0 to 3 do
 
 paintbox1.Canvas.Line(x+i,y,x1,y1);
 
 
 end
 else
 begin
 //Генерация веток
 paintbox1.Canvas.Pen.Color:=rgbtocolor(100,3,4);
 for i := 0 to (p div 6) do
 paintbox1.Canvas.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;
 
 
 
 
 
initialization
 {$I unit1.lrs}
 
end.

Материал  позаимствован с сайта 

Просмотров: 471 | Добавил: Mr_Ser_Win | Теги: Фракталы | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Получить бонус WMR

Вы можете получить WMR-бонус в размере 0,01-0,10 WMR на свой кошелек 1 раз в сутки

Кошелек
Код Защитный код

Обмен Webmoney



Получить больше бонусов
Помощь сайту

Облако тегов
Реклама
Качественный хостинг
Бесплатная раскрутка сайтов и блогов - YouRaise.Ru
Начать Заработок на Блоге
Хранилище фотографий фото хостинг Храни фото здесь!
Драки: дом2 драки
обмен играми Все для геймера!
А ты играл в XBOX 360? продажа развивающие игры в твоем городе
AlfaInternet.Su - Регистрация сайта в каталогах поисковиках

Регистрация сайта в Каталогах
Ваше имя:
Ваш email:
Регистрация при поддержке AlfaInternet.Su
PR-CY.ru