====== Koch'sche Schneeflocke ====== Die Kochsche Schneeflocke setzt sich aus drei identischen Teilen zusammen, die mithilfe einer rekursiven Methode gezeichnet werden können: {{ .:ks.png |}} Jede Seite der Schneeflocke besteht aus einer //[[https://de.wikipedia.org/wiki/Koch-Kurve|Kochkurve]]//. {{ :faecher:informatik:oberstufe:algorithmen:rekursion:uebungen02:kochsche_schneeflocke:kochkurve.png |}} Eine Kochkurve der Stufe n und Länge l kann mithilfe einer rekursiven Methode mit Turtle-Grafik ''zeichneKochkurve(int n, int l)'' mit Turtle-Grafik gezeichnet werden. ---- {{:aufgabe.png?nolink |}} === (A1) === * Verwende die Vorlage aus [[..:einfuehrung:start| der Einführung in die Turtle Grafik]] * Notiere den Basisfall zum Zeichnen einer Kochkurve der Iteration 0 und Länge ''l'' in einer Methode ''zeichneKochkurve(int n, int l)'' im Quelltext. * Zeichnen die Kochkurve in der 0. Iteration auf ein Blatt Papier. Zeichne anschließend mit anderer Farbe ein, wo sich die (um 1/3 verkleinerte) Kochkurve der Iteration 0 in der Kochkurve der Iteration 1 wiederfindet und mit einer weiteren Farbe, wo sich die (wieder um 1/3 verkleinerte) Kochkurve der Iteration 1 in der Iteration 2 wiederfindet. * Wie oft muss die Methode ''zeichneKochkurve'' sich für jede Iteration selbst aufrufen? * Wie verändern sich die Parameter der Selbstaufrufe. * Welche Turtle-Befehle müssen jeweils zwischen den Selbstaufrufen ausgeführt werden? * Vervollständige Quelltext und implementiere die Methode ''zeichneKochkurve(int n, int l)''. * Implementiere die Methode ''zeichneKochflocke(int n, intl)''. === Hilfestellungen === ++++ Hilfe 1: Basisfall | public void zeichneKochkurve(int n, int l) { if(n==0) { // Zeichne Strich der Länge l } else { // Anderer Fall } } ++++ ++++ Hilfe 1: Codegerüst | public void zeichneKochkurve(int n, int l) { if(n==0) { t.forward(l); } else { // Was muss mit n und l geschehen, wenn man eine Stufe weiter hineinzoomt? n=FIXME l=FIXME // Nun müssen drei "kleinere" Kochkurven gezeichnet werden zeichneKochkurve(n, l); // Was muss zwischendrin passieren? FIXME zeichneKochkurve(n, l); FIXME zeichneKochkurve(n, l); FIXME zeichneKochkurve(n, l); } ++++ ++++ Hilfe 3: Lösungsvorschlag | public void zeichneKochkurve(int n, int l) { if(n==0) { t.forward(l); } else { n=n-1; l=l/3; zeichneKochkurve(n, l); t.left(60); zeichneKochkurve(n, l); t.right(120); zeichneKochkurve(n, l); t.left(60); zeichneKochkurve(n, l); } } ++++