Vanilla_Fury

laba_6_1_del

Apr 16th, 2021
574
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 7.82 KB | None | 0 0
  1. unit laba_6_1_f1;
  2.  
  3. interface
  4.  
  5. uses
  6.     Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  7.     System.Classes, Vcl.Graphics,
  8.     Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Math, Vcl.StdCtrls,
  9.   Vcl.ExtCtrls, Vcl.Imaging.pngimage;
  10.  
  11. type
  12.     TMan = Class (TImage)
  13.     private
  14.         CurrentAngularSpd, Angle: Double;
  15.         RadiusOfLine: SmallInt;
  16.         Finished: Boolean;
  17.     End;
  18.  
  19.     TArrMen = Array [0..7] of TMan;
  20.  
  21.     TFormMain = class(TForm)
  22.         MainMenu1: TMainMenu;
  23.         NHelp: TMenuItem;
  24.         NTask: TMenuItem;
  25.         NAuthor: TMenuItem;
  26.     LabelToMeasureScreenOfUser: TLabel;
  27.     ImageCanvas: TImage;
  28.     ImageMan: TImage;
  29.     TimerForAnimation: TTimer;
  30.     LabelFinish: TLabel;
  31.     Label1: TLabel;
  32.     Label2: TLabel;
  33.     Label3: TLabel;
  34.     Label4: TLabel;
  35.     Label5: TLabel;
  36.     Label6: TLabel;
  37.     Label7: TLabel;
  38.     Label8: TLabel;
  39.     LabelHelp: TLabel;
  40.     procedure NTaskClick(Sender: TObject);
  41.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  42.     procedure NAuthorClick(Sender: TObject);
  43.     procedure FormCreate(Sender: TObject);
  44.     function MultPixels(PixQuant: Integer) : Integer;
  45.     procedure DrawStadiumAndCreateMen();
  46.     procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
  47.     procedure TimerForAnimationTimer(Sender: TObject);
  48.     procedure PutManOnStart(Man: TMan);
  49.  
  50.     private
  51.         MultPix: Single;
  52.         CenterX, CenterY, RadiusOfBiggestLine, WidthOfOneLine: SmallInt;
  53.         RaceIsGoing: Boolean;
  54.  
  55.         ArrOfMen: TArrMen;
  56.         HowManyFinished: Byte;
  57.     public
  58.         { Public declarations }
  59.     end;
  60.  
  61. var
  62.     FormMain: TFormMain;
  63.  
  64. const
  65.     DefaultAngSpd = 0.01;
  66.     MaxDivergeOfAngSpd = 0.002;
  67.     MaxChangeOfSpeedPerTick = 0.001;
  68.  
  69. implementation
  70.  
  71. {$R *.dfm}
  72.  
  73. procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  74. begin
  75.     CanClose := (MessageDlg('Вы уверены, что хотите выйти из программы?' +
  76.         #10#13 + 'Все несохранённые данные будут утеряны.',
  77.         mtConfirmation, [mbYes, mbNo], 0) = mrYes);
  78. end;
  79.  
  80. procedure TFormMain.FormCreate(Sender: TObject);
  81. begin
  82.     MultPix := LabelToMeasureScreenOfUser.Width / 100;
  83.  
  84.     RaceIsGoing := False;
  85.  
  86.     DrawStadiumAndCreateMen();
  87. end;
  88.  
  89. procedure TFormMain.FormKeyDown(Sender: TObject; var Key: Word;
  90.   Shift: TShiftState);
  91. var
  92.     i: Byte;
  93.  
  94. begin
  95.     if (Key = VK_RETURN) and not RaceIsGoing then
  96.     begin
  97.         RaceIsGoing := True;
  98.  
  99.         for i := 0 to 7 do
  100.             PutManOnStart(ArrOfMen[i]);
  101.         TimerForAnimation.Enabled := True;
  102.         HowManyFinished := 0;
  103.         LabelFinish.Caption := '';
  104.         LabelHelp.Visible := False;
  105.     end;
  106. end;
  107.  
  108. procedure TFormMain.DrawStadiumAndCreateMen();
  109. var
  110.     i: Byte;
  111.     Radius: SmallInt;
  112.  
  113. begin
  114.     with ImageCanvas do
  115.     begin
  116.         Left := 0;
  117.         Top := 0;
  118.         Width := FormMain.Width;
  119.         Height := FormMain.Height;
  120.  
  121.         CenterX := Round(Width / 2);
  122.         CenterY := Round(Height / 2);
  123.  
  124.         RadiusOfBiggestLine := Round(Min(Width, Height) * 2 / 5);
  125.         WidthOfOneLine := MultPixels(30);
  126.  
  127.         With Canvas do
  128.         begin
  129.             Pen.Color := clBlack;
  130.             Brush.Color := clMoneyGreen;
  131.             Pen.Width := MultPixels(2);
  132.  
  133.             for i := 0 to 8 do
  134.             begin
  135.                 Radius := RadiusOfBiggestLine - WidthOfOneLine * i;
  136.                 if i = 8 then
  137.                     Brush.Color := clWhite
  138.                 else
  139.                 begin
  140.                     ArrOfMen[i] := TMan.Create(FormMain);
  141.                     with ArrOfMen[i] do
  142.                     begin
  143.                         Parent := FormMain;
  144.                         RadiusOfLine := Radius - Round(WidthOfOneLine / 2);
  145.                         CurrentAngularSpd := DefaultAngSpd + Random(Round(MaxDivergeOfAngSpd * 200000)) / 100000 - MaxDivergeOfAngSpd;
  146.                         Picture := ImageMan.Picture;
  147.                         Center := True;
  148.                         Stretch := True;
  149.                         Proportional := True;
  150.                         Width := WidthOfOneLine;
  151.                         Height := Width;
  152.  
  153.                         PutManOnStart(ArrOfMen[i]);
  154.  
  155.                         DoubleBuffered := True;
  156.                     end;
  157.                 end;
  158.  
  159.                 Ellipse(CenterX - Radius, CenterY - Radius, CenterX + Radius, CenterY + Radius);
  160.             end;
  161.             Pen.Color := clRed;
  162.             MoveTo(CenterX, CenterY + Radius);
  163.             LineTo(CenterX, CenterY + RadiusOfBiggestLine);
  164.         end;
  165.     end;
  166. end;
  167.  
  168. procedure TFormMain.PutManOnStart(Man: TMan);
  169. begin
  170.     with Man do
  171.     begin
  172.         Left := CenterX - Round(Width / 2);
  173.         Top := CenterY + RadiusOfLine - Round(Width / 2);
  174.         Angle := 0;
  175.         CurrentAngularSpd := DefaultAngSpd + Random(Round(MaxDivergeOfAngSpd * 200000)) / 100000 - MaxDivergeOfAngSpd;
  176.         Finished := False;
  177.     end;
  178. end;
  179.  
  180. procedure TFormMain.NAuthorClick(Sender: TObject);
  181. begin
  182.     ShowMessage('Панев Александр, гр. 051007' + #10#13 + 'Минск, 2021');
  183. end;
  184.  
  185. procedure TFormMain.NTaskClick(Sender: TObject);
  186. begin
  187.     ShowMessage('Составить программу вывода на экран восьми вложенных друг в ' +
  188.     'друга окружностей, представляющих собой беговые дорожки. На линии старта ' +
  189.     'находятся восемь участника забега (произвольной фигуры). При нажатии ' +
  190.     'клавиши "Ввод" участники стартуют с одинаковой угловой скоростью. После ' +
  191.     'старта угловая скорость каждого участника в процессе гонки изменяется ' +
  192.     'по случайному закону. На финише указать место, занятое каждым участником.');
  193. end;
  194.  
  195. procedure TFormMain.TimerForAnimationTimer(Sender: TObject);
  196. var
  197.     i: Byte;
  198.  
  199. begin
  200.     for i := 0 to 7 do
  201.         with ArrOfMen[i] do
  202.         begin
  203.             if Round(Angle * 100) mod 100 = 0 then
  204.             begin
  205.                 CurrentAngularSpd := CurrentAngularSpd + Random(Round(MaxChangeOfSpeedPerTick * 200000)) / 100000 - MaxChangeOfSpeedPerTick;
  206.                 if CurrentAngularSpd > DefaultAngSpd + MaxDivergeOfAngSpd then
  207.                     CurrentAngularSpd := DefaultAngSpd + MaxDivergeOfAngSpd
  208.                 else
  209.                     if CurrentAngularSpd < DefaultAngSpd - MaxDivergeOfAngSpd then
  210.                         CurrentAngularSpd := DefaultAngSpd - MaxDivergeOfAngSpd;
  211.             end;
  212.  
  213.             Angle := Angle + CurrentAngularSpd;
  214.  
  215.             Left := CenterX + Round(Sin(Angle) * RadiusOfLine) - Round(Width / 2);
  216.             Top := CenterY + Round(Cos(Angle) * RadiusOfLine) - Round(Width / 2);
  217.  
  218.             if (Angle > 2 * Pi) and not Finished then
  219.             begin
  220.                 Finished := True;
  221.                 Inc(HowManyFinished);
  222.                 if HowManyFinished = 8 then
  223.                 begin
  224.                     TimerForAnimation.Enabled := False;
  225.                     RaceIsGoing := False;
  226.                     LabelHelp.Visible := True;
  227.                 end;
  228.  
  229.                 if HowManyFinished = 1 then
  230.                     LabelFinish.Caption := 'Финишировали:' + #10#13;
  231.                 LabelFinish.Caption := LabelFinish.Caption + IntToStr(HowManyFinished) + '. Атлет номер ' + IntToStr(i + 1) + #10#13;
  232.             end;
  233.         end;
  234. end;
  235.  
  236. function TFormMain.MultPixels(PixQuant: Integer) : Integer;
  237. begin
  238.     Result := Round(PixQuant * MultPix);
  239. end;
  240.  
  241. end.
Advertisement
Add Comment
Please, Sign In to add comment