public class Complex { double re; double im; ...Das Quadrat einer komplexen Zahl hat den Realteil und den Imaginärteil . Der Betrag einer komplexen Zahl sei .
Complex f(Complex z) { double tmp; tmp = z.re; z.re = z.re * z.re - z.im * z.im + c.re; z.im = 2 * tmp * z.im + c.im; return z }Betrachte die Folge beginnend bei für festes .
Für manche konvergiert sie zu einem Fixpunkt, für manche gerät sie in einen (beschränkten) Zyklus, für manche verhält sie sich (beschränkt) chaotisch, für manche strebt die Folge gegen Unendlich.
Die
besteht aus solchen komplexen Zahlen , die beim
Startwert zu einer beschränkten Folge führen.
Um die Mandelbrotmenge grafisch darzustellen, definiert man
Ordne jedem Pixel des Bildschirms eine komplexe Zahl
zu wie folgt. Die linke obere Ecke bezeichne die komplexe Zahl
start
(z.B. ).
Die rechte obere Ecke bezeichne die komplexe Zahl ende
(z.B. )
Dann ergibt sich bei Pixeln pro Zeile eine Schrittweite von
.
Somit läßt sich ein Koordinatenpaar umrechnen durch den folgenden
Konstruktor.
public Complex(Point p, Complex start, double schritt) // bildet die komplexe Zahl zum Pixel p mit linker/oberer Ecke start // und Schrittweite schritt { this.re = start.re + schritt * (double)p.x; this.im = start.im - schritt * (double)p.y; }
Sei das zur komplexen Zahl gehörende Pixel. Dann färbe es mit farbe().
Implementation der Mandelbrot-Menge
Sobald während des Iterierens der Betrag von Folge wächst mit Sicherheit über alle Grenzen (Satz von Fatou). Falls Betrag von nach z.B. 100 Iterationen noch Folge bleibt vermutlich beschränkt.
D.h., bei Erreichen einer vorgegebenen Iterationenzahl wird das Pixel, welches der komplexen Zahl entspricht, schwarz gefärbt, da vermutlich zu einer beschränkten Folge führt.
void mandel () { Point p; int zaehler; Complex c, z; for (p.x = 0; p.x < WIDTH; p.x++) for (p.y = 0; p.y < HEIGHT; p.y++) { zaehler = 0; c = new Complex(p, start, schritt); z = new Complex(c); while ((betrag (z) < 2.0) && (zaehler++ < max_iter)) z = f(z); if (betrag(z) < 2.0) set_pixel(p); } }
Also ergibt sich:
if (betrag < 2.0) set_pixel (p); else if ((zaehler % 2) != 0) set_pixel (p);
Bei Farbbildschirmen gibt es folgende Möglichkeit, die Divergenzgeschwindigkeit der Folge für ein zu veranschaulichen:
Es seien die Farben farbe[0], ..., farbe[NUM_COL-1] vorhanden
set_col_pixel (p, farbe [zaehler % NUM_COL])