Java/Turtle-Grafik

Aus ZUM-Unterrichten

Vorlage:Babel-3 Die folgenden Beispiele basieren auf der in Java geschriebenen Turtle-Grafik-Engine von A. Hermes, die sich problemlos in BlueJ einbinden lässt.

Es fehlen zu den Aufgaben einige Beispielbilder, die ich aus Copyrightgründen nicht einfügen kann.

Elementare Methoden

TurtleUML.png
  • zumStart (x,y) - setzt die Turtle nach (x|y)
  • vor (länge) - geht um „länge“-Punkte vorwärts
  • drehe (winkel) - dreht bei positiven Zahlen rechts, bei negativen links herum.
  • schreibe (text) - schreibt einen String text an die aktuelle Position
  • hebeStift() - zeichnet nicht beim Bewegen
  • senkeStift() - zeichnet beim Bewegen
  • setzeFarbe(Turtle.rot) - Farben: .schwarz, .grün, .blau, .gelb, .rot, .grau, .hellgrau, .orange, .weiß;

Erstes Beispiel

<java> public class Figuren {

   // Eigenschaften
   Turtle t;
   // Konstruktor
   public Figuren() 
   {
      double x,y;
      t=new Turtle(); // legt eine neue Turtle mit den Namen "t" an.
      x = t.liesMaxX(); y = t.liesMaxX(); // Maximale x-und y-Werte
      t.zumStart(x/2,y/2); // Setzt die Anfangsposition auf die Mitte 
      t.setzeFarbe(Turtle.blau); // legt Farbe fest 
   }
   // Methoden
   public void zeichneQuadrat(int pLänge){
       zeichneRechtenWinkel(pLänge); 
       zeichneRechtenWinkel(pLänge);   
   }
   
   public void zeichneRechtenWinkel(int pLänge) 
   { 
       t.vor(pLänge);
       t.drehe(90);
       t.vor(pLänge);
       t.drehe(90);
   }
   // ... hier weitere Methoden einfügen

} // Ende der Klasse Figuren </java>


Übung
  • Tippen Sie die Klasse Figuren ab.
  • Ergänzen Sie die Klasse Figuren um folgende Methoden:
    • zeichneGrößerwerdendeQuadrate(...)
    • zeichneRechteck(int pLänge, int pBreite)
    • zeichneSchweizerFahne( )
    • zeichneGleichseitigesDreieck(int pLänge)
    • zeichne5Eck(int pLänge)
    • zeichneStern (...)
    • zeichneMittelquadrat(...)
    • zeichneFünfeck(...)
  • Zeichnen Sie das Haus vom Nikolaus. Denken Sie daran, dass Sie für die Berechnung der Länge der Diagonalen und des Dachs den Satz den Pythagoras benutzen können. Hinweis: Befehl für Wurzel aus x: Math.sqrt(x)
  • Lassen Sie eine Uhr mit Zeigern zeichnen: zeichneUhr(int Stunden, int Minuten)
  • Überprüfen Sie vor der Zeichnung, ob die Werte zulässig sind (Stunden 0-23, Minuten 0-59).
  • Profis: Schauen Sie sich das Klassendiagramm der Klasse TestTurtle an . Es enthält alle Methoden, die benutzt werden können. Probieren Sie Methoden aus, die Ihnen praktisch vorkommen.


Nach Einführung der for-Schleife

Zweites Beispiel: Ein Zahlenstrahl

<java>

  public void zeichneZahlenstrahl (int pErsteZahl, int pLetzteZahl) {
       for (int i=pErsteZahl; i<=pLetzteZahl; i++) {
           t.vor(20);
           t.schreibe(""+i); // Trick! Einfache Typumwandlung zu String
       }
   }

</java>


Übung
  • Analysieren Sie die Methode zum n-Eck.
  • Wie kann ich einen Kreis zeichnen?
  • Lassen Sie eine „Perlenschnur“ zeichnen. Hinweis: t.fülleKreis(double radius)
  • Lassen Sie ein „Standardkoordinatensystem“ zeichnen, das auf beiden Achsen von -5 bis 5 geht. Vergessen Sie die Achsenbeschriftung (x und y) und die Pfeilspitzen nicht.
  • Lassen Sie mit Hilfe einer Schleife Muster wie die folgenden erstellen. Klären Sie dazu auch die Frage, wie man größer werdende Quadrate zeichnen lassen kann (siehe Quadratschnecke).


Eventsteuerung

<java> import java.awt.event.*; public class Figuren extends Turtle { (...)

   public void mouseClicked(java.awt.event.MouseEvent me){
       if (me.isMetaDown()) { t.drehe(10); } // Rechte Maustaste?
       else {
           if (me.getClickCount()==2) { // Doppelklick?
              t.drehe(180); // Falls Doppelklick
           }
           else {
              t.vor(10); // Falls einfacher Mausklick
           }
       }        
   }

// Alternativ:

   public void mouseClicked(java.awt.event.MouseEvent me){
      	if (me.isMetaDown()) { // rechte Maustaste gedrückt?

t.drehe(10); }

       	else {

t.vor(10); }

   }

</java>


Übung
  • Überlegen Sie sich Varianten zu diesen Malprogrammen.
  • Realisieren Sie ein Hindernisrennen. Leider kann die Turtle nur schlecht abfragen, ob ein Hindernis gerammt wurde. Das müssen Sie selbst realisieren.


Threads

<java> Ergänzen Sie den Konstruktor von Figuren um folgende Zeilen:

   (...)
      t.zeige();// ab hier neu:
      TurtleThread turtleThread;
      turtleThread = new TurtleThread(t);
      turtleThread.start();
   }

Legen Sie eine neue Klasse TurtleThread an

public class TurtleThread extends Thread { Turtle t;

   public TurtleThread(Turtle pT)
   {
       t = pT;
   }
   public void run() {
     for(int i = 0; i < 30; i++) {
       try {
         t.vor(10);  
         sleep(1000);
       }
       catch(InterruptedException e) {        }
     }
   }

} // Ende von TurtleThread </java>


Übung
  • Realisieren Sie ein Hindernisrennspiel, bei dem der Benutzer mit der Linken Maustaste nach links und der rechten nach rechts dreht. Vorwärts geht die Turtle automatisch.



Weblink

Andere Turtlelibrarys

Siehe auch