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
- 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}
- 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
- WindowState:= wsMaximized; //Maximize window on startup
- Color:= clBlack; //Set form's background to black
- FPen:= TGPPen.Create(MakeColor(180, 180, 255)); //Create pen and set color to light blue
- FPen.SetWidth(LINE_WIDTH); //Set the width of the line (pen)
- SetLength(FPoints, DOT_COUNT); //Populate array of points
- //Set defaults values for each point
- for X := 0 to Length(FPoints)-1 do begin
- FPoints[X].Degrees:= 0; //Start all at 0 degrees to be straight line
- FPoints[X].Distance:= (X+1) * DOT_SPACING; //Spacing between each point / radius from center point
- FPoints[X].Speed:= (X+1) * SPEED_FACTOR; //Make each one slightly slower than the next
- end;
- end;
- procedure TfrmMain.FormDestroy(Sender: TObject);
- begin
- SetLength(FPoints, 0); //Clear array of points
- FreeAndNil(FPen); //Destroy pen object
- end;
- procedure TfrmMain.tmrStartTimer(Sender: TObject);
- begin
- //One-time timer just to put delay before main animation starts
- tmrStart.Enabled:= False;
- tmrMain.Enabled:= True;
- end;
- procedure TfrmMain.tmrMainTimer(Sender: TObject);
- var
- X: Integer;
- begin
- //Increase degrees of each point based its "speed"
- for X := 0 to Length(FPoints)-1 do begin
- FPoints[X].Degrees:= FPoints[X].Degrees + FPoints[X].Speed;
- end;
- Self.Invalidate; //Force form to repaint
- end;
- function TfrmMain.CenterPoint: TGPPointF;
- begin
- //Returns absolute center point of form's client area
- Result.X:= ClientWidth / 2;
- Result.Y:= ClientHeight / 2;
- end;
- function TfrmMain.CreateCanvas: TGPGraphics;
- begin
- //Create GDI+ canvas object
- 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; //Create GDI+ canvas
- try
- //Iterate through all points
- for X := 0 to Length(FPoints)-1 do begin
- //Calculate position around center point
- P:= NewPosition(CenterPoint, FPoints[X].Distance, FPoints[X].Degrees);
- if X > 0 then begin
- //Only draw line if not the first point (need at least 2 points)
- Can.DrawLine(FPen, Last.X, Last.Y, P.X, P.Y);
- end;
- //Keep track of prior point to draw next line
- Last:= P;
- end;
- finally
- Can.Free; //Destroy GDI+ canvas
- end;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment