Jeffrey Cross
Jeffrey Cross

Codebox: Erstellen Sie eine fraktale Menagerie

Ein Fraktal ist laut Wikipedia eine „grobe oder fragmentierte geometrische Form, die in Teile aufgeteilt werden kann, von denen jedes (zumindest ungefähr) eine verkleinerte Kopie des Ganzen ist.“ Eines der coolen Dinge an Fraktalen ist das Sie verwenden sehr einfache Prozesse, um wirklich komplexe, natürlich aussehende Objekte wie Pflanzen, Wolken, Flammen usw. zu erstellen. Diese Codebox zeigt Ihnen, wie Sie eine Fraktal-Menagerie erstellen, um einige verschiedene Fraktalstile anzuzeigen:

Im weiteren Verlauf werden die objektorientierten Programmierungskonzepte (OOP), die in Kapitel 9 von Erste Schritte mit der Verarbeitung eingeführt wurden, erweitert. Außerdem wird gezeigt, wie Sie mit der großen controlP5-Bibliothek vertraute GUI-Steuerelemente erstellen, die in anderen Sprachen verwendet werden .

IFS Fraktale

Das Iterierte Funktionssystem (IFS) ist eine der einfachsten Techniken zur Erzeugung natürlich wirkender Fraktale. Das IFS besteht aus einer Handvoll Transformationen (mehr dazu in einer Sekunde), die beschreiben, wie ein Punkt in einen anderen umgewandelt wird. Der Barnsley-Farn, der wie ein schwarzes Spleenwort (eine Art Farn) aussieht, ist das klassische Beispiel eines IFS-Fraktals, aber es gibt viele Varianten. Larry Riddle hat auf seiner IFS-Systems-Seite einen schönen Überblick über andere.

Die Technik funktioniert so. Ausgehend von einem einzigen Punkt (normalerweise (0,0)) wenden Sie eine der Transformationen des IFS-Systems zufällig an. Sobald Sie den neuen, transformierten Punkt haben, zeichnen Sie ihn auf dem Bildschirm auf, den wir in Bearbeitung mit dem einstellen() Befehl. Dann wiederholen Sie den Vorgang erneut ab dem gerade berechneten Punkt.

Nach ein paar hundert Iterationen sehen Sie einen geisterhaften Umriss eines Farns. Nach 100.000 Iterationen sehen Sie ein detailliertes Bild, das fast genauso aussieht wie ein natürliches Objekt. Das folgende Bild zeigt das IFS-System für den Barnsley-Farn sowie das Bild, das sich ergibt, wenn Sie den Prozess immer wieder anwenden.

Lass uns die Details etwas mehr auspacken. Eine Transformation ist eine Formel, die einen Punkt in einen anderen Punkt umwandelt. Genau wie die Umwandlungs-, Rotations- und Skalierungsumwandlungen, die auf Seite 104 von Erste Schritte mit der Verarbeitung beschrieben werden, ordnen die Umwandlungen im IFS-System einen Punkt auf eine neue Position zu, indem eine Transformationsmatrix verwendet wird. Dies ist eine Abkürzung für die Darstellung eines Satzes von Formeln .

Die Tabelle, die das IFS-System definiert, enthält die in den Matrizen verwendeten Werte. Die Spalten a, b, d, d, e und f repräsentieren die verschiedenen Elemente in einer Matrix. (Ich werde in einer Sekunde über die Spalte p sprechen.) Die nächste Abbildung zeigt, wie eine Zeile in einem IFS-System in eine Matrix übersetzt wird:

Als Beispiel ist hier die dritte Transformationsmatrix für den Barnsley-Fern, die zuvor gezeigt wurde:

Die letzte Spalte in der IFS-Matrix, p, gibt die Häufigkeit an, mit der die Transformation ausgewählt wird. Für den Barnsley-Farn wird also Transformation f1 1% der Zeit ausgewählt, f2 85% der Zeit und f3 und f4 jeweils 7% der Zeit. Wenn dies etwas verwirrend ist, stellen Sie sich vor, als hätten Sie eine Tüte mit 100 Kugeln gefüllt, die jeweils mit einer dieser Funktionen beschriftet sind. Sie haben 1 Marmor für f4, 85 für f2, 7 für f3 und 7 für f4. Bei jeder Wiederholung greifen Sie zufällig einen Marmor aus der Tasche, schauen sich das Etikett an, wenden die entsprechende Transformation an und lassen den Marmor dann wieder in die Tasche fallen.

controlP5

Nachdem Sie nun die Grundidee der IFS-Fraktale verstanden haben, werfen wir einen Blick auf controlP5, eine Codebibliothek von Andreas Schlegel zum Erstellen vertrauter Benutzereingabesteuerelemente wie diese:

Wir verwenden nun den Drehknopf, mit dem der Benutzer die Anzahl der Iterationen festlegen kann, mit denen die Zeichnung erstellt wurde, und mit dem Funkschalter können Sie auswählen, welches IFS-System angezeigt werden soll.

Bevor wir die Bibliothek in unserer Skizze verwenden können, müssen wir sie installieren. Der erste Schritt besteht darin, sicherzustellen, dass sich in Ihrem Sketchbook-Verzeichnis ein Verzeichnis mit dem Namen "Bibliotheken" befindet. Sie finden das Sketchbook-Verzeichnis, indem Sie das Fenster Preferences der Verarbeitung öffnen. Der Verzeichnisname wird oben angezeigt:

Nachdem Sie das Hauptverzeichnis gefunden haben, verwenden Sie ein Tool wie den Windows-Explorer, den Finder von Mac oder das vertrauenswürdige UNIX-Terminal, um zu prüfen, ob es ein Unterverzeichnis mit dem Namen "Bibliotheken" gibt. Wenn ja, sind Sie alle gesetzt. Wenn nicht, erstellen Sie das Unterverzeichnis (nennen Sie es "Bibliotheken").

Als Nächstes können Sie controlP5 installieren. Gehen Sie zur controlP5-Hauptseite und klicken Sie auf den Link, um die neueste Version der Bibliothek herunterzuladen. (Sie finden den Link in der grünen Box oben in der Mitte des Bildschirms.) Wenn Sie die Datei heruntergeladen haben, dekomprimieren Sie sie und kopieren Sie die Dateien in Ihr Unterverzeichnis „Libraries“. Starten Sie die Verarbeitung erneut, und Sie sollten die Bibliothek unter dem Menüpunkt "Sketch -> Import Library" sehen.

Starten Sie nach der Installation der Bibliothek die Verarbeitung erneut. Jetzt können wir ein wenig darüber sprechen, was die fraktale Seite des Projekts ist.

Richten Sie die Skizze ein

Wütend! Das war eine Menge Übersichtsmaterial, aber jetzt, da controlP5 installiert ist, können wir das bereits beschriebene IFS-System mithilfe von Processing implementieren. Starten Sie die Verarbeitung, und fügen Sie den folgenden Code in den Texteditor ein. (Wie immer können Sie entweder den gesamten Code in dem folgenden Feld hervorheben und dann ctrl_c drücken, oder Sie können auf diesen Link zu controlp5_fractals.pde klicken und dann die Kombination ctrl + a, ctrl + c verwenden.) Hier ist die Codebox:

Beim Durchgehen des Beispiels werden Sie wahrscheinlich eines bemerken: Es enthält mehrere Klassendefinitionen am Ende der Datei. In der letzten Codebox, SWAT und (Arraylist) von Zielen setzen wir alle Klassen in separate Registerkarten. Dies ist jedoch nicht erforderlich - es ist vollkommen in Ordnung, sie alle in einer einzigen Datei zusammenzufassen, wie ich es hier gemacht habe. Wenn Sie sie in separate Registerkarten aufteilen möchten, geben Sie der Datei nur den Namen der Klasse.

Starten Sie den Code und Sie sollten etwas ähnliches sehen, das dem Video am Anfang dieses Beitrags ähnelt. Sie können auf die Optionsfelder klicken, um eines aus einer Vielzahl verschiedener IFS-Fraktale auszuwählen. Außerdem können Sie mit dem Drehregler die Anzahl der Iterationen einstellen.

Diskussion

Der Code definiert drei Klassen, die als Baustein für das Projekt dienen:

  • Die Transform-Klasse. Diese Klasse führt alle an der Transformationsmatrix beteiligten Mathematik aus. Der größte Teil des Codes dient dazu, alle Variablen einfach zu speichern. Das evalX () und evalY () Gibt die neuen X- und Y-Koordinaten für den Punkt zurück, an dem Sie vorbeigehen.
  • Die IFS-Klasse. Diese Klasse implementiert die IFS-Datenstrukturen. Es besteht aus einer ArrayList von Transform-Klassen, die aufgerufen werden transformiert, eine ArrayList, die die Häufigkeitsverteilung der aufgerufenen Transformationen darstellt Histogramm (In Erweiterung unserer früheren Analogie ist dies die Murmeltasche, aus der wir die zufällige Transformation auswählen) und eine Beschreibung. Die wichtigsten Methoden sind: addTransform (), die eine neue Transformation für die verwandeln Liste; addHistogram (), was dem Marmor einen neuen "Marmor" verleiht Histogramm Häufigkeitsverteilung basierend auf den Transformationen p Wert; und selectRandomTransform (), die verwendet wird, um eine der Transformationen nach dem Zufallsprinzip auszuwählen, basierend auf der in der angegebenen Frequenzverteilung Histogramm Anordnungsliste.
  • Die Point-Klasse. Hält die X- und Y-Koordinate für die Punkte im Fraktal.

Wir verwenden diese Klassen im Hauptprogramm auf verschiedene Arten. Erstens verwenden wir im wahrscheinlich auffälligsten Teil des Codes IFS und Transformation, um die verschiedenen Fraktale zu definieren, die wir anzeigen möchten. Hier ist zum Beispiel der Code zum Erstellen des Barnsley Ferns:

c = new IFS ("Classic Barnsley Fern"); c.addTransform (neue Transformation (0,0, 0,0, 0,0, 0,16, 0,0, 0,0, 0,01)); c.addTransform (neue Transformation (0,85, 0,04, -0,04, 0,85, 0,0, 1,6, 0,85)); c.addTransform (neue Transformation (0,2, -0,26, 0,23, 0,22, 0,0, 1,6, 0,07)); c.addTransform (neue Transformation (-0,15, 0,28, 0,26, 0,24, 0,0, 0,44, 0,07)); pattern.add (c);

Und hier ist der Code zum Definieren der Drachenkurve:

c = neues IFS ("Drache"); c.addTransform (neue Transformation (0,5, -0,5, 0,5, 0,5, 0,0,0,0, 0,50)); c.addTransform (neue Transformation (-0,5, -0,5,0,5, -0,5,1,0,0,0, 0,50)); pattern.add (c);

Als nächstes richten wir den Drehregler controlP5 und das Optionsfeld ein. Dies erfordert 2 Teilschritte. Das erste kommt im vor Konfiguration() Methode, bei der die beiden Steuerelemente der Skizze hinzugefügt werden. Das Hinzufügen des Reglers ist ziemlich einfach und erfordert nur eine Zeile:

IterationsKnob = controlP5.addKnob ("IterationsKnob", N_MIN, N_MAX, N, 10,10,50);

Das Optionsfeld erfordert nur etwas mehr Code, da zusätzlich zum Steuerelement selbst die Elemente hinzugefügt werden müssen, die ausgewählt werden können. Dies geschieht durch Durchlaufen der ArrayList von IFS-Mustern und anschließendes Verwenden von Beschreibung Feld als Auswahlelement im Optionsfeld. Hier ist der Code:

ifsRadio = controlP5.addRadio ("ifsSelect", 70,10); for (int i = 0; i <pattern.size (); i ++) {IFS p = (IFS) pattern.get (i); ifsRadio.add (p.description, i); }

Der zweite Teil der Verwendung der controlP5-Bibliothek ist das Einrichten Aktionsmethoden die ausgelöst werden, wenn der Benutzer mit dem Steuerelement interagiert. Der Schlüssel ist, der Methode den gleichen Namen wie die * description * zu geben, die Sie beim Hinzufügen des Steuerelements verwendet haben, nicht den Namen der Instanzvariablen des Steuerelements. Zum Beispiel, wenn wir das hinzugefügt haben ifsRadio Kontrolle haben wir genutzt ifsSelect als Beschreibung. Das bedeutet, dass wir eine entsprechende Methode benötigen ifsSelect () um Klicks zu erhalten, die Benutzer auf dem Steuerelement machen. Diese Methode muss auch einen Parameter haben, der den aktuellen Wert des Steuerelements enthält.

Also für die ifsSelect () Methode haben wir einen Parameter, der uns den Index des gerade ausgewählten Listenelements angibt. Wir verwenden diesen Index dann, um das korrekte IFS-Muster abzurufen und es zum aktuellen zu machen. Das folgende Diagramm fasst alle Elemente zusammen, die sich im Spiel befinden. (Die controlP5-Steuerelemente funktionieren alle etwas anders, aber die Site bietet großartige Beispiele für deren Verwendung.):

Das letzte Puzzleteil ist das makeIFS () Methode, die die eigentlichen Berechnungen zur Erstellung des Fraktals durchführt. Weil IFS-Systeme so elegant sind, gibt es wirklich nicht viel zu sagen. Wir durchlaufen einfach die in der Variablen angegebene Anzahl von Iterationen N (dessen Wert wurde vom festgelegt IterationKnob () Methode), ziehen Sie eine Transformation aus dem aktuellen IFS-System (dessen Wert im ifsSelect () method), und fügen Sie dann jeden Punkt in das Array der Point-Objekte ein. Wir verfolgen auch die Bereiche der X- und Y-Werte, damit wir das Bild skalieren können, um den Zeichenbereich zu füllen.

Mehr: Alle Codebox-Spalten anzeigen

In der Schuppenhalle:


Erste Schritte mit Processing Lernen Sie die Computerprogrammierung auf einfache Weise mit Processing, einer einfachen Sprache, mit der Sie Code zum Erstellen von Zeichnungen, Animationen und interaktiven Grafiken verwenden können. Programmierkurse beginnen normalerweise mit der Theorie, aber in diesem Buch können Sie direkt in kreative und unterhaltsame Projekte einsteigen. Es ist ideal für alle, die die Grundlagen der Programmierung erlernen möchten, und ist eine einfache Einführung in die Grafik für Personen mit Programmierkenntnissen.

Aktie

Leave A Comment