递归大法:仅供参考!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
procedure FormDblClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
CUT_RATE:double;
//树的切分点
LEFT_BRANCH_ANGLE:integer;
//左侧树枝相对于主干的张开度
RIGHT_BRANCH_ANGLE:integer;
//右树枝相对于主干的张开度
BRANCH_LENGTH:integer;
//树的主枝长度
LAST_BRANCH_LENGTH:double;
//最小分枝长度,改变这个值可以控制树叶密度
BRANCH_NUM:integer;
//树枝上的节点数,改变可以控制树枝的密度
procedure SetGlobalVar;
begin
case Form1.RadioGroup1.ItemIndex of
0: begin
CUT_RATE:=0.618;
LEFT_BRANCH_ANGLE:=60;
RIGHT_BRANCH_ANGLE:=60;
BRANCH_LENGTH:=300;
LAST_BRANCH_LENGTH:=0.1;
BRANCH_NUM:=60;
end;
1: begin
CUT_RATE:=0.3;
LEFT_BRANCH_ANGLE:=10;
RIGHT_BRANCH_ANGLE:=12;
BRANCH_LENGTH:=100;
LAST_BRANCH_LENGTH:=0.8;
BRANCH_NUM:=3;
end;
end;
end;
procedure DrawBranch(x,y,Length:double;StartAngle:integer);
//StartAngle 树枝的(直线)的倾斜角;
var
x1,y1,nx,ny,nLength:double;
count:integer;
begin
x1:=x+Length*cos(StartAngle*pi/180);
y1:=y-Length*sin(StartAngle*Pi/180);
Form1.Canvas.Pen.Color:=clGreen;
Form1.Canvas.MoveTo(Round(x),Round
);
case Form1.RadioGroup1.ItemIndex of
0: Form1.Canvas.LineTo(Round(x1),Round(y1));
1: Form1.Canvas.Pixels[Round(x1),Round(y1)]:=RGB(255,0,0);
end;
if (Length<LAST_BRANCH_LENGTH) then
Exit;
nLength:=Length;
nx:=x;
ny:=y;
for count:=0 to BRANCH_NUM-1 do
begin
nx:=nx+nLength*(1-CUT_RATE)*cos(StartAngle*Pi/180);
ny:=ny-nLength*(1-CUT_RATE)*sin(StartAngle*Pi/180);
DrawBranch(nx,ny,nLength*(1-CUT_RATE),StartAngle+LEFT_BRANCH_ANGLE);
DrawBranch(nx,ny,nLength*(1-CUT_RATE),StartAngle-RIGHT_BRANCH_ANGLE);
nLength:=nLength*CUT_RATE;
end;
end;
procedure TForm1.FormDblClick(Sender: TObject);
begin
SetGlobalVar;
Repaint;
DrawBranch(Round(Width/2),Height,BRANCH_LENGTH,90);
end;
end.