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.