unit U_FibonacciSunflower;
{Copyright 2001, Gary Darby, Intellitech Systems Inc., www.DelphiForFun.org
This program may be used or modified for any non-commercial purpose
so long as this original notice remains in place.
All other rights are reserved }
{Just fooling around with Fibonacci sunflowers}
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Image1: TImage;
DrawBtn: TButton;
Memo1: TMemo;
RotateRBox: TRadioGroup;
StyleBox: TRadioGroup;
procedure DrawBtnClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
midx, midy:integer;
procedure Circle(centerRadius,CenterAngle:real; r:integer);
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Circle(centerRadius,CenterAngle:real; r:integer);
{Draw a circle centered at CenterRadius, CenterAngle from image center,
radius of cirdle drawn is r}
var
x,y:integer;
begin
with image1,canvas do
begin
x:=trunc(midx+CenterRadius*cos(CenterAngle));
y:=trunc(midy+CenterRadius*sin(CenterAngle));
ellipse(x-r,y-r,x+r,y+r);
end;
end;
procedure TForm1.DrawBtnClick(Sender: TObject);
{Draw a sunflower}
var
i,j,k,r:integer;
phi,IncA:real;
begin
r:=5;
phi:=(1+sqrt(5.0))/2;
case rotateRbox.itemindex of {set angle increment for center of seed}
0: IncA:=2*Pi*Phi;
1: IncA:=2*pi*(21/34);
2: IncA:=2*pi*(31/55);
end;
midx:=image1.width div 2;
midy:=image1.height div 2;
image1.canvas.brush.color:=clwhite; {clear the image area}
with image1 do canvas.rectangle(clientrect);
image1.canvas.brush.color:=clyellow;
for i:= 0 to 900 do {Arbitrary big number of seeds to create}
begin
case stylebox.itemindex of
0: circle(sqrt(i)*r,i*IncA,r); {fixed seed size moving outward by sqrt(i)}
1: circle(i*r/22,IncA*i,trunc(r*(i/500))); {increasing seed size - just trial and error numbers}
end;
if i mod 16 = 0 then application.processmessages; {redraw once in a while}
end;
end;
end.