Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
lehrkraefte:blc:informatik:glf22:turtle [2023/01/10 18:55] Ivo Blöchliger [Mathematik hinter der Turtle] |
lehrkraefte:blc:informatik:glf22:turtle [2023/01/27 09:22] (current) Ivo Blöchliger [Pythagorasbaum] |
||
---|---|---|---|
Line 29: | Line 29: | ||
</ | </ | ||
- | ===== Aufgaben | + | ==== Aufgaben ==== |
<WRAP todo> | <WRAP todo> | ||
- | * Ändern Sie den Code in '' | + | * Ändern Sie den Code in '' |
</ | </ | ||
- | ===== Aufgaben | + | ===== For-Schlaufen |
+ | Mit For-Schlaufen werden Programmblöcke wiederholt. Dabei wird eine **Laufvariable** hochgezählt (bzw. läuft die Werte in einer Liste durch). | ||
+ | <code python> | ||
+ | for i in range(10): | ||
+ | print(i) | ||
+ | if i%2 == 0: # i%2 ist der Rest der Division durch zwei, also 0 oder 1. | ||
+ | | ||
+ | |||
+ | print(" | ||
+ | </ | ||
+ | [[lehrkraefte: | ||
+ | <WRAP todo> | ||
+ | Schreiben Sie je ein Programm mit For-Schleifen, | ||
+ | * Ein regelmässiges 12-Eck | ||
+ | * Ein 5-Zack-Stern | ||
+ | * Ein regelmässiges $n$-Eck, wobei $n$ als Variable am Anfang im Code festgelegt werden kann. | ||
+ | * Ein $n$-Zack-Stern, | ||
+ | * Bonus-Aufgabe: | ||
+ | Für die Bonus-Aufgabe wird wohl der Radius vom $n$-Eck benötigt (oder umgekehrt die Seitenlänge aus dem Radius berechnet). Dazu werden die trigonometrischen Funktionen gebraucht: | ||
+ | <code python> | ||
+ | # Die Funktionen Cosinus und Sinus sowie die Konstante pi importieren | ||
+ | from math import cos,sin,pi | ||
+ | |||
+ | w=30 | ||
+ | print(f" | ||
+ | </ | ||
+ | |||
+ | <hidden Lösungsvorschläge> | ||
+ | <code python 12-eck.py> | ||
+ | from kroete import Kroete | ||
+ | |||
+ | t = Kroete() | ||
+ | |||
+ | for i in range(12): | ||
+ | t.forward() | ||
+ | t.left(30) | ||
+ | |||
+ | </ | ||
+ | <code python 5zack.py> | ||
+ | from kroete import Kroete | ||
+ | |||
+ | t = Kroete() | ||
+ | |||
+ | for i in range(5): | ||
+ | t.forward(200) | ||
+ | t.left(144) | ||
+ | </ | ||
+ | <code python n-eck.py> | ||
+ | from kroete import Kroete | ||
+ | |||
+ | n=7 | ||
+ | |||
+ | t = Kroete() | ||
+ | for i in range(n): | ||
+ | t.forward() | ||
+ | t.left(360/ | ||
+ | |||
+ | </ | ||
+ | <code python n-zack.py> | ||
+ | from kroete import Kroete | ||
+ | |||
+ | n=11 # Anzahl Zacken | ||
+ | m=4 # Wie viele Zacken vorwärts (darf kein Teiler von n sein!) | ||
+ | |||
+ | t = Kroete() | ||
+ | for i in range(n): | ||
+ | t.forward(200) | ||
+ | t.left(m*360/ | ||
+ | </ | ||
+ | </ | ||
+ | </ | ||
+ | |||
+ | ===== Funktionen ===== | ||
+ | Wie bereits gesehen, bieten sich Funktionen an, ein Programm in kleine Unterprogramme zu zerlegen. | ||
+ | |||
+ | Funktionen können (müssen aber nicht) mit '' | ||
+ | |||
+ | Funktionen können beliebig viele Parameter (bzw. Argumente) entgegennehmen. | ||
+ | |||
+ | Beispiel: | ||
+ | <code python> | ||
+ | from kroete import Kroete | ||
+ | |||
+ | # Definition der Funktion quadrat, wird nicht direkt ausgeführt. | ||
+ | def quadrat(schildi, | ||
+ | """ | ||
+ | for i in range(4): | ||
+ | schildi.forward(s) | ||
+ | schildi.left(90) | ||
+ | |||
+ | t = Kroete() | ||
+ | # Aufruf der Funktion. schildi wird dann zu t, s zu 200 | ||
+ | quadrat(t, 200) | ||
+ | </ | ||
+ | |||
+ | <WRAP todo> | ||
+ | Mit Hilfe der oben definierten Funktion '' | ||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | Oder mit einer zusätzlichen Zeile kann noch die Farbe berechnet werden, mit '' | ||
+ | |||
+ | {{: | ||
+ | </ | ||
+ | |||
+ | ==== Kreis ==== | ||
+ | Folgende Funktion zeichnet Kreise wobei der Mittelpunkt der aktuellen Position der Turtle entspricht: | ||
+ | <code python> | ||
+ | def kreis(schildi, | ||
+ | schildi.save() | ||
+ | n = int(r) | ||
+ | w = 2*pi/ | ||
+ | s = r*sqrt(sin(w)**2+(1-cos(w))**2) | ||
+ | schildi.move(r) | ||
+ | schildi.left(90) | ||
+ | for i in range(n): | ||
+ | schildi.forward(s) | ||
+ | schildi.left(360/ | ||
+ | schildi.restore() | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP todo> | ||
+ | * Mathematisch gesprochen, was genau zeichnet die Funktion Kreis? | ||
+ | * Was genau ist die Segmentlänge und woher kommt diese Formel? Begründen Sie mit einer guten Skizze (//Die Herleitung gäbe ein wunderbare Trigo-Prüfungsaufgabe// | ||
+ | </ | ||
+ | |||
+ | ===== Rekursion ===== | ||
+ | Rekursion nennt man etwas, das mit sich selbst definiert wird (plus noch etwas, um zu beginnen). In der Informatik heisst das meist, dass sich eine Funktion selbst wieder aufruft. Dabei muss natürlich peinlichst darauf geachtet werden, dass sich die Funktion nicht unendlich oft selbst wieder aufruft. | ||
+ | |||
+ | ==== Koch-Kurve ==== | ||
+ | Die Koch-Kurve ist eine rekursiv definierte Kurve. | ||
+ | * Auf Stufe 0 ist die Kurve einfach eine Gerade | ||
+ | * Auf Stufe 1 ist die Kurve aus 4 gleich langen Geradenstücken aufgebaut, mit entsprechenden Winkeln | ||
+ | * Auf Stufe $n$ besteht die Kurve 4 Stücken der Stufe $n-1$, mit entsprechenden Winkeln dazwischen. | ||
+ | |||
+ | {{: | ||
+ | |||
+ | <WRAP todo> | ||
+ | * Schreiben und testen Sie eine Funktion '' | ||
+ | * Schreiben und testen Sie eine Funktion '' | ||
+ | * Schreiben Sie dann eine Funktion '' | ||
+ | * Wie unterscheiden sich die Funktionen '' | ||
+ | * Anstatt jetzt noch eine Funktion '' | ||
+ | * Zusatzaufgabe: | ||
+ | |||
+ | {{: | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | ==== Pythagorasbaum ==== | ||
+ | |||
+ | {{: | ||
+ | |||
+ | <WRAP todo> | ||
+ | Um diesen Baum zu zeichnen, erstellen Sie erst eine Funktion '' | ||
+ | |||
+ | {{: | ||
+ | |||
+ | Die Funktion nimmt folgende Parameter entgegen: | ||
+ | * Eine Turtle '' | ||
+ | * Einen Winkel '' | ||
+ | * Die Turtle startet bei «Start» und muss am Ende bei «Ende» sein. Die Schrittlänge '' | ||
+ | * Sie können dazu auch die Turtle-Methoden '' | ||
+ | |||
+ | Hinweis: Sie können die Kathetenlängen mit trigonometrischen Funktionen aus '' | ||
+ | |||
+ | </ | ||
+ | |||
+ | <WRAP todo> | ||
+ | Erweitern Sie Ihre Funktion so, dass ein zusätzlicher Parameter '' | ||
+ | * Ist die '' | ||
+ | * Sonst wird anstelle des Zeichnens der Katheten die Funktion selbst mit '' | ||
+ | * Probieren Sie verschiedene Winkel aus. | ||
+ | * Anstatt die '' | ||
+ | * Man erhält einen interessanten Baum, wenn man statt einen konstanten Winkel '' | ||
+ | </ | ||
+ | |||
+ | <hidden Lösungsvorschlag> | ||
+ | <code python> | ||
+ | from kroete import Kroete | ||
+ | from math import cos,sin,pi | ||
+ | |||
+ | |||
+ | |||
+ | def baum(t, winkel, stufe): | ||
+ | t.save() | ||
+ | for i in range(4): | ||
+ | t.forward() | ||
+ | t.left(90) | ||
+ | t.left(90) | ||
+ | t.move() | ||
+ | a = cos(winkel/ | ||
+ | b = sin(winkel/ | ||
+ | t.right(90-winkel) | ||
+ | t.r = a | ||
+ | if stufe==0 or (stufe<0 and t.r<3): | ||
+ | t.forward() | ||
+ | else: | ||
+ | baum(t, winkel, stufe-1) | ||
+ | t.right(90) | ||
+ | t.r = b | ||
+ | if stufe==0 or (stufe<0 and t.r<3): | ||
+ | t.forward() | ||
+ | else: | ||
+ | baum(t, winkel, stufe-1) | ||
+ | t.restore() | ||
+ | t.move() | ||
+ | |||
+ | |||
+ | |||
+ | t = Kroete() | ||
+ | t.y = -200 | ||
+ | t.x = 50 | ||
+ | t.r = 110 | ||
+ | baum(t, 30, -1) | ||
+ | </ | ||
+ | </ |