Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit laba_6_1_f1;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
- System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Math, Vcl.StdCtrls,
- Vcl.ExtCtrls, Vcl.Imaging.pngimage;
- type
- TMan = Class (TImage)
- private
- CurrentAngularSpd, Angle: Double;
- RadiusOfLine: SmallInt;
- Finished: Boolean;
- End;
- TArrMen = Array [0..7] of TMan;
- TFormMain = class(TForm)
- MainMenu1: TMainMenu;
- NHelp: TMenuItem;
- NTask: TMenuItem;
- NAuthor: TMenuItem;
- LabelToMeasureScreenOfUser: TLabel;
- ImageCanvas: TImage;
- ImageMan: TImage;
- TimerForAnimation: TTimer;
- LabelFinish: TLabel;
- Label1: TLabel;
- Label2: TLabel;
- Label3: TLabel;
- Label4: TLabel;
- Label5: TLabel;
- Label6: TLabel;
- Label7: TLabel;
- Label8: TLabel;
- LabelHelp: TLabel;
- procedure NTaskClick(Sender: TObject);
- procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- procedure NAuthorClick(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- function MultPixels(PixQuant: Integer) : Integer;
- procedure DrawStadiumAndCreateMen();
- procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
- procedure TimerForAnimationTimer(Sender: TObject);
- procedure PutManOnStart(Man: TMan);
- private
- MultPix: Single;
- CenterX, CenterY, RadiusOfBiggestLine, WidthOfOneLine: SmallInt;
- RaceIsGoing: Boolean;
- ArrOfMen: TArrMen;
- HowManyFinished: Byte;
- public
- { Public declarations }
- end;
- var
- FormMain: TFormMain;
- const
- DefaultAngSpd = 0.01;
- MaxDivergeOfAngSpd = 0.002;
- MaxChangeOfSpeedPerTick = 0.001;
- implementation
- {$R *.dfm}
- procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
- begin
- CanClose := (MessageDlg('Вы уверены, что хотите выйти из программы?' +
- #10#13 + 'Все несохранённые данные будут утеряны.',
- mtConfirmation, [mbYes, mbNo], 0) = mrYes);
- end;
- procedure TFormMain.FormCreate(Sender: TObject);
- begin
- MultPix := LabelToMeasureScreenOfUser.Width / 100;
- RaceIsGoing := False;
- DrawStadiumAndCreateMen();
- end;
- procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
- Shift: TShiftState);
- var
- i: Byte;
- begin
- if (Key = VK_RETURN) and not RaceIsGoing then
- begin
- RaceIsGoing := True;
- for i := 0 to 7 do
- PutManOnStart(ArrOfMen[i]);
- TimerForAnimation.Enabled := True;
- HowManyFinished := 0;
- LabelFinish.Caption := '';
- LabelHelp.Visible := False;
- end;
- end;
- procedure TFormMain.DrawStadiumAndCreateMen();
- var
- i: Byte;
- Radius: SmallInt;
- begin
- with ImageCanvas do
- begin
- Left := 0;
- Top := 0;
- Width := FormMain.Width;
- Height := FormMain.Height;
- CenterX := Round(Width / 2);
- CenterY := Round(Height / 2);
- RadiusOfBiggestLine := Round(Min(Width, Height) * 2 / 5);
- WidthOfOneLine := MultPixels(30);
- With Canvas do
- begin
- Pen.Color := clBlack;
- Brush.Color := clMoneyGreen;
- Pen.Width := MultPixels(2);
- for i := 0 to 8 do
- begin
- Radius := RadiusOfBiggestLine - WidthOfOneLine * i;
- if i = 8 then
- Brush.Color := clWhite
- else
- begin
- ArrOfMen[i] := TMan.Create(FormMain);
- with ArrOfMen[i] do
- begin
- Parent := FormMain;
- RadiusOfLine := Radius - Round(WidthOfOneLine / 2);
- CurrentAngularSpd := DefaultAngSpd + Random(Round(MaxDivergeOfAngSpd * 200000)) / 100000 - MaxDivergeOfAngSpd;
- Picture := ImageMan.Picture;
- Center := True;
- Stretch := True;
- Proportional := True;
- Width := WidthOfOneLine;
- Height := Width;
- PutManOnStart(ArrOfMen[i]);
- DoubleBuffered := True;
- end;
- end;
- Ellipse(CenterX - Radius, CenterY - Radius, CenterX + Radius, CenterY + Radius);
- end;
- Pen.Color := clRed;
- MoveTo(CenterX, CenterY + Radius);
- LineTo(CenterX, CenterY + RadiusOfBiggestLine);
- end;
- end;
- end;
- procedure TFormMain.PutManOnStart(Man: TMan);
- begin
- with Man do
- begin
- Left := CenterX - Round(Width / 2);
- Top := CenterY + RadiusOfLine - Round(Width / 2);
- Angle := 0;
- CurrentAngularSpd := DefaultAngSpd + Random(Round(MaxDivergeOfAngSpd * 200000)) / 100000 - MaxDivergeOfAngSpd;
- Finished := False;
- end;
- end;
- procedure TFormMain.NAuthorClick(Sender: TObject);
- begin
- ShowMessage('Панев Александр, гр. 051007' + #10#13 + 'Минск, 2021');
- end;
- procedure TFormMain.NTaskClick(Sender: TObject);
- begin
- ShowMessage('Составить программу вывода на экран восьми вложенных друг в ' +
- 'друга окружностей, представляющих собой беговые дорожки. На линии старта ' +
- 'находятся восемь участника забега (произвольной фигуры). При нажатии ' +
- 'клавиши "Ввод" участники стартуют с одинаковой угловой скоростью. После ' +
- 'старта угловая скорость каждого участника в процессе гонки изменяется ' +
- 'по случайному закону. На финише указать место, занятое каждым участником.');
- end;
- procedure TFormMain.TimerForAnimationTimer(Sender: TObject);
- var
- i: Byte;
- begin
- for i := 0 to 7 do
- with ArrOfMen[i] do
- begin
- if Round(Angle * 100) mod 100 = 0 then
- begin
- CurrentAngularSpd := CurrentAngularSpd + Random(Round(MaxChangeOfSpeedPerTick * 200000)) / 100000 - MaxChangeOfSpeedPerTick;
- if CurrentAngularSpd > DefaultAngSpd + MaxDivergeOfAngSpd then
- CurrentAngularSpd := DefaultAngSpd + MaxDivergeOfAngSpd
- else
- if CurrentAngularSpd < DefaultAngSpd - MaxDivergeOfAngSpd then
- CurrentAngularSpd := DefaultAngSpd - MaxDivergeOfAngSpd;
- end;
- Angle := Angle + CurrentAngularSpd;
- Left := CenterX + Round(Sin(Angle) * RadiusOfLine) - Round(Width / 2);
- Top := CenterY + Round(Cos(Angle) * RadiusOfLine) - Round(Width / 2);
- if (Angle > 2 * Pi) and not Finished then
- begin
- Finished := True;
- Inc(HowManyFinished);
- if HowManyFinished = 8 then
- begin
- TimerForAnimation.Enabled := False;
- RaceIsGoing := False;
- LabelHelp.Visible := True;
- end;
- if HowManyFinished = 1 then
- LabelFinish.Caption := 'Финишировали:' + #10#13;
- LabelFinish.Caption := LabelFinish.Caption + IntToStr(HowManyFinished) + '. Атлет номер ' + IntToStr(i + 1) + #10#13;
- end;
- end;
- end;
- function TFormMain.MultPixels(PixQuant: Integer) : Integer;
- begin
- Result := Round(PixQuant * MultPix);
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment