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 .
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 konvergiert definitiv nicht.
Falls Betrag von nach z.B. 100 Iterationen noch
Folge konvergiert vermutlich.
D.h., bei Erreichen einer vorgegebenen Iterationenzahl wird das Pixel,
welches der komplexen Zahl entspricht, schwarz gefärbt, da
vermutlich zur Konvergenz 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])