Fraktál

 

         Hozzunk létre véletlen fraktált a számítógép segítségével, mely pontokból áll össze. A generálás alapja az legyen, hogy a fraktál csak lapszomszéd szerint növekedhet. Ha véletlen választunk egy pontot a síkon, akkor azt addig mozgassuk véletlenül tengelyirányokba, ameddig hozzá nem tapad, a már meglévő pontokhoz. Így a fraktál növekedése egy fához hasonlít, csak a burjánzás mind a négy irányba megtörténik. A fraktál növekedésével a generálás lelassul, mert egyre több új pont nem tud a meglévőkhöz tapadni, hamarabb jut el a véletlen választás határához, amikor megsemmisül. (A program a Sejtek programhoz hasonló, viszont a generálás alapvetően más, mint ott, ezáltal a végeredmény is jelentősen különbözik, az ott látottaktól.)

 

         A program futási képe körülbelül két perc után:

 

 

         A program listája:

 

unit UFraktal;

interface

uses
  Windows, MessagesSysUtilsVariantsClasses,

  GraphicsControlsFormsDialogsStdCtrlsExtCtrls;

type
  TfmFraktal = class(TForm)
    btKilepesTButton;
    tiIdozitoTTimer;
    procedure tiIdozitoTimer(SenderTObject);
    procedure btKilepesClick(SenderTObject);
    procedure FormPaint(SenderTObject);
  private
    Private declarations }
  public
    Public declarations }
  end;

var
  fmFraktalTfmFraktal;
  X, Y, XkYkFx, D: Integer;


implementation

{$R *.dfm}

procedure TfmFraktal.tiIdozitoTimer(SenderTObject);
begin
With Canvas Do
  Begin
    While (Pixels[X-1,Y]=clBlackAnd (Pixels[X+1,Y]=clBlackAnd
          (Pixels[X,Y-1]=clBlackAnd (Pixels[X,Y+1]=clBlackAnd
          (X>Xk-DAnd (X<Xk+D) And (Y>Yk-DAnd (Y<Yk+D) Do
    Begin
      Pixels[X, Y]:= clBlack;
      Case Random(4) Of
        0: Dec(X);
        1: Dec(Y);
        2: Inc(X);
        3: Inc(Y);
      End;
      Pixels[X, Y]:= clWhite;
      If (X=Xk-DOr (X=Xk+D) Or (Y=Yk-DOr (Y=Yk+D)
      Then Pixels[X, Y]:= clBlack;
    End;
    If Not((X=Xk-DOr (X=Xk+D) Or (Y=Yk-DOr (Y=Yk+D)) Then
    If X<Fx Then Fx:= X; D:= 20+2*(Xk-Fx);
    X:= Xk + Random(D) - (D Div 2);
    Y:= Yk + Random(D) - (D Div 2);
  End;
end;

procedure TfmFraktal.btKilepesClick(SenderTObject);
begin
  Close;
end;

procedure TfmFraktal.FormPaint(SenderTObject);
begin
  Xk:= ClientWidth Div 2;
  Yk:= ClientHeight Div 2;
  Fx:= XkRandomize; D:= 20;
  With Canvas Do
  Begin
    Pen.Color:= clBlack;
    Brush.Color:= clBlack;
    Rectangle(0,0,2*Xk,2*Yk);
    Pixels[XkYk]:= clWhite;
  End;
  X:= Xk + Random(D) - (D Div 2);
  Y:= Yk + Random(D) - (D Div 2);
end;

end.