unit Fractal;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, buttons, ExtCtrls, clipbrd, StdCtrls, Grids;

type
  TForm1 = class(TForm)
    imPict: TImage;
    rbm: TRadioButton;
    rbj: TRadioButton;
    Button1: TButton;

    procedure Button1Click(Sender: TObject);
    Procedure OnCreateF(Sender:TObject);
    procedure imPictClick(Sender: TObject);
  {  procedure rbMClick(Sender: TObject);
    procedure rbJClick(Sender: TObject);    }
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  chk:boolean;


implementation
{$R *.dfm}

function MandelBrot(a,b: real): TColor;
var x,y,xy: real;
x2,y2: real;
r:real;
k: integer;
begin
r:=0;
x:=0; y:=0;
k:=100;
while (k>0)and(r<4) do begin
x2:=x*x;
y2:=y*y;
xy:=x*y;
x:=x2-y2+a;
y:=2*xy+b;
r:=x2+y2;
dec(k)
end;
k:=round((k/100)*255);
result:=RGB(k,k,k );
end;

function Julia(x0,y0: real): TColor;
var a,b,x,y,x2,y2,xy: real;
r:real;
k: integer;
begin
r:=1;
a:=-0.55; b:=-0.55;
x:=x0; y:=y0;
k:=100;
while (k>0)and(r<4) do begin
x2:=x*x;
y2:=y*y;
xy:=x*y;
x:=x2-y2+a;
y:=2*xy+b;
r:=x2+y2;
dec(k)
end;
k:=round((k/100)*255);
result:=RGB(k,k,k);
end;

procedure TForm1.imPictClick(Sender: TObject);
var x_min,y_min,x_max,y_max,hx,hy,x,y: real;
i,j,n: integer;
color: TColor;
begin
x_min:=-1.8;
if form1.rbm.checked then x_max:=1 else x_max:=1.8;
y_min:=-1.3; y_max:=1.3;
n:=700;
y:=y_min;
hx:=(x_max-x_min)/n;
hy:=(y_max-y_min)/n;
with form1 do
for j:=0 to n do begin
x:=x_min;
for i:=0 to n do begin
if rbm.checked then color:=MandelBrot(x,y) else color:=Julia(x,y);
Form1.imPict.Picture.Bitmap.Canvas.Pixels[i,j]:=color;
x:=x+hx;
end;
y:=y+hy;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  imPict.picture.bitmap.SaveToFile('Fractal.bmp');
end;

procedure TForm1.OnCreateF(Sender: TObject);
begin
randomize;
chk:=false;
  with form1 do begin
   imPict.Picture.Bitmap.Create;
   imPict.Picture.Bitmap.Width  := Width;
   imPict.Picture.Bitmap.Height := Height;
  end;
  imPictClick(Sender);
end;

end.
