Frage

Ich habe keine Erfahrung mit der Programmierung Fraktalen. Natürlich habe ich die berühmte Mandelbrot Bilder und so gesehen.

Können Sie mich mit einfachen Algorithmen für Fraktale.

Programmiersprache spielt keine Rolle, wirklich, aber ich bin sehr vertraut mit Actionscript, C #, Java.

Ich weiß, dass, wenn ich Fraktalen google, ich habe eine Menge von (komplizierten) Informationen erhalten, aber ich möchte mit einem einfachen Algorithmus starten und mit ihm spielen.

Vorschläge auf dem Basisalgorithmus zu verbessern sind ebenfalls gern gesehen, wie, wie sie in den schönen Farben zu machen und so weiter.

War es hilfreich?

Lösung

, um die Mandelbrots Programmierung ist einfach.
Mein Quick-n-dirty-Code ist unten (nicht zu fehlerfrei garantiert, aber ein guter Entwurf).

Hier ist der Umriss: Die Mandelbrot-Menge liegt in den komplexen Gittern vollständig innerhalb eines Kreises mit dem Radius 2.

Also, starten Sie durch jeden Punkt in diesem rechteckigen Bereich zu scannen. Jeder Punkt stellt eine komplexe Zahl (x + yi). Iterieren, dass komplexe Zahl:

[new value] = [old-value]^2 + [original-value] während der Verfolgung von zwei Dingen:

1.) Die Anzahl der Iterationen

2.) Der Abstand von [new-Wert] vom Ursprung.

Wenn Sie die maximale Anzahl der Iterationen zu erreichen, sind Sie fertig. Wenn der Abstand vom Ursprung größer als 2 ist, sind Sie fertig.

Wenn Sie fertig sind, die ursprüngliche Pixelfarbe auf die Anzahl der Iterationen in Abhängigkeit Sie getan haben. Dann gehen Sie zum nächsten Pixel.

    public void MBrot()
    {
        float epsilon = 0.0001; // The step size across the X and Y axis
        float x;
        float y;
        int maxIterations = 10; // increasing this will give you a more detailed fractal
        int maxColors = 256; // Change as appropriate for your display.

        Complex Z;
        Complex C;
        int iterations;
        for(x=-2; x<=2; x+= epsilon)
        {
            for(y=-2; y<=2; y+= epsilon)
            {
                iterations = 0;
                C = new Complex(x, y);
                Z = new Complex(0,0);
                while(Complex.Abs(Z) < 2 && iterations < maxIterations)
                {
                    Z = Z*Z + C;
                    iterations++;
                }
                Screen.Plot(x,y, iterations % maxColors); // depending on the number of iterations, color a pixel.
            }
        }
    }

Einige Details weggelassen sind:

1.) Erfahren Sie genau das, was der Platz einer komplexen Zahl ist und wie es zu berechnen.

2.) Heraus, wie der (-2,2) rechteckigen Bereich auf Bildschirmkoordinaten zu übersetzen.

Andere Tipps

Sie sollten in der Tat mit dem Mandelbrot-Menge , und verstehen, was es wirklich ist.

Die Idee dahinter ist relativ einfach. Sie beginnen mit einer Funktion der komplexen Variablen

  

f (z) = z 2 + C

, wobei z eine komplexe ist variable und C ist eine komplexe Konstante . Jetzt wiederholen Sie es von z Start = 0, dh Sie berechnen z 1 = f (0), z 2 = f (z 1 ) , z 3 = f (z 2 ) und so weiter. Der Satz dieser Konstanten C, für die die Sequenz z 1 , z 2 , z 3 , ... ist beschränkte , dh es ist nicht bis ins Unendliche geht, ist die Mandelbrot-Menge (der schwarze Satz in der Abbildung auf der Wikipedia-Seite).

In der Praxis zeichnen die Mandelbrot-Menge sollten Sie:

  • Wählen Sie ein Rechteck in der komplexen Ebene (zum Beispiel von Punkt-zu-Punkt -2-2i 2 + 2i).
  • Bedecken das Rechteck mit einem geeigneten rechteckigen Gitter von Punkten (etwa 400x400 Punkte), die auf die Pixel auf dem Monitor abgebildet wird.
  • Für jeden Punkt / Pixel, lassen C der Punkt sein, Rechen-, sagen wir, 20 hinsichtlich der entsprechenden iterierten Abfolge z 1 , z 2 , z 3 , ... und prüfen, ob es "geht bis ins Unendliche". In der Praxis können Sie überprüfen, während der Iteration, wenn der Absolutwert von einer der 20 Begriffe größer als 2 (wenn eine der Bedingungen der Fall ist, werden die nachfolgenden Bedingungen unbegrenzt sein garantiert). Wenn einige z_k tun „geht bis ins Unendliche“ die Folge; Andernfalls können Sie es als begrenzt betrachten.
  • Wenn die Sequenz zu einem gewissen Punkt C entspricht, begrenzt ist, das entsprechende Pixel auf dem Bild in Schwarz ziehen (es an die Mandelbrot-Menge gehört). Ansonsten ist es in einer anderen Farbe zeichnen. Wenn Sie wollen Spaß haben und ziemlich Plots zu erzeugen, ist es in verschiedenen Farben auf der Größe von abs (20. Begriff) abhängig machen.

Die erstaunliche Tatsache über Fraktale ist, wie wir ein enorm komplexen erhalten können (insbesondere die Grenze der Mandelbrot-Menge) von leicht und scheinbar harmlosen Anforderungen.

Genießen Sie!

Wenn komplexe Zahlen geben Sie Kopfschmerzen, gibt es eine breite Palette von Fraktalen, die ein L-System formuliert werden können. Dies erfordert ein paar Schichten interagieren, aber jeder ist insofern interessant es für sie.

Zuerst müssen Sie eine Schildkröte. Nach vorne, nach hinten, links, rechts, Pen-up, Pen-down. Es gibt viele Spaßformen mit Schildkröte Grafiken mit Schildkröte Geometrie auch ohne L-System ist es die Fahrt gemacht werden. Suche nach „LOGO Grafiken“ oder „Turtle Grafiken“. Ein voller LOGO System in der Tat ist ein Lisp Programmierumgebung unter Verwendung eines unparenthesized Cambridge Polnisch Syntax. Aber man muss ein paar schöne Bilder nicht gehen fast so weit zu kommen, das Schildkröte Konzept.

Dann müssen Sie eine Schicht, die ein L-System auszuführen. L-Systeme sind in Bezug auf Post-Systeme und Semi-Thue-Systeme und wie virii, sie die Grenze von Turing Vollständigkeits spreizen. Das Konzept ist string-Umschreiben . Es kann als Makro-Erweiterung oder ein Verfahren mit zusätzlichen Kontrollen gebunden der Rekursion eingestellt umgesetzt werden. Wenn Makro-Expansion (wie in dem Beispiel unten), werden Sie noch brauchen eine Prozedur gesetzt Symbole Schildkröte Befehle und ein Verfahren zur Karte durch den Strang oder Array zu durchlaufen das codierte Schildkröte Programm auszuführen. Für einen begrenzten-Rekursion Verfahren Satz ( zB. ), betten Sie den Schildkröte Befehle in den Verfahren und entweder Rekursion-Level-Kontrollen zu jedem Verfahren hinzuzufügen oder es zu einer Behandlungsfunktion ausklammern.

Hier ist ein Beispiel einer Baumes Pythagoras in Postscript mit Makro-Expansion und einen sehr abgekürzten Satz von Schildkröte Befehlen. Für einige Beispiele in Python und Mathematica, siehe meine Code Golf Herausforderung .

ps l-System Pythagoras Baum luser-droog

Es ist ein großes Buch namens Chaos und Fraktale dass einfachen Beispiel-Code hat am Ende jedes Kapitels, die einige fraktale oder andere Beispiel implementiert. Vor langer Zeit, als ich das Buch gelesen, konvertierte ich jedes Beispielprogramm (in einigem Grunde Dialekt) in ein Java-Applet, das auf einer Webseite ausgeführt wird. Die Applets sind hier: http://hewgill.com/chaos-and-fractals/

Eine der Proben ist eine einfache Implementierung Mandelbrots.

Ein weiteres hervorragendes Fraktal zu lernen, ist das Sierpinski-Dreieck Fractal.

Im Wesentlichen drei Ecken eines Dreiecks ziehen (ein gleichseitiges wird bevorzugt, aber beliebige Dreiecks funktioniert), wird ein Punkt P auf einer dieser Ecken starten. Bewegen P auf halber Strecke nach einem der Ecken 3 zufällig und ziehen es einen Punkt. bewegen P wieder auf halbem Weg in Richtung jeder beliebigen Ecke, zeichnen, und wiederholen.

Sie würden denken, dass die zufällige Bewegung ein zufälliges Ergebnis erzeugen würde, aber es ist wirklich nicht.

Referenz: http://en.wikipedia.org/wiki/Sierpinski_triangle

Das Sierpinski-Dreieck und die Koch-Kurve sind spezielle Arten von Flamme Fraktale. Flamme Fraktale sind eine sehr verallgemeinerte Art von Iterated Funktionssystem, da es nicht-lineare Funktionen verwendet.

Ein Algorithmus für IFS: es ist wie folgt:

Start with a random point.

Wiederholen Sie die folgenden oft (eine Million zumindest in Abhängigkeit von endgültiger 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 der Punkt außerhalb des Bildschirms ist, wählt zufällig einen neuen in dem Bildschirm statt.

Wenn Sie schöner Farben mögen, lassen Sie die Farbe auf der zuletzt verwendeten Transformation abhängen.

Hier ist eine einfache und leicht Code in Java für mandel und andere fraktale Beispiele zu verstehen,

http://code.google.com/p/gaima/wiki/VLFImages

Sie einfach die BuildFractal.jar laden Sie es in Java zu testen und laufen mit dem Befehl:

java -Xmx1500M -jar BuildFractal.jar 1000 1000 Standardmandel

Der Quellcode ist auch gratis zum Download / explore / bearbeiten / erweitern.

Nun, einfach und grafisch ansprechend nicht wirklich Hand in Hand gehen. Wenn Sie über die Programmierung fraktale ernst sind, dann schlage ich vor, das Lesen auf iterierte Funktionssysteme und die Fortschritte, die in wodurch sie gemacht wurden.

http://flam3.com/flame_draves.pdf

über Menschen sind mit der Suche nach Mittelpunkte für sierpinski und Koch, ich würde viel mehr empfehlen Formen zu kopieren, so dass sie die Skalierung und dann übersetzen sie die „Fraktal“ Effekt zu erzielen. Pseudo-Code in Java für sierpinski würde wie folgt aussehen:

public ShapeObject transform(ShapeObject originalCurve)
    {
        Make a copy of the original curve
        Scale x and y to half of the original
        make a copy of the copied shape, and translate it to the right so it touches the first copied shape
        make a third shape that is a copy of the first copy, and translate it halfway between the first and second shape,and translate it up
        Group the 3 new shapes into one
        return the new shape
    }

Manchmal programmiere ich Fraktale für Spaß und als Herausforderung. Sie können sie hier finden. Der Code wird geschrieben in Javascript, die P5.js Bibliothek und kann direkt aus dem HTML-Quellcode zu lesen.

Für die, die ich gesehen habe die Algorithmen ganz einfach sind, finden nur das Kernelement und dann immer und immer wieder wiederholen. Ich mache es mit rekursiven Funktionen, kann aber anders gemacht werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top