www.pudn.com > DrawDiguiTrees.rar > UDrawTree.pas
unit UDrawTree;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, ExtCtrls, ComCtrls;
type
TFrmMain = class(TForm)
Image1: TImage;
BitBtn_Draw: TBitBtn;
Edit_Num: TEdit;
ScrollBar1: TScrollBar;
GroupBox1: TGroupBox;
RadioBtn_Tree1: TRadioButton;
RadioBtn_Tree2: TRadioButton;
Timer1: TTimer;
BitBtn_AutoRun: TBitBtn;
GroupBox2: TGroupBox;
RadioBtn_Radom: TRadioButton;
RadioBtn_WindDir: TRadioButton;
procedure BitBtn_DrawClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure ScrollBar1Change(Sender: TObject);
procedure BitBtn_AutoRunClick(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
//DrawTree1
OX:integer;
OY:integer;
R:integer;
dR:single;
AA:single;
BB:single;
N:integer;
AngleA:integer;
AngleB:integer;
WindDir:Boolean;
MyRect:TRect;
procedure DrawTree1(Image1:Timage; OX,OY:integer; R,dR,AA,BB:single; N:integer);
procedure DrawTree2(Image1:Timage; OX,OY:integer; R,dR,AA,BB:single; N:integer);
procedure ClearImage(Image1:TImage);
public
{ Public declarations }
end;
var
FrmMain: TFrmMain;
implementation
{$R *.dfm}
procedure TFrmMain.BitBtn_DrawClick(Sender: TObject);
begin
ClearImage(Image1);
OX:=400;
OY:=600;
R:=500;
dR:=0.4;
AA:=3.1415926*270/180;
BB:=-3.1415926*30/180;
if RadioBtn_Tree1.checked then DrawTree1(Image1,OX,OY,R,dR,AA,BB,N);
if RadioBtn_Tree2.checked then DrawTree2(Image1,OX,OY,R,dR,AA,BB,N);
end;
//DrawTree1
procedure TFrmMain.DrawTree1(Image1:Timage; OX,OY:integer; R,dR,AA,BB:single; N:integer);
begin
if N=1 then
begin
Image1.Canvas.pen.Width:=2;
Image1.Canvas.MoveTo(OX,OY);
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.Pen.Width:=1;
Image1.Canvas.MoveTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)+R*(1-dR)*cos(AA)),Round(OY+R*dR*sin(AA)+R*(1-dR)*sin(AA)));
Image1.Canvas.MoveTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)+R*(1-dR)*cos(AA-BB)),Round(OY+R*dR*sin(AA)+R*(1-dR)*sin(AA-BB)));
end
else
begin
Image1.Canvas.pen.Width:=N+1;
Image1.Canvas.MoveTo(OX,OY);
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
DrawTree1(Image1,Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)), R*(1-dR),dR,AA,BB,N-1);
DrawTree1(Image1,Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)), R*(1-dR),dR,(AA-BB),BB,N-1);
end;
end;
//DrawTree2
procedure TFrmMain.DrawTree2(Image1:Timage; OX,OY:integer; R,dR,AA,BB:single; N:integer);
begin
if N=1 then
begin
Image1.Canvas.pen.Width:=2;
Image1.Canvas.MoveTo(OX,OY);
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.Pen.Width:=1;
Image1.Canvas.MoveTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)+R*(1-dR)*cos(AA-BB)),Round(OY+R*dR*sin(AA)+R*(1-dR)*sin(AA-BB)));
Image1.Canvas.MoveTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)+R*(1-dR)*cos(AA+BB)),Round(OY+R*dR*sin(AA)+R*(1-dR)*sin(AA+BB)));
end
else
begin
Image1.Canvas.pen.Width:=N+1;
Image1.Canvas.MoveTo(OX,OY);
Image1.Canvas.LineTo(Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)));
if RadioBtn_Radom.Checked then BB:=-3.1415926*(30+Random(15))/180;
DrawTree2(Image1,Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)), R*(1-dR),dR,(AA+BB),BB,N-1);
if RadioBtn_Radom.Checked then BB:=-3.1415926*(30+Random(15))/180;
DrawTree2(Image1,Round(OX+R*dR*cos(AA)),Round(OY+R*dR*sin(AA)), R*(1-dR),dR,(AA-BB),BB,N-1);
end;
end;
procedure TFrmMain.FormCreate(Sender: TObject);
begin
N:=5;
ScrollBar1.position:=9-N;
Edit_Num.text:=inttostr(N);
WindDir:=True;
AngleA:=0;
AngleB:=20;
end;
procedure TFrmMain.ScrollBar1Change(Sender: TObject);
begin
N:=9-ScrollBar1.position;
Edit_Num.text:=inttostr(N);
end;
procedure TFrmMain.BitBtn_AutoRunClick(Sender: TObject);
begin
ClearImage(Image1);
if not Timer1.Enabled then
begin
MyRect.Left:=0;
MyRect.Top:=0;
MyRect.Right:=Image1.Width;
MyRect.Bottom:=Image1.Height;
Image1.Canvas.FillRect(MyRect);
OX:=400;
OY:=600;
R:=500;
dR:=0.4;
AA:=3.1415926*270/180;
BB:=-3.1415926*30/180;
Timer1.Enabled:=True;
BitBtn_AutoRun.Caption:='Stop';
end
else
begin
Timer1.Enabled:=false;
BitBtn_AutoRun.Caption:='AutoRun';
end;
end;
procedure TFrmMain.Timer1Timer(Sender: TObject);
begin
ClearImage(Image1);
//随机生成
if RadioBtn_Radom.Checked then BB:=-3.1415926*(20+Random(5))/180;
//随风向生成
if RadioBtn_WindDir.Checked then
begin
if WindDir then
begin
if AngleA<10 then
begin
AngleA:=AngleA+1;
AA:=-3.1415926*(90+AngleA)/180;
AngleB:=AngleB-1;
BB:=-3.1415926*(20+AngleB)/180;
end
else
begin
WindDir:=false;
end;
end
else
begin
if AngleA>0 then
begin
AngleA:=AngleA-1;
AA:=-3.1415926*(90+AngleA)/180;
AngleB:=AngleB+1;
BB:=-3.1415926*(20+AngleB)/180;
end
else
begin
WindDir:=True;
end;
end;
end;
if RadioBtn_Tree1.checked then DrawTree1(Image1,OX,OY,R,dR,AA,BB,N);
if RadioBtn_Tree2.checked then DrawTree2(Image1,OX,OY,R,dR,AA,BB,N);
end;
procedure TFrmMain.ClearImage(Image1:TImage);
begin
MyRect.Left:=0;
MyRect.Top:=0;
MyRect.Right:=Image1.Width;
MyRect.Bottom:=Image1.Height;
Image1.Canvas.FillRect(MyRect);
end;
procedure TFrmMain.FormShow(Sender: TObject);
begin
ClearImage(Image1);
end;
end.