// Michael Tartaglia
// Analog Clock


import java.util.Calendar;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;

public class AnalogClock extends Applet {
   private Image clock;             // clock image (duh...)
   private Graphics cg;             // clock graphics package
   private int[] time = new int[6]; // hours, mins, secs to store
   private double deg;              // angle of hand
   private int clockSize = 200,     // size of clock in pixels
		    hrHand, mHand, sHand,     // sizes of hands
		    center;                   // center coordinate (x = y)


   public void init() {
    clock = this.createImage(clockSize,clockSize);
    cg = clock.getGraphics();
    setBackground(Color.white);
    mHand = (int)(.8 * clockSize);      // minute hand size
    sHand = (int)(.8 * clockSize);      // second hand size
    hrHand = (int)(.55 * clockSize);    // hour hand size
    center = clockSize/2;               // location of center (again, x = y)
   }
   public void start() {repaint();}
   public void stop() {}
   public void destroy() {}


   public void setTime(Calendar date) {
    time[0] = date.get(Calendar.HOUR);		// set hour
  	 time[1] = date.get(Calendar.MINUTE);	// set minute
  	 time[2] = date.get(Calendar.SECOND);	// set second
   }


   public void paintClock() {
    setTime(Calendar.getInstance());

    cg.setColor(Color.white);	// set color
    cg.fillRect(0,0,200,200);	// erase clock face to start anew
	 
    // DRAW HOUR MARKERS
    for (int i = 0; i < 12; i++) {
      if (i % 3 == 0) cg.setColor(Color.gray);
      else cg.setColor(Color.darkGray);
      cg.fill3DRect((int)(Math.cos(i*2.5*Math.PI/15)*90)+center - 3,
                    (int)(Math.sin(i*2.5*Math.PI/15)*90)+center - 3,
                    6,6,true);
    }


    // SECOND HAND; line = 2*pi*time/60
    deg = 2*Math.PI*time[2]/60;
    for (int i = 0; i < 12; ++i) {
     cg.setColor(new Color(128+(i*10),0,0));	// set color
     drawCircles(8,(int)(center+((i*8)*Math.sin(deg))),
         (int)(center-((i*8)*Math.cos(deg))),cg);
    }

    // HOUR HAND; line = 2*pi*(secs_in_hr*current_second + secs_in_min*current_min + hr) / secs_in_day
    deg = 2*Math.PI*(3600*time[0]+60*time[1]+time[2])/43200;
    for (int i = 0; i < 6; ++i) {
     cg.setColor(new Color(0,128+(i*10),0));
     drawCircles(14,(int)(center+((i*8)*Math.sin(deg))),
         (int)(center-((i*8)*Math.cos(deg))),cg);
    }

    // MINUTE HAND; line = 2*pi*time / 60
    deg = 2*Math.PI*time[1]/60;
    for (int i = 0; i < 8; ++i) {
     cg.setColor(new Color(0,0,128+(i*10)));
     drawCircles(10,(int)(center+((i*8)*Math.sin(deg))),
         (int)(center-((i*8)*Math.cos(deg))),cg);
    }


    cg.setColor(Color.black);
    cg.drawOval(0,0,199,199);	// CLOCK FACE FRAME
   }


   public void drawCircles(int diameter, int x, int y, Graphics g)
   // FUNCTION: draws circles of "diameter" onto graphics package "g"
   //				 at point ("x","y")
   {
   	g.fillOval((x-diameter/2), (y-diameter/2),diameter,diameter);
   }


   public void update(Graphics g) {paint(g);}
   public void paint(Graphics g) {
      paintClock();						// ASSEMBLE CLOCK
      g.drawImage(clock,0,0,this);	// DRAW CLOCK IMAGE
      try {Thread.sleep(100); repaint();}	// LOOP
      catch (InterruptedException x) {}
   }

}
