/*
Datei............: Aufg1427.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 28.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.27
Kommentare.......:

Die Darstellung der Spirale erfolgt, indem eine Folge von vielen
kleiner werdenden Quadraten ausgegeben wird, wobei nach jedem
Quadrat die Orientierung der Turtle um einen festen Winkel
verändert wird (in unserem Fall 20 Grad). Um das Ergebnis
etwas hübscher aussehen zu lassen, haben wir die Klasse
TurtleGraphics erweitert und mit der Fähigkeit versehen, 
farbig gefüllte Polygone auszugeben. Nähere Beschreibungen
finden sich unten. Dies war zum Lösen der Aufgabe natürlich
nicht unbedingt nötig, eine einfache Liniengrafik hätte
auch genügt.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1427
extends Frame
{
  public static void main(String[] args)
  {
	Aufg1427 wnd = new Aufg1427();
	wnd.setSize(400,400);
	wnd.setVisible(true);
  }

  public Aufg1427()
  {
	super("Aufg1427");
	addWindowListener(
      new WindowAdapter() {
	    public void windowClosing(WindowEvent event) {
		  System.exit(0);
		}
	  }
	);
	setBackground(Color.lightGray);
  }

  public void paint(Graphics g)
  {
	int size = 30;
	ColoredTurtleGraphics tg = new ColoredTurtleGraphics(g, this);

	//100 Pixel nach rechts und 50 nach unten
	tg.turnRight(90);
	tg.moveForward(100);
	tg.turnRight(90);
	tg.moveForward(50);
	tg.turnRight(180);
	//Spirale zeichnen
	tg.dropPen();
	for (size = 45; size > 0; --size) {
	  //Quadrat zeichnen
	  tg.newPolygon();
	  for (int i = 0; i < 4; ++i) {
		tg.moveForward(size);
		tg.turnRight(90);
		tg.addPoint();
	  }
	  //Durch ein farbiges Polyon überschreiben
	  tg.fillPolygon(new Color(0,255-5*size,20+5*size));
	  //An den Anfangspunkt des nächsten Quadrats
	  tg.moveForward(size);
	  tg.turnLeft(20);
	}
  }
}

/**
 * Diese Klasse erweitert die Klasse TurtleGraphics um die 
 * Fähigkeit, farbige Polygone auszugeben. Dazu stellt es eine
 * Art Transaktionsmechanismus zur Verfügung, mit dessen Hilfe
 * eine Folge von Turtlebewegungen zusammengefaßt werden kann.
 * Der Beginn der Folge wird durch Aufruf von newPolygon 
 * eingeleitet, nach jedem Schritt wird addPoint aufgerufen,
 * und am Ende der Folge wird durch Aufruf von fillPolygon 
 * das umschließende Polygon mit der angegebenen Füllfarbe 
 * ausgegeben.
 */
class ColoredTurtleGraphics
extends TurtleGraphics
{
   Polygon poly;

   public ColoredTurtleGraphics(Graphics g, Container wnd)
   {
      super(g, wnd);
   }

   public void newPolygon()
   {
      poly = new Polygon();
   }

   public void addPoint()
   {
      poly.addPoint(state.actx, state.acty);
   }

   public void fillPolygon(Color color)
   {
      g.setColor(color);
      g.fillPolygon(poly);
   }
}

