 /** 
  * Cette classe permet la traduction des fonctions trigonometriques
  * sin() et cos(), qui sont par defaut en radiant (2 * PI radiant dans 360 degres)
  * en unites specifiees par l'usager en parametre lors de l'appel du
  * constructeur (Exemple: 360, 12, 60 pour diviser en degres, heures,ou minutes,)
  *
  * De plus les fonctions sin et cos de Java assume que le point 0 est
  * a l'est du plan (3h00) les methodes de cette classe assument que
  * le point 0 est au nord (12h00)
  *
  * Dans les methodes sin() et cos() standarts de Java les radiants
  * sont incrementes dans le sens contraire des aiguilles d'une
  * montre. Cette classe additionne les unites dans le sens des aiguilles
  * d'une montre. 
  *
  * Comme dans AWT le point y=0 est en haut du panel/frame la methode sinus de
  * cette classe retourne des nombres negatifs pour les valeurs de 
  * 21h00 à 03h00 et des nombres positifs pour les arcs de 3h00 a 9h00.
  *
  * Les methodes sin() et cos() retourne les sinus et cosinus en (double)
  * Les methodes x() et y() retourne un (int) pour une longueur donnee
  * (generalement utilisees pour des pixels)  
  *
  * Exemple (pour une trotteuse de montre au 60 secondes):
  *
  *  TrigN  trotteuse = new TrigN(60);
  *  double = trotteuse.sin(30);    retourne -1.00000
  *  double = trotteuse.cos(30);    retourne  0.00000
  *  int =    trotteuse.x(15, 200); retourne 200
  *  int =    trotteuse.y(15, 200); retorune 0
  *
  */

public class TrigN
{
   /** Nombre d'unites dans lesquelles on divise les 4 quadrants */
   private int nb_tranches;
   /** Valueur en gradiant d'une des tranches */
   private double delta;

   /** Constructeur: en parametre le nombre de tranches */
   TrigN(int nb_tranches)
   {
     this.nb_tranches = nb_tranches;
     delta = 2.0 * Math.PI / (double) nb_tranches;
   }

   /** retourne le cosinus en reel */
   public double cos(int unit)
   {
     unit = (nb_tranches / 4) - unit;     // pour inverser et commencer a 3h00
     double y = delta * (double) unit;
     return(Math.cos(y));
   }

   /** retourne le sinus en reel et negatif vu que (x,0) est au bas du plan */
   public double sin(int unit)
   {
     unit = (nb_tranches / 4) - unit;     // pour inverser et commencer a 3h00
     double x = delta * (double) unit;
     return(- Math.sin(x));
   }

   /** retourne la coordonnee en pixels du cosinus pour une longueur donnee */
   public int x(int unit, int longueur)
   {
     double xy = cos(unit) * (double) longueur;
     return ((int) Math.round(xy));
   }

   /** retourne la coordonnee en pixels du sinus pour une longueur donnee */
   public int y(int unit, int longueur)
   {
     double xy = sin(unit) * (double) longueur;
     return ((int) Math.round(xy));
   }


   /** Une methode main pour unit test */
   public static void main(String arg[])
   {
     TrigN a;

     a = new TrigN(12);
     for(int i = 0; i <= 12; i++)
     {
        System.out.println(i + " - Cos: " + a.x(i, 200) + "  Sin: " + a.y(i, 200));
     }
   }
}
  