Лист папоротника

jpg.

Построение изображения листа папоротника при помощи фракталов.

Лист папоротника - один из тех объектов, которые удобно строить при помощи вероятностных распределений.

Основная идея этого метода заключается в том, чтобы, зафиксировав какую-либо начальную точку, далее циклически совершать афинное преобразование системы координат,в которой точка строится.То есть, если на определённом шаге цикла имеется точка точка А с координатами (х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.width div 2;
	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
		else
		if p <= 0.92 then  //Построение левого  листа
		begin
			x := 0.25   * x - 0.26 * y;
			y := 0.23 * t + 0.25   * y + 1.6;
 
		end                //Построение правого листа
		else if 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.

Ключевые слова: 
Фрактал. Папоротник
ВложениеРазмер
project1.rar1.86 Мб