Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit uMain;
- interface
- uses
- Winapi.Windows, Winapi.Messages,
- System.SysUtils, System.Variants, System.Classes, System.Types,
- Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ExtCtrls,
- GDIPAPI, GDIPOBJ;
- const
- BG_COLOR = clBlack;
- LINE_COLOR = clWhite;
- DOT_COUNT = 120;
- DOT_SPACING = 2.5;
- LINE_WIDTH = 1.0;
- SPEED_FACTOR = 0.01;
- type
- TSpiralPoint = record
- Degrees: Currency;
- Distance: Currency;
- Speed: Currency;
- end;
- TSpiralPoints = array of TSpiralPoint;
- TfrmMain = class(TForm)
- tmrStart: TTimer;
- tmrMain: TTimer;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure tmrStartTimer(Sender: TObject);
- procedure tmrMainTimer(Sender: TObject);
- procedure FormPaint(Sender: TObject);
- private
- FPoints: TSpiralPoints;
- FPen: TGPPen;
- function CenterPoint: TGPPointF;
- public
- function CreateCanvas: TGPGraphics;
- end;
- var
- frmMain: TfrmMain;
- implementation
- {$R *.dfm}
- uses
- System.Math;
- function NewPosition(Center: TGPPointF; Distance: Currency; Degrees: Currency): TGPPointF;
- var
- Radians: Real;
- begin
- //Convert angle from degrees to radians; Subtract 135 to bring position to 0 Degrees
- Radians:= (Degrees - 135) * Pi / 180;
- Result.X:= Trunc(Distance*Cos(Radians)-Distance*Sin(Radians))+Center.X;
- Result.Y:= Trunc(Distance*Sin(Radians)+Distance*Cos(Radians))+Center.Y;
- end;
- { TfrmSpiral }
- procedure TfrmMain.FormCreate(Sender: TObject);
- var
- X: Integer;
- begin
- Self.WindowState:= wsMaximized;
- Self.Color:= BG_COLOR;
- Randomize;
- FPen:= TGPPen.Create(MakeColor(180, 180, 255));
- FPen.SetWidth(LINE_WIDTH);
- SetLength(FPoints, DOT_COUNT);
- for X := 0 to Length(FPoints)-1 do begin
- FPoints[X].Degrees:= 0;
- FPoints[X].Distance:= (X+1) * DOT_SPACING;
- FPoints[X].Speed:= (X+1) * SPEED_FACTOR;
- end;
- end;
- procedure TfrmMain.FormDestroy(Sender: TObject);
- begin
- SetLength(FPoints, 0);
- FreeAndNil(FPen);
- end;
- procedure TfrmMain.tmrMainTimer(Sender: TObject);
- var
- X: Integer;
- begin
- for X := 0 to Length(FPoints)-1 do begin
- FPoints[X].Degrees:= FPoints[X].Degrees + FPoints[X].Speed;
- end;
- Self.Invalidate;
- end;
- procedure TfrmMain.tmrStartTimer(Sender: TObject);
- begin
- tmrStart.Enabled:= False;
- tmrMain.Enabled:= True;
- end;
- function TfrmMain.CenterPoint: TGPPointF;
- begin
- Result.X:= ClientWidth / 2;
- Result.Y:= ClientHeight / 2;
- end;
- function TfrmMain.CreateCanvas: TGPGraphics;
- begin
- Result:= TGPGraphics.Create(Canvas.Handle);
- Result.SetInterpolationMode(InterpolationMode.InterpolationModeHighQuality);
- Result.SetSmoothingMode(SmoothingMode.SmoothingModeHighQuality);
- Result.SetCompositingQuality(CompositingQuality.CompositingQualityHighQuality);
- end;
- procedure TfrmMain.FormPaint(Sender: TObject);
- var
- X: Integer;
- P: TGPPointF;
- Last: TGPPointF;
- Can: TGPGraphics;
- begin
- Can:= CreateCanvas;
- try
- for X := 0 to Length(FPoints)-1 do begin
- P:= NewPosition(CenterPoint, FPoints[X].Distance, FPoints[X].Degrees);
- if X > 0 then begin
- Can.DrawLine(FPen, Last.X, Last.Y, P.X, P.Y);
- end;
- Last:= P;
- end;
- finally
- Can.Free;
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement