Ich habe das mal in PureBasic mit der Julia- und der Mandelbrotmenge gemacht, dabei aber direkt in den GrafikBuffer geschrieben und ohne Kommentare. Komplette Berechnung Mandelbrot dauert ca. 200 ms. Die Julia-Menge geht sogar noch weit fixer, da kann man dann sogar per Mausbewegung die Parameter ändern.
Hier eine kurze Erklärung für solcherart Fraktale allgemein, quasi der Kommentar ohne Programm:
Stelle dir die Bildschirmfläche als komplexe Zahlenebene vor. Wenn Du nicht weißt, was das ist, dann schau mal nach komplexen Zahlen. (Sind eigentlich nichts weiter als Zahlenpaare zweier reellen Zahlen, für die es bestimmte Rechengesetze gibt, so dass man sie wieder addieren, multiplizieren kann, etc. Dadurch werden die reellen Zahlen ein Unterraum der komplexen.)
Dann kann man wie mit Koordinaten sagen, z.B. an 'Stelle' (1.0, 0.7) ist die 'komplexe Zahl' (1.0 , 0.7).
Also entspricht nun jeder Punkt auf dem Bildschirm einer komplexen Zahl. Der Nullpunkt liegt bei Mandelbrot für eine schöne Sicht normalerweise etwas rechts in der Mitte. Bildschirmränder Oben/Unten liegen etwa bei 1.25, -1.25, Links/Rechts etwa bei -2.5, 2.5
Nun wird bei Mandelbrot einfach für jeden Punkt C des Bildschirms die folgende Folge neu berechnet:
Zunächst wird A = 0 gesetzt, dann:
; starte Loop
A_{n+1} = A_{n}^2 + C
Wobei A und C komplexe Zahlen sind.
Es wird also immer nur - angefangen mit A=0 - die Zahl A quadriert, dann wird C (unser Bildschirmwert) dazuaddiert.
Dieser Wert wird A zugewiesen (Also im Prinzip A = A^2 + C)
Und endlos so weiter (für jeden Bildschirmpunkt).
Leider können wir nicht unendlich lange rechnen, deswegen müssen wir zumindest schonmal eine Höchstgrenze für die Iteration setzen (diese kann schon bei 30 liegen, man kann sie aber durch aus auch auf 10000 setzen, je höher, desto genauer, aber desto langsamer).
Nun geht es um folgendes:
Die Folge kann genau eines von zwei Verhalten zeigen:
a) der Betrag der Zahl A (wird einfach mit Phytagoras berechnet) wächst immer weiter ins bodenlose, ins Unendliche.
b) der Betrag der Zahl A bleibt bis in alle Zeit unter einer festen Schranke, der er sich immer weiter annähert.
Nun machen wir einfach folgendes:
Wir testen bei jedem Schleifendurchlauf, ob unsere Zahl A schon so groß ist, dass die Folge gegen unendlich laufen wird. (dafür reicht z.B. ein Betrag von 2.0) Dann können wir die Schleife so butz abbrechen. Je nachdem, wie schnell sie diese Schranke überschritten hat, malen wir den entsprechenden Punkt C in grün, oder rot, oder blau, oder einer Mischfarbe davon (Diese Schnelligkeit können wir einfach vom Schleifenzähler ableiten).
Sollte der Betrag von A selbst nach unserer definierten Höchstgrenze noch kleiner als 2.0 sein, dann malen wir den entsprechenden Punkt C einfach schwarz.
Fertig!
Die Juliamenge ist übrigens ähnlich:
Die Formel ist dieselbe, nur die Startwerte werden anders erhalten: Hier wird im Unterschied zu Mandelbrot das C für alle Punkte gleich gewählt (typisch zwischen 0 und 1).
Die Bildschirmpunkte geben diesmal den Startwert für A, dieser ist also - im Gegensatz zu Mandelbrot- nicht 0.
Interessant ist, dass man für C = 0 den Einheitskreis erhält. Ist ja auch logisch, da dann die Formel lautet:
"A = A^2". Für Beträge > 1 läuft die Folge natürlich gegen unendlich, für Beträge kleiner als 1 gegen einen fixen Wert (hier immer 0). Hier jedoch gibt es sogar noch den dritten Fall: Für Betrag = 1 bleibt der Betrag immer gleich 1. Es existiert also eine feste Trennlinie, welche einfach ein langweiliger Kreis ist. Für Werte C <> 0 gibt es dann stattdessen fraktale Zerklüftungen, die sich bis in unendlich kleine Größenordnungen stets neu verwirbeln.
Die Grenze selbst, die vorher 1 war, ist nun fraktal, sie existiert 'nicht wirklich festlegbar', ähnlich einer reellen Zahl, die man immer nur zwischen zwei Werten genauer eingrenzen kann.
Leider ist das Wochenende vorbei, sonst hätte ich den Code noch portiert, das kann ich aber demnächst mal nachholen. Kannst dich ja erstmal weiter da reinfuchsen. Komplexe Zahlen und Fraktale sind auf jedenfall interessante Dinge!