Построение изображения листа папоротника при помощи фракталов.
Лист папоротника - один из тех объектов, которые удобно строить при помощи вероятностных распределений.
Основная идея этого метода заключается в том, чтобы, зафиксировав какую-либо начальную точку, далее циклически совершать афинное преобразование системы координат,в которой точка строится.То есть, если на определённом шаге цикла имеется точка точка А с координатами (х0,y0), то при следующей итерации цикла изображается точка В, чьи координаты имеют вид ( а*х0+в*y0+с , d*х0+e*y0+f ). Таким образом наблюдается явное выражение "новой" системы координат(точка В) через "старую"(точка А). В свою очередь коэффициенты преобразования систем координат выбираются в зависимости от попадения некоторой СЛУЧАЙНОЙ ВЕЛИЧИНЫ в соответствующий диапазон значений. В данном примере случайная величина принимает значения из отрезка от 0 до 1. Выбраны следующие диапазоны для этой случайной величины: от 0 до 0.85 - соответствует преобразованию множества точек,отвечающих за "густоту" и "высоту" листа папоротника. от 0.85 до 0.92 - рисует листики слева от стебля от 0.92 до 0.99 - рисует листики справа от стебля остальное - изображение стебля
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
Buttons, ExtCtrls;
type
{ TForm1 }
TForm1 =class(TForm)
BitBtn1: TBitBtn;
PaintBox1: TPaintBox;
procedure BitBtn1Click(Sender: TObject);
procedure draw();
private{private declarations }public{public declarations }
end;
var
Form1: TForm1;
implementation
{ TForm1 }
procedure TForm1.BitBtn1Click(Sender: TObject);
begin
draw();
end;
procedure Tform1.draw();
const
iterations =50000; //Кол-во итераций
var
t, x, y: real;
p: real;//CЛУЧАЙНАЯ ВЕЛИЧИНА
k: longint;
mid_x, mid_y, radius: integer;
begin
mid_x := paintbox1.widthdiv2;
mid_y := paintbox1.height-100 ;
radius := trunc(0.1* mid_y);
randomize;
x :=1.0;
y :=0.0;
for k :=1 to iterations do
begin
p := random;
t := x;
if p <=0.85 then //Построение верхней части листа
begin
x :=0.84* x -0.045* y;
y :=0.045* t +0.86* y +1.6;
end
elseif p <=0.92 then //Построение левого листа
begin
x :=0.25* x -0.26* y;
y :=0.23* t +0.25* y +1.6;
end //Построение правого листаelseif p <=0.99 then
begin
x :=-0.135* x +0.28* y;
y :=0.26* t +0.245* y +0.44;
end
else
begin //Построение стебля
x :=0.0;
y :=0.16* y ;
end;
paintbox1.Canvas.Pixels[mid_x+round(radius*x), mid_y-round(radius*y)+35]:=clGreen
end
end;
initialization
{$I unit1.lrs}
end.