procedure TFormDaisy.FormCreate(Sender: TObject);
begin
BitmapBase := TBitmap.Create;
BitmapBase.PixelFormat := pf24bit;
BitmapBase.Width := ImageRGB.Width;
BitmapBase.Height := ImageRGB.Height;
ImageRGB.Picture.Graphic := BitmapBase; // White Screen
end;
procedure TFormDaisy.ButtonDrawClick(Sender: TObject);
CONST
DaisyStepCount = 1024;
VAR
CircleColor : INTEGER;
Diameter : INTEGER;
Divergence : DOUBLE;
GoldenRatio : DOUBLE;
i : INTEGER;
j : INTEGER;
Radius : DOUBLE;
Row : pRGBTripleArray;
Step : INTEGER;
Theta : DOUBLE;
begin
Screen.Cursor := crHourGlass;
TRY
BitmapBase.Canvas.Brush.Color := clBlack;
BitmapBase.Canvas.FillRect(BitmapBase.Canvas.ClipRect);
Theta := 0; // degrees
GoldenRatio := 0.5*(1.0 + SQRT(5.0)); // see p. 30
Divergence := 360.0 / GoldenRatio; // angular interval divergence
Diameter := BitmapBase.Width DIV 64; // heuristic
FOR step := 0 TO DaisyStepCount-1 DO
BEGIN
CircleColor := 255 - (step MOD 64);
BitmapBase.Canvas.Brush.Color := RGB(0,0, CircleColor); // inside
BitmapBase.Canvas.Pen.Color := RGB(0,0, CircleColor); // border
Radius := 0.5 * SQRT(Theta);
i := BitmapBase.Width DIV 2 + ROUND(Radius*COS(PI*Theta/180));
j := BitmapBase.Height DIV 2 + ROUND(Radius*SIN(PI*Theta/180));
BitmapBase.Canvas.Ellipse(i,j, i+Diameter, j+Diameter);
Theta := Theta + Divergence
END;
FOR j := 0 TO BitmapBase.Height-1 DO
BEGIN
Row := BitmapBase.Scanline[j];
FOR i := 0 TO BitmapBase.Width-1 DO
BEGIN
WITH Row[i] DO
BEGIN
rgbtRed := ROUND(255*ABS( SIN(7*PI*i/BitmapBase.Width)*
SIN(7*PI*j/BitmapBase.Height)));
rgbtGreen := ROUND(255*ABS( SIN(4*PI*i/BitmapBase.Width)*
SIN(4*PI*j/BitmapBase.Height)))
END
END
END;
// Display on screen
ImageRGB.Picture.Graphic := BitmapBase;
ButtonRedisplay.Visible := TRUE;
//Bitmap.SaveToFile('Daisy.BMP');
FINALLY
Screen.Cursor := crDefault
END
end;
procedure TFormDaisy.FormDestroy(Sender: TObject);
begin
BitmapBase.Free
end;
procedure TFormDaisy.ButtonRedisplayClick(Sender: TObject);
begin
ImageRGB.Picture.Graphic := BitmapBase;
end;
procedure TFormDaisy.ButtonFadeOutClick(Sender: TObject);
VAR
Bitmap : TBitmap;
i : INTEGER;
j : INTEGER;
Row : pRGBTripleArray;
RowBase: pRGBTripleArray;
step : INTEGER;
begin
Bitmap := TBitmap.Create;
TRY
Bitmap.PixelFormat := pf24bit;
Bitmap.Width := ImageRGB.Width;
Bitmap.Height := ImageRGB.Height;
FOR step := 32 DOWNTO 0 DO
BEGIN
FOR j := 0 TO Bitmap.Height-1 DO
BEGIN
RowBase := BitmapBase.Scanline[j];
Row := Bitmap.Scanline[j];
FOR i := 0 TO Bitmap.Width-1 DO
BEGIN // 32 = 2^5
Row[i].rgbtRed := (step * RowBase[i].rgbtRed ) SHR 5;
Row[i].rgbtGreen := (step * RowBase[i].rgbtGreen) SHR 5;
Row[i].rgbtBlue := (step * RowBase[i].rgbtBlue ) SHR 5
END END;
ImageRGB.Picture.Graphic := Bitmap;
InvalidateRect(FormDaisy.Handle, NIL {whole window},
FALSE {don't erase background});
RedrawWindow(FormDaisy.Handle, NIL, 0, RDW_UPDATENOW);
END
FINALLY
Bitmap.Free;
END;
end;
procedure TFormDaisy.ButtonFadeInClick(Sender: TObject);
VAR
Bitmap : TBitmap;
i : INTEGER;
j : INTEGER;
Row : pRGBTripleArray;
RowBase: pRGBTripleArray;
step : INTEGER;
begin
Bitmap := TBitmap.Create;
TRY
Bitmap.PixelFormat := pf24bit;
Bitmap.Width := ImageRGB.Width;
Bitmap.Height := ImageRGB.Height;
FOR step := 0 TO 32 DO
BEGIN
FOR j := 0 TO Bitmap.Height-1 DO
BEGIN
RowBase := BitmapBase.Scanline[j];
Row := Bitmap.Scanline[j];
FOR i := 0 TO Bitmap.Width-1 DO BEGIN
Row[i].rgbtRed := (step * RowBase[i].rgbtRed ) SHR 5;
Row[i].rgbtGreen := (step * RowBase[i].rgbtGreen) SHR 5;
Row[i].rgbtBlue := (step * RowBase[i].rgbtBlue ) SHR 5
END END;
ImageRGB.Picture.Graphic := Bitmap;
ImageRGB.Repaint
END
FINALLY
Bitmap.Free;
END;
end;
