Fraktal metodą ifs

0

nie wiem, czy mi znów nie cofną do newbie, ale :
mam narysować fraktal, jednak coś się krzaczy- tzn. rysuje 100 tys pkt w 1 malutkiej przestrzeni :( nie wiem jak sobie z tym poradzić. powinno ładną spiralkę narysować a tu kapa. w komentach znajdziecie all teoretycznie potrzebne do tr. sierpińskiego. Aha rysuję ifs-em, czyli pktowo :)

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  x,y:integer;
  //tablica:array[1..3,1..6] of double;
  tablica:array[1..2,1..6]of double;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,los,xprim,yprim:integer;
xprim1,a,b,c,d,e,f:double;
yprim1:double;

begin
Randomize;
x:=1;
y:=1;
image1.Canvas.Brush.Color:=clblack;
image1.Canvas.FillRect(rect(x+300,y+300,x+305,y+305));
for I := 0 to 100000 do
begin
    los:= random(2)+1;
    a:= tablica[los][1];
    b:= tablica[los][2];
    c:=tablica[los][3];
    d:=tablica[los][4];
    e:=tablica[los][5] ;
    f:=tablica[los][6]  ;
    xprim1:=(a*x) + (b*y) + c;
    yprim1:=(d*x) + (e*y) + f;
    xprim:=round(xprim1) ;
    yprim:=round(yprim1);
    x:=xprim;
    y:=yprim;
    image1.Canvas.FillRect(rect(x+300,y+300,x+301,y+301));
end;

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
{
tablica[1][1]:=0.5;
tablica[1][2]:=0;
tablica[1][3]:=-3;
tablica[1][4]:=0;
tablica[1][5]:=0.5;
tablica[1][6]:=-2;
tablica[2][1]:=0.5;
tablica[2][2]:=0;
tablica[2][3]:=3;
tablica[2][4]:=0;
tablica[2][5]:=0.5;
tablica[2][6]:=-2;
tablica[3][1]:=0.5;
tablica[3][2]:=0;
tablica[3][3]:=0;
tablica[3][4]:= 0 ;
tablica[3][5]:=0.5;
tablica[3][6]:=3.196152;
}
tablica[1][1]:=-0.4;
tablica[1][2]:=0;
tablica[1][3]:=-1;
tablica[1][4]:=0;
tablica[1][5]:=-0.4;
tablica[1][6]:=0.1;
tablica[2][1]:=0.76;
tablica[2][2]:=-0.4;
tablica[2][3]:=0;
tablica[2][4]:=0.4;
tablica[2][5]:=0.76;
tablica[2][6]:=0;
end;

end.

z dołu dziękuję za odp :)

0

z powodu niemożności edycji :chyba wiem gdzie błąd tzn przypuszczam :) chodzi o to, że w pewnym momencie nie wyjdę po za zero - jak raz się wyzeruje to kiła mogiła- znacie może jakiś komponent z którym da się rysować współrzędnymi w double zamiast w int ??:>

0

nieaktualne:) będąc w klopie rozwiązałem :) jak by ktoś był zainteresowany rozwiązanie, w dodatku na wątkach :

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    Image1: TImage;
    Image2: TImage;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
  sierpiński=class(TThread)
  x,y,koniec:integer;
  tablica:array[1..3,1..6]of double;
  constructor create;
  procedure rysuj;
  procedure execute;override;
  end;
  spirala=class(TThread)
  x,y,koniec:integer;
  tablica:array[1..2,1..6]of double;
  constructor create;
  procedure rysuj;
  procedure execute;override;
  end;

var
  Form1: TForm1;
  w1:sierpiński;
  w2:spirala;
implementation
{$R *.dfm}
constructor sierpiński.create;
begin
inherited Create(false);
tablica[1][1]:=0.5;
tablica[1][2]:=0;
tablica[1][3]:=-3;
tablica[1][4]:=0;
tablica[1][5]:=0.5;
tablica[1][6]:=-2;
tablica[2][1]:=0.5;
tablica[2][2]:=0;
tablica[2][3]:=3;
tablica[2][4]:=0;
tablica[2][5]:=0.5;
tablica[2][6]:=-2;
tablica[3][1]:=0.5;
tablica[3][2]:=0;
tablica[3][3]:=0;
tablica[3][4]:= 0 ;
tablica[3][5]:=0.5;
tablica[3][6]:=3.196152;
end;
procedure sierpiński.rysuj;
begin
form1.image1.Canvas.FillRect(rect(x+250,y+150,x+251,y+151));
end;
procedure sierpiński.Execute;
var i,los:integer;
a,b,c,d,e,f:double;
xprim1,yprim1,xfaktyczny,yfaktyczny:double;
begin
Randomize;
x:=1;
y:=1;

form1.image1.Canvas.Brush.Color:=clblack;
form1.image1.Canvas.FillRect(rect(x+250,y+150,x+251,y+151));
for I := 0 to 100000 do
begin
los:= random(3)+1;
    if los=1 then
    form1.image1.Canvas.Brush.Color:=clgreen
    else
    if los=2 then
    form1.image1.Canvas.Brush.Color:=clblack
    else
    form1.image1.Canvas.Brush.Color:=clred;
    a:=tablica[los][1];
    b:=tablica[los][2];
    c:=tablica[los][3];
    d:=tablica[los][4];
    e:=tablica[los][5];
    f:=tablica[los][6];
    xprim1:=((a*xfaktyczny) + (b*yfaktyczny) + c);
    yprim1:=((d*xfaktyczny) + (e*yfaktyczny) + f);
    xfaktyczny:= xprim1;
    yfaktyczny:=yprim1;
    x:=round(xprim1*30);
    y:=round(yprim1*30);
    //form1.image1.Canvas.FillRect(rect(x+250,y+150,x+251,y+151));
    synchronize(rysuj);
    form1.label1.Caption:=inttostr(i);
    
    //application.ProcessMessages;
end;
koniec:=1;
end;
constructor spirala.create;
begin
inherited Create(false);
tablica[1][1]:=-0.4;
tablica[1][2]:=0;
tablica[1][3]:=-1;
tablica[1][4]:=0;
tablica[1][5]:=-0.4;
tablica[1][6]:=0.1;
tablica[2][1]:=0.76;
tablica[2][2]:=-0.4;
tablica[2][3]:=0;
tablica[2][4]:=0.4;
tablica[2][5]:=0.76;
tablica[2][6]:=0;
end;
procedure spirala.rysuj;
begin
 form1.image2.Canvas.FillRect(rect(x+300,y+300,x+301,y+301));
end;
procedure spirala.Execute;
var i,los:integer;
a,b,c,d,e,f:double;
xprim1,yprim1,xfaktyczny,yfaktyczny:double;
begin
Randomize;
x:=1;
y:=1;
form1.image2.Canvas.Brush.Color:=clblack;
form1.image2.Canvas.FillRect(rect(x+300,y+300,x+301,y+300));
for I := 0 to 100000 do
begin
los:= random(2)+1;
    if los=1 then
    form1.image2.Canvas.Brush.Color:=clgreen
    else
    form1.image2.Canvas.Brush.Color:=clblack;
    a:= tablica[los][1];
    b:= tablica[los][2];
    c:=tablica[los][3];
    d:=tablica[los][4];
    e:=tablica[los][5] ;
    f:=tablica[los][6]  ;
    xprim1:=((a*xfaktyczny) + (b*yfaktyczny) + c);
    yprim1:=((d*xfaktyczny) + (e*yfaktyczny) + f);
    xfaktyczny:= xprim1;
    yfaktyczny:=yprim1;
    x:=round(xprim1*200);
    y:=round(yprim1*200);
    //form1.image2.Canvas.FillRect(rect(x+300,y+300,x+301,y+301));
    synchronize(rysuj);
    form1.label2.Caption:=inttostr(i);
    
   // application.ProcessMessages;
end;
koniec:=1;
end;
procedure TForm1.Button1Click(Sender: TObject);
var start,stop: integer;
begin
start:=gettickcount;
w1:=sierpiński.create;
w2:=spirala.create;
while( (w1.koniec=0) or (w2.koniec=0)) do
application.ProcessMessages;
 stop:=gettickcount;
showmessage(inttostr(stop-start));
end;

end.

1 użytkowników online, w tym zalogowanych: 0, gości: 1