# mission2b0.adb

    --
    -- Ce programme teste quelques fonctions de calcul sur les caps.
    --

    with Gada.Text_IO ;

    procedure Mission2B0 is

       package Txt renames GAda.Text_IO ;

       Angle_Tour : constant Float := 360.0 ;
       Demi_Tour  : constant Float := Angle_Tour / 2.0 ;

       ---
       --- DELTA_CAP
       ---
       -- Calcule la différence entre deux caps, modulo 360
       -- Le résultat est dans ]-180 ; 180]
       function Delta_Cap (Cap_Actuel : Float ; Cap_Voulu : Float) return Float is
          Resultat : Float ;
       begin
          Resultat := Cap_Voulu - Cap_Actuel ;

          -- Si c'est trop grand, on enlève un tour
          if Resultat > Demi_Tour then Resultat := Resultat - Angle_Tour ;

          -- Si c'est trop petit, on ajoute un tour
          elsif Resultat < - Demi_Tour then Resultat := Resultat + Angle_Tour ;
          end if ;

          return Resultat ;
       end Delta_Cap ;

       ---
       --- TEST DE DELTA_CAP
       ---
       procedure Tester_Delta_Cap (CapA : Float ; CapV : Float) is
       begin
          Txt.Put_Line (Aff => "Delta_Cap " & Float'Image( CapA ) & ", " &
                          Float'Image( CapV ) & " = " &
                          Float'Image( Delta_Cap(Cap_Actuel => CapA, Cap_Voulu => CapV)) ) ;
       end Tester_Delta_Cap ;

       ---
       --- CAPS_EGAUX
       ---
       -- Indique si deux caps sont égaux à 5 degrés près.
       --
       function Caps_Egaux (Cap1 : Float ; Cap2 : Float) return Boolean is
          Tolerance : constant Float := 5.0 ;
       begin
          return abs (Delta_Cap ( Cap_Actuel => Cap1, Cap_Voulu => Cap2)) < Tolerance ;
       end Caps_Egaux ;

       ---
       --- TEST DE CAPS EGAUX
       ---
       procedure Tester_Caps_Egaux (Cap1, Cap2 : Float) is
       begin
          Txt.Put (Aff => "Les caps " & Float'Image(Cap1) & " et " &
                     Float'Image(Cap2) & "  ") ;
          if Caps_Egaux(Cap1, Cap2) then
             Txt.Put_Line (Aff => " sont égaux (à 5 degrés près).") ;
          else
             Txt.Put_Line (Aff => " ne sont pas égaux (à 5 degrés près).") ;
          end if ;
       end Tester_Caps_Egaux ;

    begin

       Tester_Delta_Cap (CapA => 0.0,   CapV => 45.0) ;
       Tester_Delta_Cap (CapA => 45.0,  CapV => 0.0) ;
       Tester_Delta_Cap (CapA => 350.0, CapV => 10.0) ;
       Tester_Delta_Cap (CapA => 10.0,  CapV => 350.0) ;
       Tester_Delta_Cap (CapA => 30.0,  CapV => 285.0) ;

       Tester_Caps_Egaux (Cap1 => 0.0,   Cap2 => 10.0) ;
       Tester_Caps_Egaux (Cap1 => -10.0, Cap2 => 0.0) ;
       Tester_Caps_Egaux (Cap1 => 358.0, Cap2 => 2.0) ;

    end Mission2B0 ;