Java/Turtle-Grafik
< Java
Die folgenden Beispiele basieren auf der in Java geschriebenen Turtle-Grafik-Engine (Download) von Alfred Hermes, die sich in BlueJ einbinden lässt (Werkzeuge > Einstellungen > Bibliotheken).
Inhaltsverzeichnis
Elementare Methoden
- 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
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
Nach Einführung der for-Schleife
Zweites Beispiel: Ein Zahlenstrahl
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
}
}
Eventsteuerung
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);
}
}
Threads
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
Perlenkette
public class Perlenkette
{
// Eigenschaften
Turtle t;
// Konstruktor
public Perlenkette()
{
t=new Turtle(); // legt eine neue Turtle mit den Namen "t" an.
}
// Methoden
public void zeichneLutscher(double pLänge, double pRadius){
t.vor(pLänge);
t.setzeFarbe(Turtle.gelb);
t.fülleKreis(pRadius);
t.setzeFarbe(Turtle.blau);
}
public void zeichnePerlenschnur(int pAnzahl)
{
t.zumStart(200,20); // Startposition oben mittig
for (int k=1; k<=pAnzahl; k++) {
t.drehe(360/(pAnzahl*2));
zeichneLutscher(30, k*2);
}
for (int k=pAnzahl-1; k>=1; k--) {
t.drehe(360/(pAnzahl*2));
zeichneLutscher(30, k*2);
}
t.drehe(360/(pAnzahl*2));
t.vor(30);
}
} // Ende der Klasse Figuren
Rudimentärer Funktionsplotter
Es folgt der Quelltext eines einfachen Funktionsplotters.
Schade ist, dass Java keinen "eval" Befehl kennt, wie er z.B. in JavaScript vorliegt. Daher muss man hier die Funktion, die angezeigt werden soll, direkt im Quelltext angeben (es sei denn, man fügt einen Mathe-Parser hinzu).
// Ein rudimentärer Funktionsplotter
public class Figuren
{
// Eigenschaften
Turtle t;
// Konstruktor
public Figuren()
{
double x,y;
t=new Turtle(); // legt eine neue Turtle mit den Namen "t" an.
t.setzeFarbe(Turtle.blau); // legt Farbe fest
t.zeige();
}
public void zeichneKoordinatensystem(){
double pLaenge=15;
t.setzeFarbe(Turtle.blau);
setzeTurtleInDieMitte();
t.vor(-10*pLaenge);
zeichneStrahl(-10,10,pLaenge);
t.vor(10*pLaenge);
t.drehe(-90);
t.vor(-10*pLaenge);
zeichneStrahl(-10,10,pLaenge);
t.drehe(90);
setzeTurtleInDieMitte();
}
public void zeichneFunktion(){
t.setzeFarbe(Turtle.rot);
double pLaenge=15;
double y;
boolean w=false;
for (double x=-10;x<=10;x=x+0.1){
y=(x*x-3);
if (!w) {
t.zumStart(x*pLaenge+t.liesMaxX()/2,-y*pLaenge+t.liesMaxX()/2);
w=true;
}
else {
t.geheNach(x*pLaenge+t.liesMaxX()/2,-y*pLaenge+t.liesMaxX()/2);
}
}
}
public void setzeTurtleInDieMitte(){
double x,y;
x = t.liesMaxX(); y = t.liesMaxX(); // Maximale x-und y-Werte
t.zumStart(x/2,y/2); // Setzt die Anfangsposition auf die Mitte
}
private void zeichneStrahl(int pSkalenMin, int pSkalenMax, double pLaenge){
t.schreibe(""+pSkalenMin);
for (int i=pSkalenMin+1; i<=pSkalenMax; i++){
t.vor(pLaenge);
t.schreibe(""+i);
}
t.vor(pLaenge);
zeichnePfeil(20);
t.vor(-pLaenge*(pSkalenMax-pSkalenMin+1));
}
private void zeichnePfeil(double pLaenge){
t.drehe(-90);
t.vor(pLaenge/2);
t.drehe(120);
t.vor(pLaenge);
t.drehe(120);
t.vor(pLaenge);
t.drehe(120);
t.vor(pLaenge/2);
t.drehe(90);
}
} // Ende der Klasse Figuren
Verfolgende Schildkröten
Eine Turtle verfolgt eine andere auf kürzestem Weg.
public class Zufallsturtle
{
// Eigenschaften
private Turtle t,q;
private int qx, qy;
// Konstruktor
public Zufallsturtle()
{
t=new Turtle(); // legt eine neue Turtle mit den Namen "t" an.
t.zeige();
t.setzeFarbe(4);
q=new Turtle(); // legt eine neue Turtle mit den Namen "q" an.
q.zeige(); // zufällige Startposition
}
// Methoden
public void starte(){
boolean ende=false;
qy=gibZufallszahl(400);
qy=gibZufallszahl(400);
q.zumStart(qx,qy);
while (!ende) {
laufeZufaellig(2, 2, 50);
verfolge(1);
if (qx==(int) t.liesX()){
if (qy==(int) t.liesY()){
ende=true;
}
}
}
t.schreibe("Gefangen");
}
public void laufeZufaellig(int pSchrittweite, int pSchrittzahl, int pPause)
{
int zufallszahl;
for (int k=1;k<=pSchrittzahl;k++) {
zufallszahl=gibZufallszahl(3);
if (zufallszahl==1) {
t.vor(pSchrittweite);
}
else {
if (zufallszahl==2) {
t.drehe(10);
}
else {
t.drehe(-5);
}
}
t.ruhe(pPause);
}
}
public void verfolge(int pSchrittweite)
{
int tx = (int) t.liesX();
int ty = (int) t.liesY();
if (qx<tx) {
qx+=pSchrittweite;
}
else {
qx-=pSchrittweite;
}
if (qy<ty) {
qy+=pSchrittweite;
}
else {
qy-=pSchrittweite;
}
q.zumStart(qx,qy);
}
// gibt eine Zufallszahl zwischen 1 und pMaximum zurück
public int gibZufallszahl(int pMaximum) {
return (int) ((Math.random()*pMaximum)+1);
}
} // Ende von Zufallsturtle
Uhr
public class Uhr
{
private int minute;
private int stunde;
private Turtle t;
public Uhr(int pStunde, int pMinute)
{
if (stunde==0) {
stunde=12;
}
minute=pMinute;
stunde=pStunde;
t=new Turtle();
t.drehe(-90);
t.zeige();
}
public void laufe15Sekunden(){
for (int k=1;k<=15;k++){
zeichneUhr(100,8);
stelleWeiter();
zeichneUhr(100,0);
t.ruhe(1000);
}
}
public void stelleWeiter()
{
minute++;
if (minute>59) {
minute=0;
stunde++;
if (stunde>12) {
stunde=1;
}
}
}
public void zeichneUhr(double pZeigerlaenge, int pFarbe){
t.setzeFarbe(pFarbe);
t.drehe(minute*360/60);
t.vor(pZeigerlaenge);
t.vor(-pZeigerlaenge);
t.drehe(-minute*360/60);
t.drehe(stunde*360/12);
t.vor(pZeigerlaenge*0.8);
t.vor(-pZeigerlaenge*0.8);
t.drehe(-stunde*360/12);
}
public int gibVergangeneMinutenSeitMitternacht() {
int zwischenspeicher;
zwischenspeicher = minute + stunde * 60;
return zwischenspeicher;
}
}
Weblinks
- Andere Turtlelibraries
- Einstieg in Java mit Turtle.java Hier wird eine Unterrichtssequenz zur Graphikprogrammierung mit einer Turtle in Java dokumentiert.