import java.awt.*;

/** Cette classe implemente le cadran d'une horloge */

public class Cadran
{
  /** Offset du point 0,0 ou commence le cadran */
  private int x_offset, y_offset;
  /** Grosseur de celui-ci */
  private int oval_size;
  /** Centre du cadran */
  private int x_center, y_center;
  /** Les thicks a toutes les minutes/secondes [from][to]*/
  private int thick_x[][], thick_y[][];
  /** Pour le calcul de la position des thicks des minutes secondes*/
  private TrigN trig60;
  /** Les 24 triangles des heures */
  private int tri_x[][], tri_y[][];
  /** Pour le calcul de la postion des triangles des heures */
  private TrigN trig24;
  /** les numeros des heures affichees */
  private static final String numero[] = {"24", "03", "06", "09",
                                          "12", "15", "18", "21"};
  /** le sinus et le cosinus de ces heures */
  private int num_x[], num_y[];


  /** Constructeur */
  Cadran()
  {
    // les tableaux de la position des thicks min/secondes (string)
    // on dimensionne a 61 au lieu de 60 pour ne pas avoir a tester
    // les bornes quand on deduit des sin/cos en fonction des precedents
    thick_x = new int[60][2];
    thick_y = new int[60][2];
    trig60  = new TrigN(60);

    // les tableaux de la postion des triangles des heures (polygone)
    tri_x = new int[24][3];
    tri_y = new int[24][3];
    trig24 = new TrigN(24 * 60);

    // les tableaux pour les heures affichees
    
    num_x = new int[8];         num_y = new int[8];
    
  }

  /** Calcule les differents elements du cadran */

  public void compute(int x_offset, int y_offset, int oval_size)
  {
  	int petit_rayon, grand_rayon, hour, delta;
  	int rayon = oval_size / 2;
  	
    this.x_offset = x_offset;
    this.y_offset = y_offset;
    this.oval_size = oval_size;
    
    x_center = x_offset + (oval_size / 2);
    y_center = y_offset + (oval_size / 2);
    
    // Calcul des thicks X
    for(short i = 0; i < 60; i++)
    {
    	// position des thicks a l'exterieur du cercle
    	thick_x[i][0] = trig60.x(i, rayon) + x_center;
    	thick_y[i][0] = trig60.y(i, rayon) + y_center;
    	
    	// position des thicks a l'interieur du cercle
    	if(i % 5 == 0)
    	  petit_rayon = rayon - 14;       // plus long aux 5 minutes
    	else
    	  petit_rayon = rayon - 7;
    	  
    	thick_x[i][1] = trig60.x(i, petit_rayon) + x_center;
    	thick_y[i][1] = trig60.y(i, petit_rayon) + y_center;
    }
        
    // Calcul de la position des triangles
    
    petit_rayon = rayon + 3;
    for(short i = 0; i < 24; i++)
    {
    	if(i % 3 == 0)          // aux trois heures: triangle plus grand
    	{
    		grand_rayon = petit_rayon + 15;
    		delta = 15;
    	}
    	else
    	{
    		grand_rayon = petit_rayon + 10;
    		delta = 10;
    	}
    	hour = i * 60;
    	
    	tri_x[i][0] = trig24.x(hour, petit_rayon) + x_center;
    	tri_y[i][0] = trig24.y(hour, petit_rayon) + y_center;
    	
    	tri_x[i][1] = trig24.x(hour - delta, grand_rayon) + x_center; 
    	tri_x[i][2] = trig24.x(hour + delta, grand_rayon) + x_center; 

    	tri_y[i][1] = trig24.y(hour - delta, grand_rayon) + y_center; 
    	tri_y[i][2] = trig24.y(hour + delta, grand_rayon) + y_center; 
    }
    // on determine la position des strings des heures
    // (calcule de facon empirique a la main)

    num_x[0] = tri_x[ 0][1] + 2;   num_y[0] = tri_y[ 0][2] - 5;  // 24 heure
    num_x[1] = tri_x[ 3][1] + 8;   num_y[1] = tri_y[ 3][2] - 7;  // 03 heure
    num_x[2] = tri_x[ 6][2] + 4;   num_y[2] = tri_y[ 6][2] - 3;  // 06 heure
    num_x[3] = tri_x[ 9][2] + 8;   num_y[3] = tri_y[ 9][1] +20;  // 09 heure
    num_x[4] = tri_x[12][1] -17;   num_y[4] = tri_y[12][2] +12;  // 12 heure
    num_x[5] = tri_x[15][2] -10;   num_y[5] = tri_y[15][2] +20;  // 15 heure
    num_x[6] = tri_x[18][2] -20;   num_y[6] = tri_y[18][1] - 3;  // 18 heure
    num_x[7] = tri_x[21][1] -10;   num_y[7] = tri_y[21][1] - 7;  // 21 heure

  }

  /** Dessine le cadran */
  public void draw(Graphics g)
  {
  	// le cadran lui meme
  	
    g.setColor(Color.black);
    g.drawOval(x_offset, y_offset, oval_size, oval_size);
    g.drawOval(x_offset + 1, y_offset + 1, oval_size - 2, oval_size - 2);

    // les thicks
    
    for(short i = 0; i < 60; i++)
      g.drawLine(thick_x[i][0], thick_y[i][0], thick_x[i][1], thick_y[i][1]);

    // les triangles des heures
    
    for(short i = 0; i < 24; i++)
    {
    	g.fillPolygon(tri_x[i], tri_y[i], 3);
    }
    
    // les heures affichees
    
    for(short i = 0; i < 8; i++)
    {
      g.drawString(numero[i], num_x[i], num_y[i]);
      g.drawString(numero[i], num_x[i] + 1, num_y[i]);  // bold
    }
  }
}