-----------------------------------------------------------------------------
-- Nom fichier      : Tracer_Sinus                                      
-- Auteur           : R. Chelouah                                          
-- Date             : 26/03/2002                                           
--                                                                         
-- But              :  Dessinner une fonction trigonometrique (sinus) 
--                     dans une fenetre spider à dimmensions choisies par l'utilisateur                                   
--                     avec un nombre de segments choisi par l'utilisateur
--                     sur un nombre de periodes choisi par l'utilisateur
-- Date de modif.   :                                                      
-- Raison           :                                                      
-- Modules appeles  :  Ada.Numerics, ada.Numerics.Elementary_Functions                           
--                    Spider, Spider.Draw    
-- Mat. particulier :                                                      
-- Compilation      :  Gnat                                      
-- Edition de liens :  Gnat                                      
-- Mode d'execution :  Console                                             
-----------------------------------------------------------------------------
   with ada.Text_IO;                        use ada.Text_IO;               
   with ada.Integer_text_IO;                use ada.Integer_text_IO;       
   with ada.Float_text_IO;                  use ada.Float_text_IO;       

   with ada.Numerics;                       use ada.Numerics;                      -- pour la constante Pi
   with ada.Numerics.Elementary_Functions;  use ada.Numerics.Elementary_Functions; -- Pour la fonction sinus

   with Spider;                             use spider;                            -- pour la fenetre graphique
   with Spider.Draw;                        use spider.Draw;                       -- pour la gestion des couleus


   -- procedure principale
   procedure Tracer_Sinus is
   
      Mon_Choix   : Character := 'O';  -- variable mon choix
   
      Nb_Segments : Integer ;          -- Nombre de segments pour dessiner la fonction sinus
    
      Nb_Periodes : Integer ;          -- Nombre de periodes pour dessiner la fonction sinus

      XLeng       : Integer ;          -- dimensions de la fenetre de visualisation
      YLeng       : Integer ; 
     
      EchelleX    : Float ;            -- facteurs d'echelle sur les axes X et Y
      EchelleY    : Float ;
      
      DeltaX      : Float ;            -- pas de variation sur les X en radians
      
      Angle1_Rad  : Float ;            -- angle de position 1 en radians
      Angle2_Rad  : Float ;            -- angle de position 2 en radians

      Y1, Y2      : Float ;            -- Sinus deux 2 angles separes par DeltaX

   begin -- Dessiner_Sinus
      
      -- presentation du programme
      Put_Line(" ************************************************************************** ");
      Put_Line(" ***  Representation de la fonction sinus sur une fenetre graphique     *** ");
      Put_Line(" ***  Entrez le nombre de periodes                                      *** ");
      Put_Line(" ***  Entrez le nombre de segments                                      *** ");
      Put_Line(" ***  Entrez les dimensions de la fenetre graphique                     *** ");
      Put_Line(" ************************************************************************** ");
    
          -- boucle de repetition avec while
      while (Mon_Choix = 'O' or Mon_Choix = 'o') loop
      
          New_Line(2);
          Put(" Donner le nombre de periodes entre 1 et 10   : ");
          Get(Nb_Periodes);
          Skip_Line;
            
          Put(" Donner le nombre de segments entre 10 et 100 : ");
          Get(Nb_Segments);
          Skip_Line;
          
          New_Line;     
          put_Line(" Les dimensions de votre fenetre graphique  entre 100 et 600 : ");
          put(" Donner la valeur de la longueur X de la fenetre : ");
          Get(XLeng);
          Skip_Line;
          put(" Donner la valeur de largeur Y de la fenetre     : ");
          Get(YLeng);
          Skip_Line;
               
          Init_Size_Window(" Visualisation : Sinus ",XLeng,YLeng);
          
          
          -----------------------------------------------------------------------------------------
          -- Partie optionnelle, aucun point n'est attribue a cette partie
          -- Representer le centre par 0, et les valeurs max et min sur les axes (-1,+1,-KPi, +KPi)
          -----------------------------------------------------------------------------------------
          Move_To(XLeng/2 - Get_Width_Char,  YLeng/2 + Get_Height_Char/2);
          Display_Text("0");
          
          Move_To(XLeng/2 - Get_Width_Char -Get_Width_Char/2, +Get_Height_Char/10);
          Display_Text("+1");
          
          Move_To(XLeng/2 - Get_Width_Char , YLeng-Get_Height_Char);
          Display_Text("-1");
          
          Move_To(Get_Width_Char/2, YLeng/2 + Get_Height_Char/2);
          Display_Text("-"&Integer'Image(Nb_Periodes)&"Pi");
          
          Move_To(XLeng-3*Get_Width_Char, YLeng/2 + Get_Height_Char/2);
          Display_Text("+"&Integer'Image(Nb_Periodes)&"Pi");              
          ----------------------------------------------------------------------------------------
          ----------------------------------------------------------------------------------------
          
          -- Choisir la couleur rouge et tracer des axes                         
          Set_Color_Pen(Red);
          Line_To(0,YLeng/2,XLeng,YLeng/2);
          Line_To(XLeng/2,0,XLeng/2,YLeng);

          -- choisir la couleur bleue pour le trace de la courbe
          Set_Color_Pen(Blue);
         
          -- centrage de la courbe de sinus entre [-kPi .. kPi] 
          -- angle de depart egal a (- NB_Periodes*Pi)                            
          Angle1_Rad := -Float(NB_Periodes)*Pi;
          
          -- Calcul des facteurs d'echelle
          EchelleX   := Float(XLeng)/(Float(Nb_Periodes)*2.0*Pi);
          EchelleY   := Float(YLeng)/2.0;

          -- Calcul du pas d'increment sur la mesure d'angle
          DeltaX    := 2.0*Pi/(Float(Nb_Segments)); 

          -- Dessin de la courbe sinus avec la boucle for loop or while
          for I in 1..Nb_Segments*Nb_Periodes loop 
          
                Y1         := Sin(Angle1_Rad);
                Angle2_Rad := Angle1_Rad + DeltaX;
                Y2         := Sin(Angle2_Rad);
                
                Line_To(XLeng/2 + Integer(Angle1_Rad * EchelleX),     -- Xi
                        YLeng/2 - Integer(Y1 * EchelleY),             -- Yi 
                        XLeng/2 + Integer(Angle2_Rad * EchelleX),     -- Xi+1
                        YLeng/2 - Integer(Y2 * EchelleY));            -- Yi+1
                
                Angle1_Rad := Angle2_Rad;                             -- incrementer le pas sur les X  
                                                                                  
          end loop;  
----------------------------------------------------------------------------------------------------          
          New_Line;             
          Put(" Taper une touche pour continuer... ");
          Skip_Line;
          Close_Window;
         
          New_Line;
          Put( " voulez vous continuer ? tapez [O/N] : " );
          Get(Mon_Choix);
          Skip_Line;
      end loop;     -- boucle de repetition
      
   end ;  --  fin finale
