Craig Hales hat mich dazu gebracht, Bilder und Videosequenzen für Mandelbrot-Sets zu erstellen (siehe https://community.jmp.com/t5/Uncharted/Mandelbrot-shallow-tour/ba-p/53295 wo ich meinen Anfang hatte). Es war eine interessante Lernerfahrung, nicht nur über die Inkazitäten von Fraktalsätzen, sondern auch über JSL-Programmierung, Videobearbeitung und das Erstellen von Inhalten für YouTube.
Ich bin kürzlich auf einige Videos über das Mandelbrot-Power-Set gestoßen (manchmal auch als "Multibrot-Set" bezeichnet). https://en.wikipedia.org/wiki/Multibrot_set)). Ich werde nicht auf alle Details der Mandelbrot-Power-Funktion eingehen, aber wie Sie sie verwenden, ist wie folgt:
- Lassen f_c (z) = z ^ d + c (wobei z ist die komplexe Nummer z = x + iy, c = xc + i yc).
- Für einen bestimmten Wert von c . iterieren Sie wie folgt
- Lassen z_0 = 0
- Lassen f_c (z_i) = (z_ (i-1)) ^ d + c
- Wiederholen bis entweder
- Die "Bailout" -Anzahl der Iterationen wurde erfüllt (d. h i> maximale Iterationen angegeben ) ODER
- || z || = (x ^ 2 + y ^ 2)> (Stoppradius) ^ 2 (woher Halteradius ist normalerweise gleich 2, könnte aber kleiner sein)
- notieren Sie den Wert ich als Anzahl der Iterationen (oder der Tiefe) des Punktes c
Während es eine JSL-Funktion Mandelbrot () gibt, die bei der Erzeugung von Mandelbrot-Set-Images helfen wird, um einen Multibrot-Set zu erstellen, musste ich meine eigene JSL-Funktion schreiben.
f_mandelbrotpowercount = Function( {x, y, d = 2, radius=2, max_n = 100},
{zx, zy, n_iter = 0, r = 0, theta = 0},
if ( x ^ 2 + y ^ 2 <4,
While( (r < radius) & (n_iter < max_n),
zx = r ^ d * Cos( d * theta ) + x;
zy = r ^ d * Sin( d * theta ) + y;
r = Sqrt( zx ^ 2 + zy ^ 2 );
theta = ArcCosine( zx / r ) * ((zy > 0) * 2 - 1);
n_iter++;
);
);
n_iter;
);Wenn Sie ein wenig über komplexe Zahlen und die Multiplikation komplexer Zahlen wissen, können Sie erkennen, dass ich diese Identität benutze
z = x + iy = Re ^ (i Theta)
woher
R = sqrt (x ^ 2 + y ^ 2), Theta = ArcCosine (x / R) ( Theta ist zwingend dazwischen (-Pi, Pi)
Die Syntax lautet:
f_mandelbrotpowercount (xc, yc, , , )
Die Standardstärke ist 2, der Standardradius ist 2 und die Standard-Bailout-Interaktionen sind 100, was dasselbe Ergebnis wie die JSL-Mandelbrot () - Funktion zurückgeben sollte.
Wenn Sie das Ergebnis dieser Funktion berechnen, wird bei Power = 2 das durch, definierte Rechteck berechnet
linker x-Wert = -2,27, rechter x-Wert = 2,27
oberer y-Wert = 1,5, unterer y-Wert = -1,5
Wenn Sie dann die Ergebnisse skalieren und RGB-Farben basierend auf den skalierten Ergebnissen festlegen, können Sie ein Bild wie dieses erhalten
Das klassische Mandelbrot-Set!
Bei einer Leistung von 7 erhalten Sie ein Bild wie dieses!
Mandelbrot Power Set, Leistung = 7
Die JSL zum Erstellen der Image-Datei finden Sie hier
pow=7;<BR />xleft = -1.5*1640/1080;<BR />xright = 1.5*1640/1080;<BR />ytop = 1.5;<BR />ybottom = -1.5;
Parallel Assign(
{f = Name Expr( f_mandelbrotpowercount ), p = pow},
mat[r( ytop, ybottom ), c( xleft, xright )] = f( c, r, p )
);
mat = mat / 100;
green = mat ^ .3;
red = mat ^ 6;
blue = 1 - mat ^ .2;
img = New Image( "rgb", {red, green, blue} );
img << Save image("power7.png");Beachten Sie, dass dies die JSl-Funktion Parallel Assign () nutzt, um alle Kerne auf meinem Rechner für die Berechnungen verwenden zu können. Trotzdem dauert die Erzeugung eines einzelnen Bildes bei dieser Auflösung etwas mehr als 2 Minuten.
Eine wirklich coole Optik ist, zu beobachten, was passiert, wenn Sie die Leistung von 2 bis 10 und zurück variieren. Ich habe ein Video davon erstellt und Auf YouTube gepostet, wenn Sie es sehen möchten. Die Reihenfolge ist für die Leistung = 2 bis 10 in Schritten von 0,005. Es dauerte ungefähr 53 Stunden, um die Bildsequenzen zu erstellen.
Hier ist der vollständige Code zum Erstellen der Bildsequenzen (faire Warnung, siehe oben, ich habe 53 Stunden gebraucht, um die Bilder zu generieren!)
Names Default To Here( 1 );
f_mandelbrotpowercount = Function( {x, y, d = 2, radius=2, max_n = 100},
{zx, zy, n_iter = 0, r = 0, theta = 0},
if ( x ^ 2 + y ^ 2 <4,
While( (r < radius) & (n_iter < max_n),
zx = r ^ d * Cos( d * theta ) + x;
zy = r ^ d * Sin( d * theta ) + y;
r = Sqrt( zx ^ 2 + zy ^ 2 );
theta = ArcCosine( zx / r ) * ((zy > 0) * 2 - 1);
n_iter++;
);
);
n_iter;
);
xleft = -1.5*1640/1080;
xright = 1.5*1640/1080;
ytop = 1.5;
ybottom = -1.5;
xres = 1640;
yres = 1080;
filenamebase="m000";
fileindex=100000;
mat = J( yres, xres, . );
For( pow = 2, pow <= 10, pow += .005,
Parallel Assign(
{f = Name Expr( f_mandelbrotpowercount ), p = pow},
mat[r( ytop, ybottom ), c( xleft, xright )] = f( c, r, p )
);
mat = mat / 100;
green = mat ^ .3;
red = mat ^ 6;
blue = 1 - mat ^ .2;
img = New Image( "rgb", {red, green, blue} );
img << Save image("D:\mandelbrot\powerbrosequence\m"||char(fileindex)|| ".png");
fileindex+=1;
);Lassen Sie mich wissen, was Sie denken oder wenn Sie Fragen haben.