package tauglichkeitstester.test;
import tauglichkeitstester.figur.*;
import java.awt.*;
import javax.swing.*;
/**
* Das BallonFeld enthät ein Quadrat, einen Ballon
* und ein KQuadrat. Zuerst wird das Quadrat angezeigt, dann der Ballon,
* zum Schluss das KQuadrat.
* Klassen, die BallonFeld verwenden müssen durch Aufruf
* von repaint()
sicherstellen, dass die Veränderungen
* des BallonFeldes auch dargestellt werden.
*
* @author Multiplikatorengruppe LFB Informatik - OSA Karlsruhe
* Kursreihe B - Schuljahr 2002/03
* Michael Pohlig, Matthias Taulien
* @version 1.6 vom 05.11.2002
* @see Quadrat
* @see Kreis
* @see KQuadrat
*/
public class BallonFeld {
/**
* Ein Quadrat
* @see Quadrat
*/
protected Quadrat quadrat;
/**
* Ein Ballon
* @see Ballon
*/
protected Ballon ballon;
/**
* Ein Quadrat mit Kreis
* @see KQuadrat
*/
protected KQuadrat kQuadrat;
private Figur figur;
private int xMitte, yMitte;
private Runnable warteRun;
private Thread dieserThread;
/**
* Der Konstruktor erzeugt ein grünes Quadrat zufälliger Breite,
* einen roten Ballon mit Radius = 0 und ein KQuadrat von gleicher
* Göße und Farbe wie Quadrat, dem als Parameter der rote Ballon
* übergeben wird.
*
* @param xMitte x-Koordinate des Mittelpunkts von BallonFeld
* @param yMitte y-Koordinate des Mittelpunkts von BallonFeld
* @param breite Breite von BallonFeld
*/
public BallonFeld(int xMitte, int yMitte, int breite) {
this.xMitte = xMitte;
this.yMitte = yMitte;
int d = breite/10; // Rahmenbreite
int bMin = breite/4;
int seiteQuadrat = bMin + (int)(Math.random()*(breite - bMin - 2*d));
// Quadrat und Ballon zufällig aus der Mitte rücken
int dx = (int)((1 - 2*Math.random())*(xMitte - seiteQuadrat/2 - d));
int dy = (int)((1 - 2*Math.random())*(yMitte - seiteQuadrat/2 - d));
quadrat = new Quadrat(xMitte-dx, yMitte-dy, seiteQuadrat, Color.green);
ballon = new Ballon(xMitte+dx, yMitte+dy, Color.red);
kQuadrat = new KQuadrat(xMitte, yMitte, seiteQuadrat, quadrat.getFarbe(), ballon);
figur = null;
warteRun = new Runnable() {
public void run() {
warte(2000);
}
};
}
/**
* Started das BallonFeld
*/
public void starten() {
figur = quadrat;
dieserThread = new Thread(warteRun);
dieserThread.start();
}
// Nach 2 Sekunden beginn der Ballon zu wachsen
private void warte(int millisekunden) {
Thread thread = Thread.currentThread();
while (dieserThread == thread) {
try {
Thread.sleep(2000);
}
catch(InterruptedException e) {
return;
}
if (dieserThread != null) {
dieserThread = null;
ballon.start();
figur = ballon;
}
}
}
/**
* Stoppt das BallonFeld
*/
public void stoppen() {
if (dieserThread != null) {
dieserThread.interrupt();
dieserThread = null;
}
ballon.stop();
ballon.setMittelpunkt(xMitte, yMitte);
figur = kQuadrat;
}
/**
* Liefert den Größenunterschied von Quadrat und Kreis in Prozent
* zurück.
* @return Abweichnug als Prozentwert
*/
public int ergebnis() {
return (int) Math.round((quadrat.getSeite() - 2.0*ballon.getRadius())*100.0/quadrat.getSeite());
}
/**
* Zeichnet die aktuelle Figur (Quadrat, Kreis oder KQuadrat)
* @param g Grafik-Kontext
*/
public void zeigeDich(Graphics g) {
if (figur != null) {
figur.zeigeDich(g);
}
}
}