unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls, Buttons, Math, XPMan, ShellApi;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Tl2Smaz: TBitBtn;
    Tl3Napoveda: TBitBtn;
    Tl1Vykresli: TBitBtn;
    Plocha1: TImage;
    Vysledky: TGroupBox;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Vrh_delka: TLabel;
    Vrh_doba: TLabel;
    Vrh_Max_vyska: TLabel;
    Parametry: TGroupBox;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Vrh_uhel: TEdit;
    Vrh_rychlost: TEdit;
    Vrh_vyska: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Vrh_v: TLabel;
    Vrh_ax: TLabel;
    Vrh_a: TLabel;
    Check1Odpor: TCheckBox;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    XPManifest1: TXPManifest;
    procedure FormCreate(Sender: TObject);
    procedure Tl1VykresliClick(Sender: TObject);
    procedure Tl2SmazClick(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
    procedure Tl3NapovedaClick(Sender: TObject);
  private
     t, dt, x, y, ax, h, ay, vx, vy: real;
     maxvyska:real;
     krok_zpatky:integer;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  try
  Plocha1.Picture.LoadFromFile('vrh.bmp');     // Po startu nactu pozadi,
  except                                       // na nez se bude kreslit
  	Application.MessageBox('Nemohu nalézt soubor vrh.bmp!'+ #13#10 + 
    'Program bude ukončen.','Chyba načtení souboru!',MB_ICONERROR);
 	  Application.Terminate
  end;
end;

procedure TForm1.Tl2SmazClick(Sender: TObject);
begin
     Timer1.Enabled:=False;
     Plocha1.Picture.LoadFromFile('vrh.bmp');
end;


procedure TForm1.Tl1VykresliClick(Sender: TObject);

var v0,alfa,h0,a: real;
    Code1,Code2,Code3:integer;

begin
  Plocha1.Picture.LoadFromFile('vrh.bmp');
  maxvyska:=0;

  if (Vrh_rychlost.Text <> '') and (Vrh_uhel.Text <> '')
 and (Vrh_vyska.Text <> '') then
         begin
            Val(Vrh_rychlost.Text, v0, Code1);   // prevedu text na cisla
            Val(Vrh_uhel.Text, alfa, Code2);
            Val(Vrh_vyska.Text, h0, Code3)
         end

      else

         begin
            Application.MessageBox('Vyplňte všechny vstupní údaje!','Chyba zadání!',MB_ICONERROR);
            exit
         end;


  if (Code1 <> 0) or (Code2 <> 0) or (Code3 <> 0)  then
          begin
             Application.MessageBox('Vyplňujte číselné údaje...','Chyba zadání!',MB_ICONERROR);
             exit
          end;

  if (alfa<0) or (alfa>90) then
          begin
             Application.MessageBox('Úhel musí být z intervalu <0;90>','Chyba zadání!',MB_ICONERROR);
             exit
          end;

  if (h0<0) or (h0>25) then
          begin
             Application.MessageBox('Počáteční výška musí být z intervalu <0;25>','Chyba zadání!',MB_ICONERROR);
             exit
          end;

  if (v0<0) or (v0>25) then
          begin
             Application.MessageBox('Počáteční rychlost musí být z intervalu <0;25>','Chyba zadání!',MB_ICONERROR);
             exit
          end;

  // Nastaveni pocatecnich podminek
  a:=DegToRad(alfa); // Funkce sin a cos vyzaduji argument v rad
  x:=0;
  y:=0;
  vx:=v0*cos(a);
  vy:=v0*sin(a);
  if alfa>30   then krok_zpatky:=trunc(alfa/3.5);     // O kolik pixelu se vracim pri
  if alfa=0    then krok_zpatky:=10;                  // vykreslovani trajektorie
  if alfa<=30  then krok_zpatky:=15;
  h:=h0;
  t:=0;
  dt:=0.01;          // Nastavuje casovy krok - spolu s
                     // Timer1.Interval ridi rychlost vykresleni

  Plocha1.Canvas.MoveTo(20,278-trunc(h0*10));   // Presunu se na misto,
                                                // odkud zacnu vykreslovat

  Timer1.Enabled:=True;      // Spustim casovac

end;



procedure TForm1.Timer1Timer(Sender: TObject);

const g = 9.81;    // Tihove zrychleni [m*s^-2]
const r = 7;       // Polomer kulicky [px]
const Z = 10;      // Zvetseni pro vykresleni

begin
  t:=t+dt;
  With Plocha1.Canvas do
    begin                       // Smazani posledni pozice kulicky
      Brush.Style:=bssolid;
      Brush.color:=clred;
      Pen.Style:=psClear;
      Pen.Mode:=pmnotXor;
      Ellipse(20+trunc(x*Z)-r,278-trunc(h*Z)-trunc(y*Z)+r,
              20+trunc(x*Z)+r,278-trunc(h*Z)-trunc(y*Z)-r);
     Pen.Mode:=pmCopy;
     Pen.Style:=psSolid;
     MoveTo(20,280);         // Vykresleni souradnych os
     LineTo(500,280);
     MoveTo(19,280);
     LineTo(19,10);
     Brush.Color:=clwhite;     // Prekresleni nepohodlnych
     Pen.Color:=clwhite;       // objektu
     Rectangle(0,0,19,281);
     Rectangle(0,297,30,281);
     Pen.Color:=clblack;
   end;
                             // Vypsani statistik letu
  Vrh_doba.Caption:=FloatToStr(SimpleRoundTo((t),-1))+' s';
  Vrh_delka.Caption:=FloatToStr(SimpleRoundTo((x),-1))+' m';
  Vrh_v.Caption:=FloatToStr(SimpleRoundTo(sqrt(vx*vx+vy*vy),0))+' m/s';
  Vrh_a.Caption:=FloatToStr(SimpleRoundTo(-ay,-2))+' m/s*s';
  Vrh_ax.Caption:=FloatToStr(SimpleRoundTo(ax,-2))+' m/s*s';

  x:=x+vx*dt;             // Vypocet novych souranic
  y:=y+vy*dt;

   if Check1Odpor.Checked then     // Vypocet novych zrychleni
     begin
      ax:=-0.12*abs(vx);           // S odporem vzduchu
      ay:=+0.12*abs(vy)-g;
     end

  else

     begin                         // Bez odporu vzduchu
      ax:=0;
      ay:=-g ;
     end;

  vx:=vx+ax*dt;                    // Vypocet novych rychlosti
  vy:=vy+ay*dt;

   With Plocha1.Canvas do
     begin
      Brush.color:=clred;           // Vykrelseni nove pozice kulicky
      Pen.Style:=psClear;
      Ellipse(20+trunc(x*Z)-r,278-trunc(h*Z)-trunc(y*Z)-r,
              20+trunc(x*Z)+r,278-trunc(h*Z)-trunc(y*Z)+r);

      MoveTo(20+trunc(x*Z-vx*krok_zpatky*r*dt),                    // Navrat o krok zpatky
             278-trunc(h*Z)-trunc(y*Z-vy*krok_zpatky*r*dt));
      if  (x*Z<8) or (y*Z+h*Z>270) then Pen.Style:=PsClear
      else Pen.Style:=psSolid;  // Abych nevykresloval pred bod [0,0]
      LineTo(20+trunc(x*Z),278-trunc(h*Z)-trunc(y*Z));           // Vykresleni trajektorie
      Pen.Color:=clBlack;
   end;


  if h+y>maxvyska then maxvyska:=h+y;     // Zjisteni max. vysky


  Vrh_Max_vyska.Caption:=FloatToStr(SimpleRoundTo((maxvyska),-1))+' m';

  if ((y+h)*Z<-1) then Timer1.Enabled:=False;  // Konec letu
    

end;

procedure TForm1.Tl3NapovedaClick(Sender: TObject);
begin
  ShellExecute(Handle, 'open', 'Uživatelská dokumentace.pdf',nil,nil,SW_SHOWNORMAL) ;
end;

end.
