PHP: Organisation der grafischen Algorithmen

Lesezeit: 12 Minuten

Bevor ich weitere Filter und Generatoren-Algorithmen erstelle, sollte ich mich um Ordnung bemühen. Die zu erstellenden Klassen sollten strukturell zusammenpassen.

Speziell beim Voronoi-Diagramm stört mich die Laufzeit, schön wäre hier ein Caching-Mechanismus, der Zeit spart.

Ich nutze dazu eine Eigenschaft von PHP, die in anderen Programmiersprachen ihresgleichen sucht: das Instanziieren von Klassen mit einem Namen aus einer Variablen.

Grundidee

Eine Textur (oder Material) wird in mehreren aufeinanderbauenden Schritten erstellt. Gezeigt habe ich das hier: Mission on Mars: UV-Map generieren

Ausgehend von einem Wolkenmuster ging es hin zu einer Höhenmap für Sand und Steine. Zwei der eingesetzten Algorithmen habe ich in den vorherigen Blogs ja erklärt bzw. sogar die Sourcen bereitgestellt: Algorithmus: Diamond-square und Algorithmus: Voronoi-Diagramm.

Weiter folgen in den nächsten Blogs. Allerdings möchte ich dies effizient gestalten.

Ich stelle mir so etwas vor:

Und wenn ich die Parameter vom Voronoi-Diagramm verändere, muss ich ja nicht den vorherigen Diamond-Square-Algorithmus neu berechnen.

Substance Klasse

Highlight der Substance-Klasse ist das instanziieren der Filter bzw. Generatoren – abstrakt mal Plugin genannt:

Der Name der übergebenen Klasse kann in PHP eingesetzt werden, um ein neues Objekt zu erstellen new $class() ist also new Vornoi() oder new Cloud().

Algorithmus-Klasse

Das soll die Basis-Klasse der erstellten Algorithmen sein. Dort sind ein paar Hilfsfunktionen untergebracht, entscheidend ist aber das Speichern der Parameter und der Ausgangspunkte. Damit lässt sich eine ID erstellen, die fürs Cachen wichtig ist. Im Konstruktor wird die Basis dafür gelegt:

Ein Mitführen vom Ausgangspunkt (input) ist deswegen wichtig, weil ja ein Algorithmus mit gleichen Parameter auf unterschiedlichen Bildern etwas anderes bewirkt.

Weitere Parameter kann die abgeleitete Klasse autark hinzupacken. Die ID erstellt sich dann so:

Ich benutze da zwei Hash-Funktionen, um ggf. Kollisionen von Dateinamen zu vermeiden.

Das Cache-Verzeichnis sieht nach ein paar Aufrufen so aus:

Alle relevanten Parameter der Algorithmus-Klassen sind im JSON-File handlich untergebracht. Das Endergebnis dieser Operation zusätzlich im separaten PNG-File.

Anpassung Generatorklasse am Beispiel Voronoi

Die im Artikel Algorithmus: Voronoi-Diagramm gezeigt Klasse passe ich ein wenig an. Zuerst soll sie mal ableiten:

Und mit wenigen Handgriffen, ist die Init-Funktion auf die Bedürfnisse erweitert:

Namespaces und Organisation im Projekt

Meine Klassen, Filter und Generatoren bringe ich so unter:

Füge ich nun Generatoren und/oder Filterklassen hinzu, benötige ich keine weiteren Anpassungen in der Substance. Über das Weiterleiten von Initialisierung-Parametern muss ich mir auch keine Gedanken machen: nur noch auf den Algorithmus fixieren.

Weiterführende Links

Wie im Screenshot zu sehen, beschäftige ich mich gerade mit einem Blur-Algorithmus. Das wird Thema des nächsten Blog: Algorithmus: Faltungsmatrix

Nun aber wie gewohnt noch die PHP-Sourcen in Gänze.

PHP-Implementierung

Substance

Algorithm

Cloud (Diamond-square) in der angepassten Form

Voronoi – dito

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.