Fraktal aus primitiven Grafiken

alt text

Sierpinski-Dreieck und Cantor Staub gehören - wie schon erwähnt - zu den Fraktalen. Fraktale sind sowohl in der freien Natur vorhanden (vgl. Romanesco), als auch in der Mathematik sehr interessant (vgl. Julia-Mengen, Mandelbrot-Menge). Am interessantesten ist es aber, sich selbst welche auszudenken. Das Handwerk dazu haben Sie nun erlernt, es fehlt Ihnen aber vermutlich noch an Übung zur Eigenkreation.

Darum gibt es nun noch einige vorgegeben Fraktale zur Bearbeitung:

Das Bild oben zeigt ein Fraktal aus Kreisen, man könnte es auch mit Quadraten oder Dreiecken gestalten. Man muss sich Gedanken darüber machen, ob sie überhaupt noch iterativ gestaltet werden können, sollen sich die primitiven Grafiken berühren oder nicht, gibt es Fraktale, die sich gleichzeitig über verschiedene Rekursionstiefen bewegen?

Betrachten Sie zuerst die einzelnen Schritte:

alt text

Iterative Funktion

Es wird die vorherige Figur verkleinert und um 90° gedreht links von einem Kreis, um -90° rechts davon und einmal darüber platziert.

Der Kreis in der Mitte könnte als die vorherige Figur in der originalen Grösse verstanden werden, aber es ist einfacher, sich einen neuen Kreis vorzustellen.
Loading...
Lösung (zum Anzeigen auf den Pfeil drücken, aber nur benutzen, wenn Sie wirklich nicht weiterkommen!)
from pytamaro import Color, Graphic, above, ellipse, beside, show_graphic, red

def fraktal_it(tiefe: int, groesse: float, farbe: Color) -> Graphic:
    f = 2/5  # der Verkleinerungsfaktor   
    return above(
            ellipse(groesse*f, groesse*f, farbe),
            beside(
                ellipse(groesse*f, groesse*f, farbe),
                beside(
                    ellipse(groesse, groesse, farbe),
                    ellipse(groesse*f, groesse*f, farbe)
                    )
                )
            )

Keine Angst, sollte es nicht auf Anhieb geklappt haben, ist das nicht verwunderlich. Die Überlegungen, die zusätzlich gemacht werden müssen, damit genau die Figur angezeigt wird, sind umfangreich. Vergleichen Sie Ihren Code nun mit dem unten abgebildeten.

def fraktal_it(tiefe: int, groesse: float, farbe: Color) -> Graphic:
    f = 2/5  # der Verkleinerungsfaktor
    result = empty_graphic()
    for i in range(tiefe+1):
        result = above(
            result,
            beside(
                rotate(90,result),
                beside(
                    ellipse(groesse*f**(tiefe-i), groesse*f**(tiefe-i), farbe), 
                    rotate(-90,result)
                )
            )
        )
    return result

show_graphic(fraktal_it(5, 500, red))

Die Überlegungen, die Sie hier gesehen haben, aber vielleicht noch nicht selbst machen konnten, sind Übungssache. Jetzt haben Sie sie das erste Mal gesehen, und nach einigen Malen können Sie sie dann auch reproduzieren.

Allenfalls ist es einfacher, die Funktion rekursiv zu schreiben um so die ganzen Überlegungen zu der Anzahl der Iterationsschritte zu umgehen.

Rekursive Funktion

Die Vorschrift kann nun aus dem obigen Code gut abgeleitet werden. Wichtig ist, dass Sie erkannt haben, dass es zwei verschiedene Grössen von Kreisen pro Rekursionsschritt gibt und die Abbruchbedingungung der einfache Kreis ist.

Schreiben Sie nun den Code für die rekurisive Funktion:

Loading...
Lösung (zum Anzeigen auf den Pfeil drücken, aber nur benutzen, wenn Sie wirklich nicht weiterkommen!)
from pytamaro import rotate

def fraktal_rek(tiefe: int, groesse: float, farbe: Color) -> Graphic:
     f = 2/5  # der Verkleinerungsfaktor
     if tiefe == 0:
          return ellipse(groesse,groesse, farbe)
     else:
          return above(
                    fraktal_rek(tiefe-1, groesse*f, farbe),
                    beside(
                        beside(
                            rotate(90,fraktal_rek(tiefe-1, groesse*f, farbe)),
                            ellipse(groesse, groesse, farbe)
                        ),
                        rotate(-90,fraktal_rek(tiefe-1, groesse*f, farbe))
                )
            )

Sie sehen, die komplizierten Überlegungen, die bei der Iteration notwendig waren, sind bei der Rekursion nicht mehr nötig.

Ändern Sie Ihren Code ab, sodass das untenstehende Bild entsteht, oder mit einer anderen Form gebildet wird. Versuchen Sie verschiedene Verkleinerungsfaktoren oder hängen Sie unten einen weiteren "Ast" an.

alt text

Wenn Sie Lust haben, dieses Fraktal weiter zu abstrahieren, also erst beim Aufruf entscheiden zu müssen, ob wirklich ein Kreis oder vielleicht doch ein Dreieck übergeben, mit einem anderen Verkleinerungsfaktor gearbeitet wird, schauen Sie sich die optionale Aktivität PyTamaro iconFunktionen übergeben an.

Was Sie gelernt haben

  • Rekursion funktioniert grundsätzlich immer nach dem zweiteiligen Prinzip Abbruchbedingung und Codeblock mit Selbstaufruf und kann somit - sobald man sie verstanden hat - eine Vereinfachung für komplexere iterative Probleme darstellen.
  • Rekursion kann in einem Rekursionsschritt nicht nur die Verarbeitung des Selbstaufrufes sondern auch weitere Elemente kombinieren (oder gar verschiedene Rekursionstiefen aufrufen).

This activity has been created by Farner and is licensed under CC BY-SA 4.0.

Fraktal aus primitiven Grafiken

Logo of PyTamaro

PyTamaro is a project created by the Lugano Computing Education Research Lab at the Software Institute of USI

Privacy PolicyPlatform Version 8f2269b7 (Thu, 07 May 2026 14:30:13 GMT)