Die Turtle-Grafik im Anfangsunterricht/Eine Turtle lernt
Aus ProgrammingWiki
Wiki-Quelltext dieser Seite.
<language>Scheme</language>
Bisher mussten Zeichenbefehle in einzelnen "Turtle-Sätzen" erteilt werden. Das war oft mühselig.<br />
Wir wollen nun erfahren, wie eine Turtle die Befehle zum Zeichnen einer beliebigen Figur lernen kann.<br /><br />
== Wie lernt eine Turtle? ==
Die ersten beiden Turtles sollen lernen, wie ein Quadrat auf ihre Spielwiese gezeichnet wird.<br />
Sie gehen dabei unterschiedlich vor:
<code id="4e9ebddb8843b" hidden>
(define center
(lambda (turtle)
(move turtle 200 200)))
(define black
(lambda (turtle)
(pencolor turtle 0 0 0)))
(define red
(lambda (turtle)
(pencolor turtle 255 0 0)))
(define brown
(lambda (turtle)
(pencolor turtle 100 50 0)))
(define orange
(lambda (turtle)
(pencolor turtle 255 100 0)))
(define yellow
(lambda (turtle)
(pencolor turtle 255 200 0)))
(define green
(lambda (canvas)
(pencolor turtle 0 255 0)))
(define blue
(lambda (turtle)
(pencolor turtle 0 0 255)))
(define pink
(lambda (turtle)
(pencolor turtle 200 50 200)))
</code>
<table border="0" cellspacing="0" cellpadding="2">
<tr valign="top">
<td>
<code id="4e9ec129ec41e">
(clear canvas1)
(define quadrat1
(begin
(center turtle1)
(forward turtle1 100)
(right turtle1 90)
(forward turtle1 100)
(right turtle1 90)
(forward turtle1 100)
(right turtle1 90)
(forward turtle1 100)
(right turtle1 90)))
</code>
<canvas w="400" h="400"></canvas>
<run id="4e9ec129ec6b0">quadrat1</run>
</td>
<td>
<code id="4e9ec129ec4b6">
(clear canvas2)
(define quadrat2
(lambda (turtle s)
(center turtle)
(forward turtle s)
(right turtle 90)
(forward turtle s)
(right turtle 90)
(forward turtle s)
(right turtle 90)
(forward turtle s)
(right turtle 90)))
</code>
<canvas w="400" h="400"></canvas>
<run id="4e9ec129ec73d">(quadrat2 turtle2 100)</run>
</td>
</tr>
</table>
Die Turtles haben gelernt, was bei den Zeichenbefehlen <tt>quadrat1</tt> bzw. <tt>(quadrat2 turtle2 100)</tt> zu tun ist.<br />
Nenne Gemeinsamkeiten und Unterschiede, die zwischen den beiden Lernmethoden bestehen.
=== Zusammenfassung ===
<ul>
<li>
Die Turtle lernt mit der Anweisung
<pre>(define <name> ...)</pre>
Dabei wird ein aussagekräftiger Name (hier: <tt><name></tt>) an eine Folge von Turtle-Anweisungen gebunden.
</li>
<li>
Mit
<pre>(begin ...)</pre>
können mehrere Turtle-Sätze zu einem "Turtle-Text" zusammengefasst werden.
</li>
<li>
Mit der Sonderform
<pre>(lambda (<Platzhalter1> <Platzhalter2> ...) ...)</pre>
können ebenfalls mehrere Turtle-Anweisungen zusammengefasst werden. Zusätzlich kann man über die Platzhalter die Turtle-Anweisungen beeinflussen.<br />
Turtle-Texte, die mit dieser Sonderform gebildet werden, heißen ''Prozeduren''.
</li>
<li>
Achte darauf, dass stets auf jede geöffnete Klammer eine schließende Klammer folgen muss.
</li>
</ul>
== Die Turtle lernt, das Nikolaus-Haus in einem Zug zu zeichnen ==
=== Die Turtle zeichnet ein Nikolaus-Haus mit fester Größe ===
Die dritte Turtle möchte lernen, wie ein Nikolaus-Haus in einem Zug gezeichnet wird.<br />
Du sollst ihr Lehrer sein. Lerne ihr das Zeichnen des Nikolaus-Hauses nach dem Vorbild von <tt>quadrat1</tt>.<br />
Natürlich kannst Du dazu wieder alle erforderlichen [[Die Turtle-Grafik im Anfangsunterricht/Übersicht über alle Turtle-Befehle|Turtle-Befehle]] nachlesen.
<table border="0" cellspacing="0" cellpadding="2" width="600">
<tr>
<td valign="top">
<canvas w="400" h="400"></canvas>
</td>
<td align="center" valign="top">
[[Bild:Nikolaus1.GIF]]<br />
Planfigur: Nikolaus-Haus mit fester Größe
</td>
</tr>
</table>
<code id="4e9ec129ec54b">
(clear canvas3)
(define nikolaushaus1
...)
</code>
<run id="4e9ec129ec7c9">
nikolaushaus1
</run>
==== Aufgaben ====
<ol>
<li>Ändere die Definition so ab, dass das Dach des Nikolaus-Hauses in einer anderen Farbe gezeichnet wird.</li>
<li>Welche Zahlenwerte müssten wie geändert werden, damit das Nikolaus-Haus in doppelter Größe gezeichnet wird?</li>
</ol>
=== Die Turtle zeichnet ein Nikolaus-Haus mit veränderlicher Größe ===
==== Die Turtle rechnet ====
Um ein Nikolaus-Haus in veränderlicher Größe zu zeichnen, muss die Turtle die Längen der Dachkanten und Diagonalen ''berechnen'' können. Wie rechnen eigentlich Turtles?<br />
Wir untersuchen die Grundrechenarten:
<table border="0" cellspacing="0" cellpadding="2">
<tr>
<td>
<run id="4e9b2f806e98f">(+ 3 5)</run>
</td>
<td>
<run id="4e9b2f806ea50">(- 12.5 3.4)</run>
</td>
<td>
<run id="4e9b2f806ead9">(* 0.71 100)</run>
</td>
<td>
<run id="4e9b2f806eb5e">(/ 123 3)</run>
</td>
</tr>
</table>
Bei Berechnungen können auch ''Variablen'' benutzt werden.<br />
Dazu muss die Turtle den ''Wert'' einer Variablen kennen:
<code id="4e9b2f806e601">
(define s 100)
</code>
<run id="4e9b2f806ebe4">
(* 0.71 s)
</run>
'''Wir fassen zusammen:'''
* Turtles führen Berechnungen in Turtle-Sätzen durch.
* Dabei steht das Operationszeichen (''Operator'') stets an erster Stelle.
* Als Dezimalzeichen muss immer ein Punkt gesetzt werden.
* Berechnungen können auch mit Variablen durchgeführt werden.
==== Die Turtle zeichnet ====
Nun kann die vierte Turtle das Nikolaus-Haus in veränderlicher Größe zeichnen.<br />
Hilf ihr dabei. Orientiere Dich dazu an der nebenstehenden Planfigur.
<table border="0" cellspacing="0" cellpadding="2" width="600">
<tr>
<td valign="top">
<canvas w="400" h="400"></canvas>
</td>
<td align="center" valign="top">
[[Bild:Nikolaus2.GIF]]<br />
Planfigur: Nikolaus-Haus mit veränderlicher Größe
</td>
</tr>
</table>
<code id="4e9eaafedc0be" hidden>
(define nikolaushaus2-lsg
(lambda (turtle s)
(center turtle)
(penup turtle)
(backward turtle (/ s 2))
(left turtle 90)
(forward turtle (/ s 2))
(right turtle 90)
(pendown turtle)
(forward turtle s)
(right turtle 45)
(red turtle)
(forward turtle (/ s (sqrt 2)))
(right turtle 90)
(forward turtle (/ s (sqrt 2)))
(black turtle)
(right turtle 135)
(forward turtle s)
(left turtle 135)
(forward turtle (* s (sqrt 2)))
(right turtle 135)
(forward turtle s)
(right turtle 135)
(forward turtle (* s (sqrt 2)))
(right turtle 135)
(forward turtle s)))
</code>
<code id="4e9ec129ec5e0">
(clear canvas4)
(define nikolaushaus2
(lambda (turtle s)
...))
</code>
<run id="4e9ec129ec867">
(nikolaushaus2 turtle4 100)
</run>
==== Aufgaben ====
<ol>
<li>Ändere die Definition so ab, dass gesamte Nikolaus-Haus mehrfarbig gezeichnet wird.</li>
<li>Kannst du das Nikolaus-Haus genau in der Mitte der Spielwiese zeichnen lassen?</li>
</ol>