Die Turtle-Grafik im Anfangsunterricht/Eine Turtle zeichnet

Aus ProgrammingWiki

Wiki-Quelltext dieser Seite.

<language>Scheme</language>
== Wie zeichnet eine Turtle? ==

Wir stellen uns vor: Eine kleine Schildkröte (engl. turtle) besitzt am Bauch einen Zeichenstift und gehorcht aufs Wort!<br />
Diese Schildkröte kann sich auf einer Spielwiese tummeln, die wir als Zeichenfläche (engl. canvas) bezeichnen.

<canvas w="400" h="300"></canvas>

<code id="4e99be85392f4" hidden>
(define center
  (lambda (turtle)
    (move turtle 200 150)))

(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 (turtle)
    (pencolor turtle 0 255 0)))

(define blue
  (lambda (turtle)
    (pencolor turtle 0 0 255)))

(define pink
  (lambda (turtle)
    (pencolor turtle 200 50 200)))
</code>

Da es mehrere "schlaue" Schildkröten und mehrere Spielwiesen gibt, geben wir jeder Schildkröte und jeder Spielwiese eine Nummer.<br />
Nun setzen wir die Schildkröte mit der Nummer 1 auf die erste Spielwiese:

<run id="4e99be8539602">
(clear canvas1)
(center turtle1)
</run>

Damit können wir der ersten Turtle einfache Zeichenbefehle in kurzen "Schildkröten-Sätzen" erteilen. Diese Sätze beginnen stets mit einer runden öffnenden Klammer und enden stets mit einer runden schließenden Klammer.

<code id="4e99be85393b7" hidden>(center turtle1)</code>

<run id="4e99be8539683">
(forward turtle1 100)
</run>
<!-- Hier findest du eine [[Übersicht über alle Turtle-Befehle]]. -->
=== Aufgaben ===

<ol>
<li>Zeichne mit der Turtle ein Quadrat.</li>
<li>Zeichne mit der Turtle ein Rechteck, dessen längere Seiten genau doppelt so lang sind wie seine kürzeren Seiten.</li>
</ol>

== Die Turtle baut ein Haus ==

Selbst die schönste Spielwiese schützt nicht vor Regenwetter! Die Turtle mit der Nummer 2 hat das erkannt und möchte auf ihrer Spielwiese ein Haus bauen. Baupläne für kostengünstige Häuser hat sie bereits im Internet gefunden.

<table border="0" cellspacing="0" cellpadding="2" width="600">
<tr>
<td rowspan="2" valign="top">
<canvas w="400" h="400"></canvas>
</td>
<td align="center" valign="top">
[[Bild:Haus1.GIF]]<br />
Bauplan: Turtle-Haus
</td>
</tr>
<tr>
<td align="center" valign="top">
[[Bild:Nikolaus1.GIF]]<br />
Bauplan: Nikolaus-Haus
</td>
</tr>
</table>

Hilf der Turtle 2 beim Hausbau!

<code id="4e99be8539466" 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 (turtle)
    (pencolor turtle 0 255 0)))

(define blue
  (lambda (turtle)
    (pencolor turtle 0 0 255)))

(define pink
  (lambda (turtle)
    (pencolor turtle 200 50 200)))

(define haus
  (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 45)
    (forward turtle s)
    (right turtle 90)
    (forward turtle s)
    (right turtle 90)))

(define nikolaushaus
  (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>

<run id="4e99be85396fa">
(clear canvas2)
(center turtle2)
(forward turtle2 100)
</run>

=== Aufgaben ===

<ol>
<li>
Zeichne mit der Turtle nun das Nikolaus-Haus in einem Zug. Benutze dabei für das Dach eine andere Farbe.<br />
'''Hinweise:'''
* Zeichne zuerst auf einem Blatt Papier ein Nikolaus-Haus in einem Zug.
* Überlege Dir genau, wie sich die Turtle beim Zeichnen bewegen muss. 
* Denke daran: Die Diagonalen sind doppelt so lang wie die Dachkanten.
</li>
</ol>

== Die Turtle zeichnet regelmäßige Vielecke ==

Du hast bereits mit der Turtle ein Quadrat gezeichnet. Ein Quadrat ist ein regelmäßiges Viereck.<br />
Die dritte Turtle hat in der Schildkrötenschule besonders gut aufgepasst. Sie hat gelernt, wie man regelmäßige Vielecke auf die Spielwiese zeichnet. Probiere es aus.

<canvas w="400" h="400"></canvas>

<code id="4e99be85394e5">
(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 (turtle)
    (pencolor turtle 0 255 0)))

(define blue
  (lambda (turtle)
    (pencolor turtle 0 0 255)))

(define pink
  (lambda (turtle)
    (pencolor turtle 200 50 200)))

(define vieleck
  (lambda (turtle s n)
    (letrec
        ([winkel (/ 360 n)]
         [help-vieleck
          (lambda (alpha)
            (if (>= alpha 360)
                #t
                (begin
                  (forward turtle s)
                  (right turtle winkel)
                  (help-vieleck (+ alpha winkel)))))])
      (help-vieleck 0))))
</code>

<run id="4e99be8539779">
(clear canvas3)
(center turtle3)
(vieleck turtle3 100 5)
</run>

Hast Du es bemerkt?
* Die erste Zahl entspricht der Seitenlänge des Vielecks.
* Die zweite Zahl gibt die Anzahl der Ecken an.

=== Aufgaben ===

<ol>
<li>Zeichne ein regelmäßiges 12-Eck. Achte darauf, dass es auf die Spielwiese passt!</li>
<li>Kannst Du mit der Turtle einen Kreis zeichnen?</li>
</ol>

== Die Turtle zeichnet Sterne ==

Die vierte Turtle ist eine wahre Künstlerin! Sie kann Sterne zeichnen, die sie meist zur Weihnachtszeit verschenkt.
Du wirst staunen!

<canvas w="400" h="400"></canvas>

<code id="4e99be853954d">
(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 (turtle)
    (pencolor turtle 0 255 0)))

(define blue
  (lambda (turtle)
    (pencolor turtle 0 0 255)))

(define pink
  (lambda (turtle)
    (pencolor turtle 200 50 200)))

(define vieleck
  (lambda (turtle s n)
    (letrec
        ([winkel (/ 360 n)]
         [help-vieleck
          (lambda (alpha)
            (if (>= alpha 360)
                #t
                (begin
                  (forward turtle s)
                  (right turtle winkel)
                  (help-vieleck (+ alpha winkel)))))])
      (help-vieleck 0))))

(define stern
  (lambda (turtle s n)
    (letrec
        ([winkel (/ 360 n)]
         [help-stern
          (lambda (alpha)
            (if (>= alpha 360)
                #t
                (begin
                  (vieleck turtle s 4)
                  (right turtle winkel)
                  (help-stern (+ alpha winkel)))))])
      (help-stern 0))))

(define n-stern
  (lambda (turtle s n m)
    (letrec
        ([winkel (/ 360 n)]
         [help-stern
          (lambda (alpha)
            (if (>= alpha 360)
                #t
                (begin
                  (vieleck turtle s m)
                  (right turtle winkel)
                  (help-stern (+ alpha winkel)))))])
      (help-stern 0))))

(define n-tes
  (lambda (n ls)
    (list-ref ls (modulo n (length ls)))))

(define farbstern
  (lambda (turtle s n ls)
    (letrec
        ([laenge (length ls)]
         [winkel (/ 360 n)]
         [help-stern
          (lambda (alpha count)
            (if (>= alpha 360)
                #t
                (begin
                  (eval (cons (n-tes (quotient count (round (/ n laenge))) ls) (list turtle))) 
                  (vieleck turtle s 4)
                  (right turtle winkel)
                  (help-stern (+ alpha winkel) (+ 1 count)))))])
      (help-stern 0 1))))
</code>

<run id="4e99be85397f2">
(clear canvas4)
(center turtle4)
(stern turtle4 100 10)
</run>

Du hast die "Zeichenstrategie" der Turtle sicher durchschaut: Sie zeichnet ein Quadrat und dreht sich anschließend ein kleines Stück nach rechts. Das wiederholt sie so oft, bis der Stern komplett ist.

=== Aufgaben ===

<ol>
<li>Zeichne farbige Sterne.</li>
<li>Ändere neben der Farbe auch die Anzahl der Quadrate, die für einen vollständigen Stern notwendig sind.</li>
<li>Zeichne ''mehrfarbige'' Sterne, z.B.:
<pre>(farbstern turtle4 100 100 '(red orange yellow green blue pink))</pre>
</li>
</ol>