Fraktale sind computergenerierte Bilder, die eine Selbstähnlichkeit aufweisen, d.h. bei denen Teilbilder eine verkleinerte Kopie des Gesamtbildes sind. Der Begriff fractal wurde 1975 von Mathematiker Benoit Mandelbrot eingeführt und stammt aus dem Lateinischen fractus (gebrochen), was sich auf die sogenannte fraktale Dimension bezieht. In der traditionellen Geometrie ist eine Linie eindimensional, eine Fläche zweidimensional und ein Raum dreidimensional. Fraktale Bilder weisen meist eine nicht-ganzzahlige Dimension auf. Interessante Bilder liefern Fraktale, die durch eine nichtlineare Transformation entstehen. Solche Fraktale werden in der Regel iterativ berechnet und verwenden häufig komplexe Zahlen.
Im Folgenden findet man den vollständigen Programmcode zu einigen bekannten Fraktalen ohne weiteren Kommentar. Auch ohne eingehendes Studium des Programmcodes kann man sich an den schönen Bildern freuen und Frakale mit anderen Farben erstellen.
Beispiel 1: Farn
# Farn.py from gpanel import * import random def farn(): z = 0 n = 0 while n < nbPoints: r = random.random() c = "black" if r < 0.01: c = "yellow" z = f(z, 0, 0, 0, 0.16, 0, 0) # Stiel elif r < 0.86: c = "green" z = f(z, 0.85, 0.04, -0.04, 0.85, 0, 1.60) # symmetry elif r > 0.86 and r < 0.93: c = "red" z = f(z, 0.20, -0.26, 0.23, 0.22, 0, 1.60) # left leaves elif r > 0.93: c = "blue" z = f(z, -0.15, 0.28, 0.26, 0.24, 0, 1.44) # right leaves setColor(c) point(z) n += 1 def f(z, a, b, c, d, e, f): re = a * z.real + b * z.imag + e im = c * z.real + d * z.imag + f return complex(re, im) makeGPanel(-3.5, 3.5, 0, 10) bgColor("black") title("Creating fert...") nbPoints = 40000 farn() title("Creating fern... done."); |
|
Beispiel 2: Julia
# Julia.py from gpanel import * def putPixel(z, c): setColor(c) point(z.real, z.imag) maxIter = 100 maxNorm = 50.0 step = 0.005 range = 2.0 makeGPanel(-range, range, -range, range) c = complex(-0.5, -0.5) z0 = complex(-range, -range) enableRepaint(False) while z0.imag < range: # outer loop in imag direction z0 = complex(-range, z0.imag + step) while z0.real < range: # inner loop in real direction z0 = z0 + step z = z0; it = 0 while (z.real * z.real + z.imag * z.imag) < maxNorm and it < maxIter: z = z * z + c it = it + 1 if it < 3: putPixel(z0, "darkblue") elif it < 5: putPixel(z0, "green") elif it < 8: putPixel(z0, "red") elif it < 12: putPixel(z0, "blue") elif it < 100: putPixel(z0, "yellow") else: putPixel(z0, "black") repaint() |
Beispiel 3: Mandelbrot
#Mandelbrot.py from gpanel import * def getIterationColor(it): color = makeColor((30 * it) % 256, (4 * it) % 256, (255 - (30 * it)) % 256) return color def mandelbrot(c): z = 0 for it in range(maxIterations): z = z*z + c if abs(z) > R: # diverging return it return maxIterations maxIterations = 50 R = 2 xmin = -2 xmax = 1 xstep = 0.003 ymin = -1.5 ymax = 1.5 ystep = 0.003 makeGPanel(xmin, xmax, ymin, ymax) title("Mandelbrot set") enableRepaint(False) y = ymin while y <= ymax: x = xmin while x <= xmax: c = x + y*1j itCount = mandelbrot(c) if itCount == maxIterations: # inside Mandelbrot set setColor("yellow") else: # outside Mandelbrot set setColor(getIterationColor(itCount)) point(c) x += xstep y += ystep repaint() |