lehrkraefte:snr:informatik:glf22:python:turtle

Achtung

Don't name your turtle program “turtle.py”!

If there is any file in your python folder with this name, rename or delete it!1)

Falls es wirklich nicht in Visual Studio Code klappen sollte, hier sind etwas weniger komfortable Alternativen:

  • Programm ausführen wie am Anfang dieses Kurses erklärt (wohl drei Alternativen: Aus Kommandozeile (cmd), per Anklicken im Explorer (= Dateimanager), aus python-Shell.
  • gesamtes Programm in die Python-Shell kopieren (Ctrl+a und Ctrl+c in VSCode, danach Ctrl+v in Python-Shell). Achtung bei Einrückungen (Schleifen, if-statements, Funktionen): Nach dem eingerückten Code muss eine Leerzeile stehen.
  • Über ein Online-Tool, etwa

Wer ein anderes brauchbares Online-Tool findet, teile mir dies bitte mit, damit ich es in die obige Liste aufnehme.

Turtle-Grafik

Turtle-Grafik meint, dass man mit einer “Turtle” (alias Schildkröte), die über den Bildschirm “läuft”, eine Zeichnung anfertigt. Man kann dieser Turtle Befehle wie “Gehe 100 Pixel vorwärts!” oder “Drehe dich um 30 Grad nach rechts!” geben. Die Turtle zeichnet mit einem Stift, den sie aber auf Befehl anhebt bzw. absenkt.

(1) Das folgende Programm vermittelt dir die wichtigsten Turtle-Befehle. Lass es laufen und verstehe, was welcher Befehl bewirkt!

from turtle import *   # Importiert die Turtle-Befehle
 
speed(1)               # Optionaler Befehl, setzt die Geschwindigkeit der Turtle.
                       # Slowest animated speed ist 1; fastest animated speed is 10; 
                       # even faster is speed 0, but then the turtle "jumps" instead of moving smoothly.  
 
shape("turtle")        # Optionaler Befehl, sorgt dafür, dass das zeichnende Gebilde 
                       # wie eine Schildkröte aussieht. Alternativen sind "arrow",
                       # "circle", "square", "triangle", "classic".
a = 100
 
forward(a)
left(60)
forward(a)
right(120)
forward(a)
left(60)
penup()
backward(0.5 * a)
pendown()
left(90)
pencolor("yellow")
pensize(10)
left(60)
forward(a)
right(120)
forward(a)
left(60)
forward(a)
 
exitonclick()    # Sorgt dafür, dass das Zeichenfenster nicht sofort nach dem Zeichnen geschlossen wird,
                 # sondern erst nach Klick an beliebiger Stelle auf das Zeichenfenster.

(2) Ändere das obige Programm so, dass das Haus des Nikolaus mit Grundseite der Länge a gezeichnet wird (ohne Abzusetzen soll jede Linie nur einmal gezeichnet werden). Eventuell ist es einfacher, sich erst auf einem Blatt Papier die nötigen Befehle zu überlegen und dann ein neues Programm zu schreiben.

Wenn man den Wert der Variablen a im Programm verändert, muss sich die Grösse der Zeichnung entsprechend ändern!

Das Dach soll rot gezeichnet werden, der Rest in einer anderen Farbe deiner Wahl, die Stiftdicke ist 10. Das Haus soll horizontal zentriert im Zeichenfenster erscheinen.

Hinweis: Wie man Wurzel zwei in Python eingibt.

Hinweis: Wie man Wurzel zwei in Python eingibt.

Für eine genaue Zeichnung benötigst du $\sqrt{2}=2^{0.5}$, was du in Python per 2**0.5 erhältst.

Verstehe das folgende Programm und schreibe dann ein neues Programm, das ein rot ausgefülltes Herz mit gelbem Rand der Dicke 10 zeichnet. Überlege dir zuerst auf einem Blatt Papier, wie du das Herz zeichnen willst.

from turtle import *
speed(1)           # Slowest animated speed ist 1; fastest animated speed is 10; even faster is speed 0, but the turtle jumps.  
shape("turtle")     
 
setheading(45)     # Dreht die Turtle so, dass sie in Richtung 45 Grad schaut. (Null Grad ist horizontal nach rechts, 90 Grad vertikal nach oben.)
 
pencolor("blue")
fillcolor("green")
 
begin_fill()       # Siehe Erklärung zu end_fill() unten.
forward(100)
circle(50, 90)     # Zeichnet "linksherum" einen Kreis mit Radius 50 (mit Mittelpunkt 50 links der Turtle). Nur 90 Grad des Kreises werden gezeichnet. 
forward(100)
left(90)
forward(200)
circle(50, 180)
circle(-50, 90)    # Da der Radius hier negativ ist, wird der Kreis "rechtsherum" gezeichnet.
end_fill()         # Füllt die ab dem Befehl begin_fill() gezeichnete Form.
 
exitonclick()

(Benötigt for- oder while-Schleife - das im Hinweis Erklärte sollte ausreichen.)

Ergänze das folgende Programm so, dass ein n-Eck der Seitenlänge a gezeichnet wird.

Teste dein Programm, indem du die Werte von n und a änderst.

Hinweis

Hinweis

Du musst eine Schleife verwenden. Eigentlich genügt es, das folgende zu wissen: Das folgende Code-Block sorgt dafür, dass …

for i in range(n):
    # ... aller Code, 
    # der wie dieser Kommentar 
    # um 4 Leerschläge 
    # eingerückt ist,
    # n Mal ausgeführt wird.

Wenn das nicht ausreicht:

Wenn das nicht ausreicht:

Schau dir den Anfang der Seite for-loops (for-Schleifen) an!

Hinweis zum Drehwinkel nach jeder Vorwärtsbewegung

Hinweis zum Drehwinkel nach jeder Vorwärtsbewegung

Um welchen Winkel hat sich die Turtle insgesamt gedreht, wenn sie das gesamte $n$-Eck gezeichnet hat und wie am Anfang ausgerichtet dasteht?

Antwort

Antwort

Einmal um die eigene Achse, also um $360^\circ$. Da sie sich $n$-mal um denselben Winkel gedreht hat, dreht sie sich nach

jeder Vorwärtsbewegung um …

jeder Vorwärtsbewegung um …

$\frac{360^\circ}n$

from turtle import *
n = 7
a = 100

(Benötigt for- oder while-Schleife - eventuell ist das Slalomtext-Programm nützlich.)

Schreibe ein Python-Programm, das eine “quadratische Spirale” mit der Turtel zeichnet: Die kleinste Seite soll a lang sein, die Seitenlänge soll jeweils um veraenderung wachsen und es sollen n Strecken gezeichnet werden.

Beispielsweise soll für a = 30, veraenderung = 10 und n = 20 die folgende Zeichnung entstehen.

Kannst du am Ende die Gesamtlänge der gezeichneten Spirale ausgeben? (im normalen Terminal per print(…).)

Zusatz: Ändere dein Programm so, dass die folgenden Bilder gezeichnet werden (“Sechseck-Spirale” und “leicht verdrehte” Version davon).

Es folgen 5 von der Idee her jeweils gute, aber leider syntaktisch fehlerhafte Programme zum Zeichnen der Spirale wie oben gefordert (dreimal mit for-Schleife, zweimal mit while-Schleife). Korrigiere diese Programme “im Sinne des Autors” und löse gegebenenfalls die Zusatzaufgaben!

  1. spirale-mit-for-fehlerhaft-1.py (gut wäre auch eine andere Dateinamenserweiterung …)

Bonus-Material

Such dir aus den folgenden Aufgaben heraus, was dir gefällt!

Male eine nette Zeichnung deiner Wahl mit der Turtle!

(Nächstes Mal besser: Zwei Parameter, $n$ für ein $n$-Eck, auf dessen Ecken die Zacken liegen, und $m$ gibt an, wie viele Ecken man jeweils weiter geht. Drehwinkel ist $\frac{m \cdot 360^\circ}n$. (Lass einen Schüler dies für $n=5$ und $m=2$ ablaufen, andere zählen, um wieviel Grad er sich insgesamt gedreht hat.)

Zeichne einen Stern mit n Ecken, wobei $n$ eine ungerade2) Zahl ist. Für n = 11 soll die Ausgabe wie folgt aussehen (die Füllung wird auf meinem Rechner “automatisch” so wie im Bild, auf anderen Rechnern wird einfach der gesamte Stern gefüllt).

Hinweis: Der Innenwinkel an jedem Zacken des Sterns beträgt …

Hinweis: Der Innenwinkel an jedem Zacken des Sterns beträgt …

$\frac{180^\circ}{n}$.

Die Turtle bewegt sich in einem Koordinatensystem (auch wenn wir das bisher nicht benutzt haben). Beispielsweise kann man sie mit dem Befehl goto(-100, 200) an die Position $(-100, 200)$ bewegen.

Finde die maximalen und minimalen $x$- und $y$-Koordinaten heraus, die im Standardzeichenfenster sichtbar sind (du kannst beispielsweise ein möglichst grosses sichtbares Rechteck zeichnen).

  • Schreibe deinen Namen mit der Turtle! Schreibe eine Nutzereingabe (Text oder Zahl) per Turtle graphisch auf den Bildschirm.
  • Zeichne die sogenannte Wurzelschnecke (hilfreich: per x, y = position() bekommt man die aktuellen Koordinaten der Turtle; per setpos(x,y) bewegt man die Turtle auf den Punkt $(x,y)$).
  • Wer die Grösse des Zeichenbereichs kennt: Male grosses Rechteck und lass die Turtle darin wie einen Gummiball herum“bouncen” (Reflexion an den Rändern). (Verwendet weitere Kontrollstruktur! Welche?) Benötigt Befehle zum Abfragen der aktuellen Position und Richtung (oder man führt genau Buch).
  • (braucht wohl Funktionen, da Aufruf per onkey) Tastatursteuerung der Turtle (eine Art Malprogramm, Ändern von Dicke per “t” (alias thickness) bzw. Farbe per “c” (alias color), eventuell (Turtlebefehl) textinput(…) verwenden.

Weitere Befehle (etwa hideturtle(), showturtle(), write(…)) werden in der offiziellen Dokumentation der Turtle-Bibliothek erklärt: https://docs.python.org/3/library/turtle.html#turtle.filling

Welche Farbenwörter man verwenden darf, findet man hier: https://www.tcl.tk/man/tcl8.4/TkCmd/colors.html

Bemerkung für diejenigen, die sich noch an die Kreiswinkelsätze in der Mathematik erinnen

Bemerkung für diejenigen, die sich noch an die Kreiswinkelsätze in der Mathematik erinnen

Den Drehwinkel beim $n$-zackigen Sterns bekommt man sofort per Zentriwinkelsatz heraus, denn der Zentriwinkel über jeder Seite des $n$-Ecks ist $\frac{360^\circ}{n}$.

Beim $n$-Eck ist die im Hinweis gegebene Erklärung für den Drehwinkel meiner Meinung nach die beste. Alternativ geht es über den Sehne-Tangente-Satz…


1)
Otherwise importing the turtle library will not work!
2)
Warum lassen wir nur ungerade Zahlen $n$ zu? Wenn man als Zackenwinkel jeweils $\frac{180}{n}$ nimmt, kommt für geradzahliges $n$ genau dann ein $n$-zackiger Stern heraus, wenn ggT$(\frac{n}2 - 1, n) = 1$ gilt. Beispielsweise kommt für $n=6$ ein Dreieck heraus (denn ggT$(2, 6)=2\not=1$), aber kein sechszackiger Stern. Für ungerades $n$ ist die entsprechende Bedingung ggT$(\frac{n-1}2, n) = 1$ stets erfüllt.
All dies lässt sich mit komplexen Einheitswurzeln begründen: Die Punkte, an denen die Schildkröte dreht, gehen nacheinander durch Multiplikation mit einer fixen $n$-ten Einheitswurzel auseinander hervor. Nun kommt es darauf an, ob diese Einheitswurzel primitiv ist, was mit den genannten ggT-Bedingungen geprüft werden kann.
  • lehrkraefte/snr/informatik/glf22/python/turtle.txt
  • Last modified: 2023/01/13 22:13
  • by Olaf Schnürer