Hauptmenü
Geometrie 2 > Fraktale
Stufenfolge beim Blatt
Der Begriff 'Fraktal' hat seinen Ursprung darin, dass es Punktmengen gibt, denen man zwar eine reelle Zahl
als Dimension zuordnen kann, die aber nicht wie bei der Strecke oder dem Rechteck eine natürliche Zahl ist.
Diese Mengen haben dann ein zerklüftetes Aussehen das zum Teil an Naturformen erinnert. Einige dieser
Fraktale können mit Hilfe von Ähnlichkeits-Abbildungen definiert werden. Dann bietet sich zur geometrischen
Bestimmung der Abbildungen der Generator an, der zu jeder der vorkommenden Abbildungen den Bildpfeil
eines Startpfeils enthält. Dieser Startpfeil verbindet den Punkt (0 ; 0) mit dem Punkt (1 ; 0).
Der Generator ermöglicht es, ein annäherndes Bild des dadurch bestimmten Fraktals durch eine geometrische
Konstruktion zu erzeugen. Dabei wird eine Folge von Streckenzügen (zum Teil lückenhaft) mit dem Fraktal
als Grenzwert benutzt, die manchmal auch ohne Bezug zum Fraktal Interesse verdient.
Die Gleitschau zeigt die Stufenfolge, die zu dem darüber stehenden Generator mit dem daneben
gezeichneten Fraktal gehört. In der Stufe 2 wurden die beiden farbigen Pfeile des Generators mit den
beiden Abbildungen und abgebildet. bzw. ist die Drehstreckung bzw. Streckspiegelung,
die den schwarzen Startpfeil auf den blauen bzw. roten Pfeil des Generators abbildet. In der rechten
Gleitschau sind diese beiden Pfeile in Stufe 2 weiß-verhüllt gezeichnet, während sie in der linken
Gleitschau in Stufe 1 in kräftigen Farben gezeichnet sind. Rechts sind die Pfeile der Stufe 2 so an
den weiß-verhüllten Plus-Pfeil angehängt, wie dies im Generator für beide farbigen Abbildungspfeile
hinsichtlich des schwarzen Startpfeils gilt. Dagegen sind sie an den weiß-verhüllten Minus-Pfeil
spiegelbildlich angeheftet, wobei aus dem Plus-Pfeil ein Minus-Pfeil wird und umgekehrt.
Dieser Vorgang wiederholt sich entsprechend auf den folgenden Stufen.
Der folgende Programm-Code in der Programmier-Sprache Visual Basic erzeugt die Strich-Zeichnungen
der Gleitschau, wenn im Startformular eine Picturebox1, ein Button1 und eine Textbox1 zur Eingabe der
Stufen-Nummer eingefügt ist. Dabei wird ein gerichteter Stift mit Namen 'Turtle' durch die rekursive Prozedur
Fraktal über die Zeichenfläche geführt, für den stets die aktuellen x-y-Koordinaten und der Richtungswinkel
gespeichert sind. Der Richtungswinkel ist die Größe des Winkels in Grad zwischen dem Startpfeil und der
Turtle-Richtung. Die Turtle wird durch die Prozedur tmove in ihrer aktuellen Richtung weiterbewegt und durch
die Prozedur turn gedreht. Sie startet am Anfangspunkt des Startpfeils in dessen Richtung und endet am
Endpunkt ebenfalls mit dem Richtungswinkel Null. Die Unterscheidung des Plus- und Minus-Pfeils im
Generator wird über den Parameter inv erreicht, der nur die Werte 1 und -1 annimmt.
Public Class Form1
Inherits System.Windows.Forms.Form
Dim g As Graphics, b As SolidBrush, p As Pen
Dim Turtlex, Turtley, Turtlerichtung As Double
Dim dx, dy As Double
Dim wid, hei As Integer
Dim Generatorrichtung1, Generatorrichtung2, Generatorrichtung3,
Generatorweite1, Generatorweite2, Generatorweite3 As Double
Dim Generatorspitze1x, Generatorspitze1y,
Generatorspitze2x, Generatorspitze2y As Double
Structure Tline
Dim x1, y1, x2, y2 As Double
Dim cl As Color
End Structure
Dim Streckenmax As Integer
Dim Strecken() As Tline
#Region " Vom Windows Form Designer generierter Code "
#End Region
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
wid = PictureBox1.Width : hei = PictureBox1.Height
PictureBox1.Image = New Bitmap(wid, hei)
g = Graphics.FromImage(PictureBox1.Image)
b = New SolidBrush(Color.White)
p = New Pen(Color.Black)
g.FillRectangle(b, 0, 0, wid, hei)
Turtlerichtung = 0
Turtlex = 50 : Turtley = hei / 2
Generatorrichtung1 = 30 : Generatorweite1 = 0.643 : Generatorrichtung3 = 30 : Generatorweite3 = 0.643
Generatorspitze1x = Generatorweite1 * Math.Cos(Generatorrichtung1 * Math.PI / 180)
Generatorspitze1y = Generatorweite1 * Math.Sin(Generatorrichtung1 * Math.PI / 180)
Generatorspitze2x = 1 - Generatorweite3 * Math.Cos(Generatorrichtung3 * Math.PI / 180)
Generatorspitze2y = -Generatorweite3 * Math.Sin(Generatorrichtung3 * Math.PI / 180)
Generatorrichtung2 = Math.Atan((Generatorspitze2y - Generatorspitze1y) / (Generatorspitze2x - Generatorspitze1x)) * 180 / Math.PI - 180
Generatorweite2 = Math.Sqrt((Generatorspitze2x - Generatorspitze1x) ^ 2 + (Generatorspitze2y - Generatorspitze1y) ^ 2)
clear()
End Sub
Private Sub clear()
Streckenmax = 0
ReDim Preserve Strecken(Streckenmax)
Zeichnung()
End Sub
Private Sub Zeichnung()
Dim i As Integer
g.FillRectangle(b, 0, 0, wid, hei)
For i = 1 To Streckenmax
p.Color = Strecken(i).cl
g.DrawLine(p, CInt(Strecken(i).x1), CInt(Strecken(i).y1), CInt(Strecken(i).x2), CInt(Strecken(i).y2))
Next
g.DrawEllipse(Pens.Black, CInt(Turtlex - 5), CInt(Turtley - 5), 10, 10)
g.DrawLine(Pens.Red, CInt(Turtlex), CInt(Turtley), CInt(Turtlex + 10 * Math.Cos(Turtlerichtung * Math.PI / 180)), CInt(Turtley - 10 * Math.Sin(Turtlerichtung * Math.PI / 180)))
PictureBox1.Refresh()
End Sub
Private Sub tmove(s As Double, spur As Boolean, cl As Color)
Dim tx0, ty0 As Double
dx = s * Math.Cos(Turtlerichtung * Math.PI / 180)
dy = -s * Math.Sin(Turtlerichtung * Math.PI / 180)
tx0 = Turtlex : ty0 = Turtley
Turtlex = Turtlex + dx : Turtley = Turtley + dy
If spur Then
Streckenmax = Streckenmax + 1
ReDim Preserve Strecken(Streckenmax)
Strecken(Streckenmax).x1 = tx0 : Strecken(Streckenmax).y1 = ty0
Strecken(Streckenmax).x2 = turtlex : Strecken(Streckenmax).y2 = turtley
Strecken(Streckenmax).cl = cl
End If
Zeichnung()
End Sub
Private Sub turn(a As Double)
Turtlerichtung = Turtlerichtung + a
If Turtlerichtung > 360 Then Turtlerichtung = Turtlerichtung - 360
If Turtlerichtung < -360 Then Turtlerichtung = Turtlerichtung + 360
Zeichnung()
End Sub
Private Sub Fraktal(Stufe As Integer, Pixelweite As Double, inv As Integer)
If Stufe = 0 Then
If inv = 1 Then
tmove(pixelweite, True, Color.Blue)
Else
tmove(pixelweite, True, Color.Red)
End If
Else
turn(Generatorrichtung1 * inv)
Fraktal(Stufe - 1, Generatorweite1 * Pixelweite, inv)
turn((Generatorrichtung2 - Generatorrichtung1) * inv)
tmove(Generatorweite2 * Pixelweite, False, Color.White)
turn((Generatorrichtung3 - Generatorrichtung2) * inv)
Fraktal(Stufe - 1, Generatorweite3 * Pixelweite, -inv)
turn(-Generatorrichtung3 * inv)
End If
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Turtlerichtung = 0
Turtlex = 50 : Turtley = hei / 2
clear()
Fraktal(CStr(TextBox1.Text), 300, 1)
End Sub
End Class