// Java Programm das eine weiche Uhr in einem Fenster anzeigt. 

import java.awt.*;
import java.applet.*;
import java.util.*;
public class DaliUhr extends SimpleUhr
{

protected int[ ] Radien;
protected Polygon Rand;
protected int Speed; 

public String[][] getParameterInfo()
	{
	String [][] superInfo = super.getParameterInfo();
	String[][] info = new String[superInfo.length+1][3]; 
	info[superInfo.length+1][0]="Speed"; 
	info[superInfo.length+1][1]="int"; 
	info[superInfo.length+1][2]="Geschwindigkeit"; 
	return info;
	}

public void init()
	{
	int x,y;
	super.init();
	Speed = Integer.valueOf(getParameter("Speed")).intValue();
	Radien = new int [61];
	for (int i=0;i<61;i++)
		{
		Radien[i] = (int)(Laenge*2.5);
		};
	Rand = new Polygon();
	for (int i=0;i<61;i++)
		{
		double W=i*(Math.PI/30);
		x = -(int)(Radien[i]*Math.cos(W));
		y = (int)(Radien[i]*Math.sin(W));
		Rand.addPoint(x,y);
		}
	};

public void run()	
	{
	int zaehler = 0;
	while(1==1)
		{
		Datum = new Date();
		zaehler++;
		if (zaehler == Speed)
			{
			MoveRadien();
			zaehler = 0;
			}
		repaint();
		try
			{
			Zeit.sleep(200);
			}
		catch (InterruptedException e) 
			{
			System.out.print("Thread_interrupted");
			};
		} ;
	};



public void DrawZifferBlatt (Graphics g)
	{
	BerechneRand(1);
	g.setColor(Color.yellow);
	g.fillPolygon(Rand);
	g.setColor(g.getColor().darker());
	g.drawPolygon(Rand);
	BerechneRand(0.86);
	g.setColor(Color.white);
	g.fillPolygon(Rand);
	g.setColor(Color.yellow);
	g.setColor(g.getColor().darker());
	g.drawPolygon(Rand);
	g.setColor(Color.black);
	for (int i = 0; i <60; i+=5)
		{
		DrawRadialLine(g,(int)(Radien[i]*0.78),(int)(Radien[i]*0.85),i*(Math.PI/30));
		};
	};

public void DrawZeiger (Graphics g)
	{
	int Sek,Min,Std;
	Sek = Datum.getSeconds();
	Min = Datum.getMinutes();
	Std = Datum.getHours()%12;

	DrawRadialLine(g,0,(int)(0.8*Radien[Sek]),Sek*(Math.PI/30));
	DrawRadialLine(g,0,(int)(0.8*Radien[Min]),Min*(Math.PI/30));
	DrawRadialLine(g,0,(int)(0.6*Radien[Std*5+Min/12]),Std*5*(Math.PI/30)
					+Min*(Math.PI/360));
	}

public void BerechneRand(double f)
	{
	for (int i=0;i<Rand.npoints;i++)
		{
		double W=i*(Math.PI/30);
		Rand.ypoints[i] = -(int)(f*Radien[i]*Math.cos(W));
		Rand.xpoints[i] = (int)(f*Radien[i]*Math.sin(W));
		}
	}

public void MoveRadien()
	{
	MoveFixpunkte();
	BerechneInBetweens();
	}

public void MoveFixpunkte()
	{
	for (int i=0;i<60;i+=5)
		{
		Radien[i] = Radien[i]+(int)(Math.random()*8-4);
		if (Radien[i]<Laenge)
			{
			Radien[i]+=5;
			}
		else if (Radien[i]>3*Laenge)
			{
			Radien[i]-=5;
			};
		};
	Radien[60] = Radien[0];
	}

public void BerechneInBetweens()
	{
	for (int i=5;i<=60;i+=5)
		{
		double y1,y2,y3,a,b,c,D1,D2;
		double D = -31.25;
		y1 = (Radien[(i-5)%60]+Radien[i%60])/2;
		y2 = Radien[i%60];
		y3 = (Radien[i%60]+Radien[(i+5)%60])/2;
		D1 =5*y2-2.5*(y1+y3);
		D2 = 25*(y1-y2)-6.25*(y1-y3);
		a=D1/D;
		b=D2/D;
		c=y1+0.5;    // Runden !
		Radien[(i-2)%60]=(int)(a*0.25+b*0.5+c);
		Radien[(i-1)%60]=(int)(a*2.25+b*1.5+c);
		Radien[(i+1)%60]=(int)(a*12.25+b*3.5+c);
		Radien[(i+2)%60]=(int)(a*20.25+b*4.5+c);
		}
	}
} 

