
import java.awt.*;

public class Igel { //Klasse für die Funktionsweise der Schildkröte
	private double X,Y,W; // die Position und die Richtung der turtle
	private int schlafzeit=0;
	private boolean Visible;
	private boolean Turtle;
	private Color zFarbe, hFarbe, tFarbe;
	Graphics g;
	public Igel (Graphics f){
		g=f;
		X= 100;
		Y= 100;
		W= 0;
		Visible = true;
		hFarbe=Color.lightGray;
		zFarbe=Color.black;
		tFarbe=Color.red;
		g.setColor(zFarbe);
		init();
	}
	public Igel (Graphics f, int pX, int pY) { // Konstruktor
		g=f;
		X=pX;
		Y=pY;
		W= 0;
		Visible = true;
		hFarbe=Color.lightGray;
		zFarbe=Color.black;
		tFarbe=Color.red;
		g.setColor(zFarbe);
		init();
	}
	private void init (){
		Hide();
	}
		
	final public double Bogen (double grad) { // Winkelumrechnung von Grad nach Bogen
		return (grad*Math.PI) / 180.0;
	}
	private void Drehe (double Winkel) { //Richtung ändern, links ist positiv
		W = (W+Winkel)%360;
		if(W < 0) W += 360;
	}
	private void GeheZu (double XN, double YN) { // bewegt die turtle zur angegebenen Position
		//Zeichnen (sofern Pinsel aufgesetzt)
		if (Visible)
			g.drawLine((int)Math.round(X),(int)Math.round(Y),(int)Math.round(XN),(int)Math.round(YN));
		X=XN;
		Y=YN;
	}
	final public double getX(){
		return X;
	}
	final public double getY(){
		return Y;
	}
	final public void Hide () { //Pinsel absetzen
		zeichneIgel();
		Turtle = false; 
	}
	final public void Move(double laenge) {
		zeichneIgel();
		Vor(laenge);
		zeichneIgel();
		schlafe(schlafzeit);
	}
	final public void MoveTo(double XN, double YN) {
		zeichneIgel();
		GeheZu(XN,YN);
		zeichneIgel();
		schlafe(schlafzeit);
	}
	final public void Pendown () { //Pinsel absetzen
		Visible = true; 
	}
	final public void Penup () { //Pinsel absetzen
		Visible = false; 
	}
	private void schlafe(int zeit){
		try {
				Thread.sleep(zeit);
		} catch (Exception e) {
			throw new RuntimeException("Fehler beim schlafen");
		}
	}
	final public void setColor (Color c){
		g.setColor(c);
	}
	final public void setHeading(double Winkel) {
		W = Winkel % 360;
		if(W < 0) W += 360;
	}
	final public void setSchlafdauer(int d){
		schlafzeit=d;
	}
	final public void Show () { //Pinsel aufsetzen
		Turtle = true;
		zeichneIgel();
	}
	final public void Turn(double Winkel){
		zeichneIgel();
		Drehe(Winkel);
		zeichneIgel();
		schlafe(schlafzeit);
	}
	private void Vor (double Laenge) { // bewegt die turtle in die angegebenen Richtung
		double XN = X + Laenge * Math.cos(Bogen(W));
		double YN = Y - Laenge * Math.sin(Bogen(W));
		GeheZu(XN, YN);
	}
	private void zeichneIgel() {
		if (Turtle) {	
			Color farbe=g.getColor();
			
			boolean backup=Visible;
			Visible=true;
			double xCopy = X;
			double yCopy = Y;
			double wCopy = W;
			g.setColor(tFarbe);
			g.setXORMode(hFarbe);

			Vor(8);
			Drehe(-36.9);
			Vor(-10);
			Drehe(-90+36.9);
			Vor(12);
			Drehe(90+36.9);
			Vor(10);
			Drehe(-36.9);
			Visible=false;
			Vor(-8);
			Visible=backup;
			X = xCopy;
			Y = yCopy;
			W = wCopy;
			g.setPaintMode();
			g.setColor(farbe);
		}
	}
}
