Ich habe keine Erfahrung mit der Programmierung von Fraktalen. Natürlich habe ich die berühmten Mandelbrot-Bilder und so gesehen.
Können Sie mir einfache Algorithmen für Fraktale zur Verfügung stellen?
Die Programmiersprache spielt keine Rolle, aber ich kenne mich am besten mit Actionscript, C # und Java aus.
Ich weiß, dass ich beim Googeln von Fraktalen viele (komplizierte) Informationen erhalte, aber ich möchte mit einem einfachen Algorithmus beginnen und damit spielen.
Vorschläge zur Verbesserung des grundlegenden Algorithmus sind ebenfalls willkommen, z. B. wie man sie in diesen schönen Farben und so macht.
Antworten:
Das Programmieren des Mandelbrot ist einfach.
Mein Quick-n-Dirty-Code ist unten (nicht garantiert fehlerfrei, aber eine gute Übersicht).
Hier ist der Umriss: Die Mandelbrot-Menge liegt im Komplex-Gitter vollständig innerhalb eines Kreises mit Radius 2.
Beginnen Sie also damit, jeden Punkt in diesem rechteckigen Bereich zu scannen. Jeder Punkt repräsentiert eine komplexe Zahl (x + yi). Iterieren Sie diese komplexe Zahl:
[new value] = [old-value]^2 + [original-value]
während Sie zwei Dinge im Auge behalten:1.) die Anzahl der Iterationen
2.) die Entfernung von [neuer Wert] vom Ursprung.
Wenn Sie die maximale Anzahl von Iterationen erreicht haben, sind Sie fertig. Wenn der Abstand vom Ursprung größer als 2 ist, sind Sie fertig.
Wenn Sie fertig sind, färben Sie das Originalpixel abhängig von der Anzahl der durchgeführten Iterationen. Fahren Sie dann mit dem nächsten Pixel fort.
Einige ausgelassene Details sind:
1.) Erfahren Sie genau, was das Quadrat einer komplexen Zahl ist und wie Sie es berechnen.
2.) Finden Sie heraus, wie der (-2,2) rechteckige Bereich in Bildschirmkoordinaten übersetzt wird.
quelle
Sie sollten in der Tat mit dem Mandelbrot-Set beginnen und verstehen, was es wirklich ist.
Die Idee dahinter ist relativ einfach. Sie beginnen mit einer Funktion komplexer Variablen
Dabei ist z eine komplexe Variable und C eine komplexe Konstante . Jetzt iterieren Sie es beginnend mit z = 0, dh Sie berechnen z 1 = f (0), z 2 = f (z 1 ), z 3 = f (z 2 ) und so weiter. Die Menge der Konstanten C, für die die Folge z 1 , z 2 , z 3 , ... begrenzt ist , dh nicht ins Unendliche geht, ist die Mandelbrot-Menge (die schwarze Menge in der Abbildung auf der Wikipedia-Seite).
In der Praxis sollten Sie zum Zeichnen des Mandelbrot-Sets:
Die erstaunliche Tatsache bei Fraktalen ist, wie wir aus einfachen und scheinbar harmlosen Anforderungen eine enorm komplexe Menge (insbesondere die Grenze der Mandelbrot-Menge) erhalten können.
Genießen!
quelle
Wenn komplexe Zahlen Kopfschmerzen verursachen, gibt es eine breite Palette von Fraktalen, die mit einem L-System formuliert werden können. Dies erfordert die Interaktion einiger Ebenen, aber jede ist für sich genommen interessant.
Zuerst brauchst du eine Schildkröte. Vorwärts, Zurück, Links, Rechts, Stift hoch, Stift runter. Es gibt viele lustige Formen, die mit Schildkrötengrafiken unter Verwendung der Schildkrötengeometrie erstellt werden können, auch ohne dass ein L-System sie antreibt. Suchen Sie nach "LOGO-Grafiken" oder "Turtle-Grafiken". Ein vollständiges LOGO- System ist in der Tat eine Lisp- Programmierumgebung, die eine nicht parästhesierte polnische Cambridge- Syntax verwendet. Aber Sie müssen nicht annähernd so weit gehen, um mit dem Schildkrötenkonzept ein paar hübsche Bilder zu machen.
Dann benötigen Sie eine Schicht, um ein L-System auszuführen. L-Systeme sind mit Post-Systemen und Semi-Thue-Systemen verwandt und überschreiten wie virii die Grenze der Turing-Vollständigkeit. Das Konzept ist das Umschreiben von Strings . Es kann als Makroerweiterung oder als Prozedursatz mit zusätzlichen Steuerelementen zum Binden der Rekursion implementiert werden. Wenn Sie die Makro-Erweiterung verwenden (wie im folgenden Beispiel), benötigen Sie weiterhin eine Prozedur zum Zuordnen von Symbolen zu Turtle-Befehlen und eine Prozedur zum Durchlaufen der Zeichenfolge oder des Arrays, um das codierte Turtle-Programm auszuführen. Für einen Prozedurensatz mit begrenzter Rekursion ( z. B. ) binden Sie die Turtle-Befehle in die Prozeduren ein und fügen jeder Prozedur entweder Überprüfungen auf Rekursionsebene hinzu oder rechnen sie einer Handlerfunktion aus.
Hier ist ein Beispiel eines Pythagoras-Baums in Postscript mit Makro-Erweiterung und einem sehr abgekürzten Satz von Turtle-Befehlen. Einige Beispiele in Python und Mathematica finden Sie in meiner Code-Golf-Herausforderung .
quelle
Es gibt ein großartiges Buch namens Chaos and Fractals , das am Ende jedes Kapitels einen einfachen Beispielcode enthält, der ein Fraktal oder ein anderes Beispiel implementiert. Als ich dieses Buch vor langer Zeit las, konvertierte ich jedes Beispielprogramm (in einem einfachen Dialekt) in ein Java-Applet, das auf einer Webseite ausgeführt wird. Die Applets finden Sie hier: http://hewgill.com/chaos-and-fractals/
Eines der Beispiele ist eine einfache Mandelbrot-Implementierung.
quelle
Ein weiteres hervorragendes Fraktal ist das Sierpinski-Dreieck-Fraktal.
Zeichnen Sie grundsätzlich drei Ecken eines Dreiecks (ein gleichseitiges Dreieck wird bevorzugt, aber jedes Dreieck funktioniert) und beginnen Sie dann einen Punkt P an einer dieser Ecken. Bewegen Sie P nach dem Zufallsprinzip zur Hälfte in eine der drei Ecken und zeichnen Sie dort einen Punkt. Bewegen Sie P erneut auf halber Strecke in Richtung einer beliebigen Ecke, zeichnen Sie und wiederholen Sie den Vorgang.
Sie würden denken, dass die zufällige Bewegung ein zufälliges Ergebnis erzeugen würde, aber das tut es wirklich nicht.
Referenz: http://en.wikipedia.org/wiki/Sierpinski_triangle
quelle
Das Sierpinski-Dreieck und die Koch-Kurve sind spezielle Arten von Flammenfraktalen. Flammenfraktale sind ein sehr verallgemeinerter Typ eines iterierten Funktionssystems, da es nichtlineare Funktionen verwendet.
Ein Algorithmus für IFS: es lautet wie folgt:
Start with a random point.
Wiederholen Sie die folgenden Schritte viele Male (mindestens eine Million, abhängig von der endgültigen Bildgröße):
Apply one of N predefined transformations (matrix transformations or similar) to the point. An example would be that multiply each coordinate with 0.5. Plot the new point on the screen.
Wenn sich der Punkt außerhalb des Bildschirms befindet, wählen Sie stattdessen zufällig einen neuen innerhalb des Bildschirms aus.
Wenn Sie schöne Farben wünschen, lassen Sie die Farbe von der zuletzt verwendeten Transformation abhängen.
quelle
Ich würde mit etwas Einfachem beginnen, wie einer Koch-Schneeflocke . Es ist ein einfacher Vorgang, eine Linie zu nehmen und zu transformieren und den Vorgang dann rekursiv zu wiederholen, bis er ordentlich aussieht.
Etwas sehr Einfaches wie 2 Punkte (eine Linie) zu nehmen und einen dritten Punkt (eine Ecke) hinzuzufügen und dann jeden neuen Abschnitt zu wiederholen, der erstellt wird.
quelle
Ich denke, Sie sehen Fraktale möglicherweise nicht als Algorithmus oder Programmiermittel. Fraktale sind ein Konzept! Es ist ein mathematisches Konzept, bei dem sich detaillierte Muster wiederholen.
Daher können Sie ein Fraktal auf verschiedene Arten und mit verschiedenen Ansätzen erstellen, wie in der folgenden Abbildung dargestellt.
Wählen Sie einen Ansatz und untersuchen Sie, wie Sie ihn implementieren können. Diese vier Beispiele wurden mit Marvin Framework implementiert . Die Quellcodes finden Sie hier
quelle
Das Mandelbrot-Set wird generiert, indem eine Funktion wiederholt ausgewertet wird, bis sie überläuft (eine definierte Grenze), und dann überprüft wird, wie lange Sie zum Überlaufen gebraucht haben.
Pseudocode:
Anmerkungen:
Wert ist eine komplexe Zahl. Eine komplexe Zahl (a + b i) wird quadriert, um (a a-b * b + 2 * a b i) zu ergeben. Sie müssen einen komplexen Typ verwenden oder diese Berechnung in Ihre Schleife aufnehmen.
quelle
Einfach und grafisch ansprechend gehen nicht wirklich Hand in Hand. Wenn Sie es ernst meinen mit der Programmierung von Fraktalen, empfehle ich Ihnen, sich über iterierte Funktionssysteme und die Fortschritte zu informieren, die beim Rendern erzielt wurden.
http://flam3.com/flame_draves.pdf
quelle
Hier ist ein einfacher und leicht verständlicher Code in Java für Mandelbrot und andere fraktale Beispiele
http://code.google.com/p/gaima/wiki/VLFImages
Laden Sie einfach die Datei BuildFractal.jar herunter, um sie in Java zu testen, und führen Sie sie mit dem folgenden Befehl aus:
java -Xmx1500M -jar BuildFractal.jar 1000 1000 Standard-MANDELBROT
Der Quellcode kann auch kostenlos heruntergeladen / erkundet / bearbeitet / erweitert werden.
quelle
Hier ist ein Codepen, den ich für das Mandelbrot-Fraktal mit einfachem Javascript und HTML geschrieben habe.
Hoffentlich ist der Code leicht zu verstehen.
Der komplizierteste Teil ist das Skalieren und Übersetzen der Koordinatensysteme. Kompliziert ist auch die Erstellung der Regenbogenpalette.
quelle
Die oben genannten Personen verwenden die Suche nach Mittelpunkten für Sierra Pinski und Koch. Ich würde viel mehr empfehlen, Formen zu kopieren, zu skalieren und dann zu übersetzen, um den "fraktalen" Effekt zu erzielen. Pseudocode in Java für sierpinski würde ungefähr so aussehen:
quelle
Manchmal programmiere ich Fraktale zum Spaß und als Herausforderung. Sie finden sie hier . Der Code wird mit der Bibliothek P5.js in Javascript geschrieben und kann direkt aus dem HTML-Quellcode gelesen werden.
Für diejenigen, die ich gesehen habe, sind die Algorithmen recht einfach. Finden Sie einfach das Kernelement und wiederholen Sie es dann immer wieder. Ich mache es mit rekursiven Funktionen, kann aber anders gemacht werden.
quelle