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 ;