import java.applet.Applet;
import java.awt.*;
import java.util.Calendar;
import java.awt.geom.*;

/** 
    Applet zum Zeichnen einer Uhr. Angezeigt wird die Zeit beim Starten des 
    Applets.
    @author Martin Hofmann
    @version 1.0
*/
public class MyApplet extends Applet { 
    /** Das Kalender Objekt. Es enthaelt die Zeit beim Starten des Applets. */
    private Calendar now; 
    /** Der aktuelle Grafikkontext. Wird bei jedem paint neu gesetzt. */
    private Graphics2D g2; 
    /** Radius der Uhr in Pixeln */
    private final int RADIUS_UHR = 100;
    /** X-Koordinate des Mittelpunkts in Pixeln von links oben */
    private final int MITTELPUNKT_X = 150;
    /** Y-Koordinate des Mittelpunkts in Pixeln von links oben */
    private final int MITTELPUNKT_Y = 150;
    /** Abstand der Spitze des grossen Zeigers 
	vom Mittelpunkt in Benutzerkoordinaten (Radius=1) */
    private final double GROSSER_ZEIGER_VOR = 0.9;
    /** Abstand des Anfangs des grossen Zeigers 
	vom Mittelpunkt in Benutzerkoordinaten (Radius=1) */
    private final double GROSSER_ZEIGER_ZURUECK = 0.1;
    /** Abstand der Spitze 
	des kleinen Zeigers vom Mittelpunkt in 
	Benutzerkoordinaten (Radius=1) */
    private final double KLEINER_ZEIGER_VOR = 0.7;
    /** Abstand des Anfangs des kleinen Zeigers 
	vom Mittelpunkt in Benutzerkoordinaten (Radius=1) */
    private final double KLEINER_ZEIGER_ZURUECK = 0.1;
    /** Dicke in Pixel */
    private final int DICKE = 8;
    /** Farbe des Zifferblatts */
    private final Color FARBE_ZIFFERBLATT = new Color(0.6F,0.6F,0.1F);
    /** Zeichenfarbe*/
    private final Color ZEICHENFARBE=Color.magenta;

    /** Der Konstruktor setzt die Kalendervariable {@link #now now}. */
    public MyApplet()
    {
	now = Calendar.getInstance();
    }
	
    /** Malt einen Zeiger.
	@param laenge_vor Abstand der Spitze in Benutzerkoordinaten.
	@param laenge_zurueck Abstand des Anfangs in Benutzerkoordinaten.
	@param winkel in Grad. 12Uhr=0, 3Uhr=90 */
    private void maleZeiger(double laenge_vor, 
			    double laenge_zurueck,
			    double winkel) {
	Point2D.Double von = 
	    new Point2D.Double(
			       xpixel(laenge_vor*Math.cos(Math.PI/2-winkel)),
			       ypixel(laenge_vor*Math.sin(Math.PI/2-winkel)));
	Point2D.Double nach = 
	    new Point2D.Double(
			       xpixel(laenge_zurueck*Math.cos(3*Math.PI/2-winkel)),
			       ypixel(laenge_zurueck*Math.sin(3*Math.PI/2-winkel)));
	g2.draw(new Line2D.Double(von,nach));
    }

    /** Umrechnen in Pixel.
	@param x-Koordinate in Benutzerkoordinaten: Mittelpunkt=(0,0), Radius=1
	@return Entsprechender Pixelwert.
    */
    private double xpixel(double x) {
	return x*RADIUS_UHR + MITTELPUNKT_X;
    }

    /** Umrechnen in Pixel.
	@param y-Koordinate in Benutzerkoordinaten: Mittelpunkt=(0,0), Radius=1
	@return Entsprechender Pixelwert.
    */
    private double ypixel(double y) {
	return (-y)*RADIUS_UHR + MITTELPUNKT_Y;
    }

    /** Zeichnet die Uhr */
    public void paint(Graphics g)
    {
	/* Speichern des Grafikkontext zur Verwendung in maleZeiger() */
	g2 = (Graphics2D)g; 
	g2.drawString("Zeit beim Aufruf des Applets", 
		      (float)xpixel(-1),(float)ypixel(-1.2));

	/* Zeichnen mit Dicke DICKE und gerundeten Enden */
	g2.setStroke(new BasicStroke(DICKE, 
				     BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
	/* Setzen der Hintergrundfarbe des Applets. */
	this.setBackground(Color.white);
		     
	Ellipse2D.Double 
		     zifferblatt = new Ellipse2D.Double
	    (xpixel(-1),ypixel(1),2*RADIUS_UHR,2*RADIUS_UHR);
	g2.setColor(FARBE_ZIFFERBLATT);
	g2.fill(zifferblatt);
	g2.setColor(ZEICHENFARBE);
	g2.draw(zifferblatt);

	int minutenSeitZwoelf = 
	    60 * now.get(Calendar.HOUR) + now.get(Calendar.MINUTE);
	
	double winkel_klein 
	    = ((double)minutenSeitZwoelf) / (60*12) * 2. * Math.PI;
	double winkel_gross 
	    = minutenSeitZwoelf % 60 / 60.0 * 2.* Math.PI;

	maleZeiger(KLEINER_ZEIGER_VOR,KLEINER_ZEIGER_ZURUECK,winkel_klein);
	maleZeiger(GROSSER_ZEIGER_VOR,GROSSER_ZEIGER_ZURUECK,winkel_gross);
    }
}
