Scheme Turtle

aus ZUM-Wiki, dem Wiki für Lehr- und Lerninhalte auf ZUM.de
Wechseln zu: Navigation, Suche

<language>Scheme</language>

Inhaltsverzeichnis

Turtle Geometrie

Die Turtle Geometrie ist aus der Programmiersprache LOGO sehr gut bekannt. Es handelt sich um eine koordinatenfreie Geometrie. Die Idee besteht darin, einen kleinen Zeichenroboter, dargestellt als Schildkröte (Turtle genannt), mit bestimmten Befehlen zu steuern. Da die Turtle am Bauch einen Stift besitzt, kann sie bei ihren Bewegungen eine Spur hinterlassen. Das Schildkrötensymbol lässt die jeweils aktuelle Blickrichtung der Turtle erkennen. Die Vorwärts/Rückwärts-Bewegungen finden in dieser Blickrichtung statt. Diese kann durch Rechts/Links-Drehungen der Turtle verändert werden.

Zeichenfläche

Als erstes benötigen wir eine "Spielwiese", auf der sich unsere Turtle tummeln kann. Das folgende Rechteck zeigt dieses Areal, das auch als Zeichenfläche (Canvas, auch Leinwand) bezeichnet wird.

Die folgende Zeichenfläche zeigt die Canvas-Standardgröße.

<canvas></canvas>

Auf diese Zeichenfläche setzen wir nun eine Turtle. <eval id="4b40587e614de"> (clear canvas) (home turtle) </eval>

Der Befehl home setzt die Turtle etwa in die Mitte der Zeichenfläche. Wenn uns die aktuelle Turtle-Position nicht gefällt, bewegen wir die Turtle auf einen anderen Platz.

Turtle-Bewegungen

(home turtle) <eval id="4b40587e61cad"> (forward turtle 50) </eval>

lässt die Turtle 50 Schritte vorwärts laufen. Analog gilt dies auch für backward (rückwärts). Soll keine Spur gezeichnet werden, kann die Turtle den Stift anheben (und später wieder absenken).

(clear canvas)(home turtle) <eval id="4b40587e624ad"> (forward turtle 20) (penup turtle) (forward turtle 20) (pendown turtle) (forward turtle 30) </eval>

Da die Zeichenfläche nun den sichtbaren Bereich dieser Seite verlässt, brauchen wir entweder eine neue Wiki-Seite oder auf dieser hier eine neue Zeichenfläche.

Wir platzieren hier eine weitere Canvas. Da es sich um die zweite Zeichenfläche auf dieser Seite handelt, wird sie mit canvas2 angesprochen. Die zugehörige Turtle heißt turtle2. Möchten wir die obere (erste) Turtle ansprechen, so geschieht dies mittels turtle1 bzw. canvas1, auch ohne der angefügten 1, wie oben praktiziert.

<canvas></canvas>

Auf canvas2 sitzt also turtle2. Allgemein sitzt auf canvas_n die Turtle turtle_n. Je Zeichenfläche gibt es genau eine Turtle. Der größte Wert für n ist 5.

In folgendem Beispiel kommen Drehbewegungen (um einen bestimmten Winkel) und Vorgaben für Linienstärken und deren Farbe hinzu.

<eval id="4b40587e63056"> (clear canvas2) (home turtle2) (penwidth turtle2 5) (pencolor turtle2 255 0 0) (forward turtle2 50) (right turtle2 90) (pencolor turtle2 255 255 0) (forward turtle2 50) (right turtle2 90) (pencolor turtle2 0 255 0) (forward turtle2 50) (right turtle2 90) (pencolor turtle2 0 0 255) (forward turtle2 50) (hide turtle2) </eval>

Am Arbeitsende wird die Turtle mittels hide versteckt. Mit show kann sie wieder sichtbar gemacht werden.

Die folgenden Prozeduren für Turtles sind typische Lehrbeispiele für Rekursion. Je nach Bedarf werden weitere eingebaute Sprachelemente der Scheme-Turtle-Geometrie eingeführt.

Klassischer Binärbaum mit jeweils halbierter Astlänge

Ein Baum mit Stammlänge side ist ein Gebilde, das aus einem Stamm der Länge side besteht, an dessen Ende links im Winkel von 45 Grad ein Baum der halben Stammlänge, also side/2, anschließt, und an dessen Ende rechts im Winkel von -45 Grad ein Baum der halben Stammlänge, also side/2, anschließt. Ist die Stammlänge kleiner als z.B. 20, also side < 20, dann besteht der Baum aus nichts.

Die jeweils ansetzenden Teilbäume haben gerade die halbe Stammlänge gegenüber ihren Vorgängern. Die Stämme benachbarter Binärbäume bilden einen Winkel von 90 Grad. Außerdem wird die Aststärke der Rekursionstiefe angepasst wird. Wenn eine Stammlänge von 20 Einheiten unterschritten wird, endet die Baum-Verzweigung.

<canvas width=500 height=300></canvas>

(define tree

(lambda(side turtle) 
 (cond 
   ((< side 2) #t)
   (else  
     (penwidth turtle (+ (/ side 10) 1 ))    
     (forward turtle side)  
     (left turtle 45)  
     (tree (/ side 2) turtle) 
     (right turtle 90)  
     (tree (/ side 2) turtle)
     (left turtle 45)  
     (backward turtle side)))))

<eval id="4b4062e1c4f96"> (clear canvas3) (move turtle3 200 190) (tree 100 turtle3) </eval>

Befehlsliste

Die folgende Tabelle enthält alle Befehle, die eine Turtle versteht.
Befehl Beschreibung
home setzt die Turtle auf die Mitte der Zeichenfläche
move turtle x y setzt die Turtle auf den Punkt (x,y) der Zeichenfläche (Koordinatenursprung: linke obere Ecke)
forward turtle x lässt die Turtle x Schritte nach vorn gehen
backward turtle x lässt die Turtle x Schritte nach hinten gehen
pendown turtle setzt den stift ab, sodass Turtle-Bewegungen eine Spur hinterlassen (Standard)
penup turtle nimmt den stift hoch, sodass Turtle-Bewegungen keine Spur hinterlassen
penwidth turtle x Setzt die Stärke des Stiftes auf x
pencolor turtle r g b setzt die Farbe des Stiftes (Rot-Gelb-Grün-Werte im Bereich 0-255)
right turtle x dreht die Turtle um x Grad nach rechts
left turtle x dreht die Turtle um x Grad nach links
hide turtle blendet die Turtle aus
show turtle blendet die Turtle ein
clone turtle clont die Turtle in der Aktuellen Position
panerase turtle Die Turtle löscht die Markierungen, denen sie begegnet (wie ein Radiergummi).
clear canvas löscht die Zeichenfläche