/*
Datei............: Aufg1434.java
Projekt..........: Einführung in die Java-Programmierung
Erstellt.........: 29.11.97, Guido Krüger
Geändert.........: --
Aufgabe..........: Musterlösung zu Aufgabe 14.34
Kommentare.......:

Man kann alle angegeben Diagramme tatsächlich nur durch Veränderung
der beiden Parameter Anzahl und Winkel erzeugen. Die Konstruktionsvorschrift
der Diagramme von Abelson und diSessa lautet wie folgt:

1. Führe folgende Schritte für n von 1 bis Anzahl aus:

   2. Zeichne eine Linie der Länge n mal Anfangslänge (in 
      unserem Beispiel ist die Anfangslänge fest vorgegeben 20)

   3. Verändere die Laufrichtung um den angegeben Winkel.

4. Falls die aktuelle Laufrichtung jetzt 0 Grad ist, beende das
   Programm, andernfalls beginne mit Schritt 1.

Genau dieser Algorithmus wird durch die Methode drawAbelson unter
Verwendung der Turtlegrafik abgebildet. Brauchbare Muster ergeben 
sich dabei für alle Wertekombinationen, bei denen es eine Ganzzahl n
gibt, für die 

- das Produkt aus Winkel * Anzahl * n ein ganzzahliges Vielfaches 
  von 360 Grad ergibt (Abbruchbedingung) und

- der nach n Schritten erreichte Endpunkt mit dem Anfangspunkt
  identisch ist (geschlossene Figur).

Die Musterlösung hält ein Array aParas mit weiteren Beispielparametern
für interessante Muster. Nach jedem Mausklick wird ein repaint-Ereignis
ausgelöst und das nächste Muster der Liste angezeigt. Alle Muster 
entstammen dem Band 1 der Aufgaben und Lösungen zum Bundeswettbewerb
Informatik.
*/
import java.awt.*;
import java.awt.event.*;

public class Aufg1434
extends Frame
{
  int clickCnt = 0;
  int aParas[][] = {
	{ 35,  3},
	{ 66,  8},
	{ 70, 13},
	{ 75, 90},
	{ 80,  4},
	{ 86,  7},
	{ 87, 13},
	{111,  3},
	{120,  5},
	{124, 60},
	{130,  1},
	{132,  8},
	{135,  4},
	{135,  7},
	{144,  8},
	{150,  7},
	{170,  3},
	{177, 15},
	{188,  5},
	{200, 34},
	{270, 89},
	{300, 41}
  };

  public static void main(String[] args)
  {
	Aufg1434 wnd = new Aufg1434();
	wnd.setSize(400,400);
	wnd.setVisible(true);
  }

  public Aufg1434()
  {
	super("Aufg1434");
	addWindowListener(
	  new WindowAdapter() {
	    public void windowClosing(WindowEvent event) {
		  System.exit(0);
		}
	  }
    );
    addMouseListener(
       new MouseAdapter() {
          public void mouseClicked(MouseEvent event) {
			clickCnt = (clickCnt + 1) % aParas.length;
			repaint();
          }
       }
    );
	setBackground(Color.lightGray);
  }

  public void paint(Graphics g)
  {
	TurtleGraphics tg = new TurtleGraphics(g, this);

	tg.turnLeft(90);
	tg.moveForward(50);
	tg.turnRight(90);
	tg.turnRight(90);
	drawAbelson(tg, aParas[clickCnt][0], aParas[clickCnt][1]);
  }

  public void drawAbelson(TurtleGraphics tg, int winkel, int anzahl)
  {
	final int INITLEN = 10;
	int sumwinkel = 0;

	//Beschriftung
	tg.g.drawString("Winkel = " + winkel + " Anzahl = " + anzahl, 10, 40);
	//Anfangspunkt zeichnen
	tg.dropPen();
	for (int i = 0; i < 4; ++i) {
	  tg.moveForward(2);
	  tg.turnLeft(90);
	}
	//Figur zeichnen
	while (true) {
	  for (int i = 1; i <= anzahl; ++i) {
		tg.moveForward(INITLEN * i);
		tg.turnLeft(winkel);
		sumwinkel += winkel;
	  }
	  if (sumwinkel % 360 == 0) {
		break;
	  }
	}
  }
}

