Mandelbrotmenge einfach selbst programmiert

Darstellungen der Mandelbrotmenge (auch „Apfelmännchen“ genannt) sind mit das Schönste was die Mathematik zu bieten hat. Nachdem ich vor kurzem schon die mathematischen Grundlagen (.pdf-Datei) erklärt habe, will ich mich hier der Programmierung eines einfachen Java-Applets zur Anzeige des „Apfelmännchens“ widmen. Sowohl den vollständigen Programmcode als auch das eingebettete Applet finden Sie unten.

Wer weniger an der Technik als vielmehr am Herumspielen mit der Mandelbrotmenge interessiert ist, dem kann ich mein aufwändigeres Applet u.a. mit Zoomfunktion empfehlen.

An Mathematik brauchen wir nur die beiden Formeln (1) und (2) aus der Erklärung, die wir wie in der .pdf Datei unter „Wie kann ich das programmieren“ beschrieben berechnen. Hier sind die hier wesentlichen Abschnitte noch einmal als Auszug:

Die Formeln:

xn+1 = xn2 – y n2 + a
yn+1 = 2xnyn + b

Dies lässt sich nun ohne Kenntnis von komplexen Zahlen berechnen, wenn a und b bekannt sind (x0 = y0 = 0).

Die Beschreibung:

Um die Mandelbrot-Menge darstellen zu können, berechnet man für jeden Punkt des Bildes die Folge mit seinen Koordinaten a (üblicherweise nach rechts) und b (nach oben) entsprechend den Gleichungen oben. Dazu setzt man eine maximale Anzahl an Iterationen (das heißt Anzahl an Folgengliedern die berechnet werden) und prüft nach jeder Iteration ob x2+y2>4 ist. Falls ja, ist der Punkt mit den Koordinaten a und b definitiv nicht Teil der Mandelbrot-Menge. Wenn diese Bedingung nach einer bestimmten Anzahl an Iterationen noch nicht erfüllt ist, kann man mit hoher Wahrscheinlichkeit davon ausgehen, dass er Teil der Mandelbrot-Menge ist (je höher die Anzahl der Iterationen desto sicherer das Ergebnis). Die Punkte, die zur Mandelbrot-Menge gehören, werden dann (meist schwarz) eingefärbt.

Dabei muss man aufpassen, dass man bei der Berechnung des zweiten Terms nicht schon mit dem neuen Ergebnis aus der ersten Berechnung arbeitet. Umgesetzt in Java sieht die Funktion zur Berechnung, ob ein Punkt (wahrscheinlich) zur Mandelbrotmenge gehört dann folgendermaßen aus:

/**
 * Hier wird überprüft ob ein Punkt zur Mandelbrotmenge gehört.
 * 
 * @param a Der Realteil der komplexen Zahl
 * @param b Der Imaginärteil der komplexen Zahl
 * @return Gibt an ob ein Punkt Teil der Mandelbrotmenge ist
 */
private boolean isElement(double a, double b) {
    double x = 0, x2, y = 0;
    for (int n = 0; n < 400; n++) {         x2 = x * x - y * y + a;         y = 2 * x * y + b;         x = x2;         if (x * x + y * y > 4) {
            return false;
        }
    }
    return true;
}

Diese Funktion muss dann nur für jedes Pixel mit den entsprechenden Koordinaten aufgerufen werden und die Punkte im Bild (hier ein java.awt.image.BufferedImage) entsprechend einfärbt werden:

private void renderImage() {
    int w = getWidth(), h = getHeight();
    img = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
    double a, b;
    int c = new Color(0, 0, 0).getRGB();
 
    for (int i = 0; i < h; i++) {         b = (double) i * 3 / h - 1.5; //-1,5 <= b < 1,5         for (int j = 0; j < w; j++) {             a = (double) j * 3 / w - 2; //-2 <= a < 1             if (isElement(a, b)) {                 img.setRGB(j, i, c); //schwarz einfärben             }         }     } }

Eingebaut in ein einfaches Java-Applet zur Anzeige des Bildes (der komplette, mindestens ab Java 5 kompilierbare, Quellcode findet sich hier), sieht das Ganze dann so aus:

(Mittlerweile sind die Sicherheitseinstellungen von Java ab Werk aus Sicherheitsgründen so eingestellt, dass nur noch signierte Java-Applets ausgeführt werden.
Ich will mir jedoch für dieses Progrämmchen nicht extra ein Zertifikat kaufen, daher werden die meisten das Applet leider nicht betrachten können.)

Hinweis: In einigen Feed-Readern wird das Applet evtl. nicht angezeigt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.