[Home]Clock

Robo Home | Changes | Preferences | AllPages

package jonathan.util;

import java.util.*;
import java.awt.Color;
import robocode.robocodeGL.*;
import robocode.robocodeGL.system.GLRenderer;

public class Clock {
	private static final double PI_30 = Math.PI / 30.0,
							PI_SECOND = Math.PI / 30000.0,
							PI_MINUTE = Math.PI / 1800000.0,
							  PI_HOUR = Math.PI / 21600000.0;
	private static final int MILLIS_IN_DAY = 43200000;
	
	private GLRenderer renderer;
	
	private double x, y;
	private int offset;
	private Color primary, secondary;
	private double circleBegin, circleEnd, circleWidth;
	private double hourBegin, hourEnd, hourWidth;
	private double minuteBegin, minuteEnd, minuteWidth;
	private double secondBegin, secondEnd, secondWidth;
	private double dotSize;
	
	private LineGL[] circle;
	private LineGL hour, minute, second;
	private PointGL dot;
	
	private boolean changed;
	
	//////////////////////////////////////////////////////////////
	
	public Clock() {
		renderer = GLRenderer.getInstance();
		
		circle = new LineGL[60];
		for(int i=0; i<60; i++) circle[i] = new LineGL();
		
		hour = new LineGL();
		minute = new LineGL();
		second = new LineGL();
		dot = new PointGL();
		
		setDefaults();
		tick();
	}
	
	//////////////////////////////////////////////////////////////
	
	public void add() {
		for(int i=0; i<60; i++) renderer.addRenderElement(circle[i]);
		
		renderer.addRenderElement(hour);
		renderer.addRenderElement(minute);
		renderer.addRenderElement(second);
		
		renderer.addRenderElement(dot);
	}
	
	public void remove() {
		for(int i=0; i<60; i++) circle[i].remove();
		
		hour.remove();
		minute.remove();
		second.remove();
		
		dot.remove();
	}
	
	//////////////////////////////////////////////////////////////
	
	public void tick() {
		if(changed) {
			rebuild();
			changed = false;
		}
		
		double now = (double)((new Date().getTime() + offset) % MILLIS_IN_DAY);
		setHand(hour, now * PI_HOUR, hourBegin, hourEnd);
		setHand(minute, now * PI_MINUTE, minuteBegin, minuteEnd);
		setHand(second, now * PI_SECOND, secondBegin, secondEnd);
	}
	
	//////////////////////////////////////////////////////////////
	
	public void setLocal() {
		setLocal(true);
	}
	
	public void setUTC() {
		setOffset(0);
	}
	
	public void setLocal(boolean local) {
		setOffset(local ? TimeZone.getDefault().getRawOffset() : 0);
	}
	
	public void setOffset(int offset) {
		this.offset = offset;
	}
	
	public void setLocation(double x, double y) {
		this.x = x;
		this.y = y;
		changed = true;
	}
	
	public void setDotSize(double dotSize) {
		this.dotSize = dotSize;
		changed = true;
	}
	
	public void setColors(Color primary, Color secondary) {
		this.primary = primary;
		this.secondary = secondary;
		changed = true;
	}
	
	public void setCircle(double begin, double end, double width) {
		circleBegin = begin;
		circleEnd = end;
		circleWidth = width;
		
		changed = true;
	}
	
	public void setHour(double begin, double end, double width) {
		hourBegin = begin;
		hourEnd = end;
		hourWidth = width;
		
		changed = true;
	}
	
	public void setMinute(double begin, double end, double width) {
		minuteBegin = begin;
		minuteEnd = end;
		minuteWidth = width;
		
		changed = true;
	}
	
	public void setSecond(double begin, double end, double width) {
		secondBegin = begin;
		secondEnd = end;
		secondWidth = width;
		
		changed = true;
	}
	
	public void setDefaults() {
		setUTC();
		setLocation(100.0, 100.0);
		setColors(new Color(1.0f, 0.0f, 0.0f, 0.8f), new Color(0.8f, 0.8f, 0.8f, 0.8f));
		setDotSize(10.3);
		setCircle(87.5, 93.75, 2.7);
		setHour(0.0, 43.75, 4.6);
		setMinute(0.0, 75.0, 3.4);
		setSecond(0.0, 81.25, 2.0);
		
		changed = true;
	}
	
	//////////////////////////////////////////////////////////////
	
	private void rebuild() {
		dot.setPosition(x, y);
		dot.setSize((float)dotSize);
		dot.setColor(primary);
		
		for(int i=0; i<60; i++) {
			LineGL line = circle[i];
			setHand(line, i*PI_30, circleBegin, circleEnd);
			line.setColor(i%5==0 ? primary : secondary);
			line.setWidth(circleWidth);
		}
		
		hour.setWidth(hourWidth);
		minute.setWidth(minuteWidth);
		second.setWidth(secondWidth);
		
		hour.setColor(secondary);
		minute.setColor(secondary);
		second.setColor(secondary);
	}
	
	private void setHand(LineGL hand, double rotation, double begin, double end) {
		double sin = Math.sin(rotation), cos = Math.cos(rotation);
		hand.setLine(x + sin*begin, y + cos*begin, x + sin*end, y + cos*end);
	}
}

Now you can continue Robocoding without missing NewYears. :-) -- Jonathan



Robo Home | Changes | Preferences | AllPages
Edit text of this page | View other revisions
Last edited December 31, 2004 0:22 EST by Jonathan (diff)
Search: