Im abschließenden Teil werden wir eine Formeldatei schreiben, mit deren Hilfe Ihr Euer Fraktal transformieren könnt.
Die Transformationsdatei wird im Karteireiter Abbildung (Mapping) des Werkzeugfensters Ebenen-Eigenschaften (Layer Properties) aufgerufen.
Einige Eckpunkte sollen vorab für unsere Transformation festgelegt werden:
- die Transformation soll eine Dateneingabe durch den Nutzer ermöglichen,
- zwei Funktionen sollen eine Auswahl bieten und
- es sollen vom Nutzer Zusatzfunktionen aktiviert und eingeblendet werden können.
Okay, los gehts.
Transformationsdatei erstellen
Zunächst erstellt Ihr Euch eine neue Transformationsdatei (Transformation File). Dazu wählt Ihr im Datei (File) Menü den Punkt Neu (New) aus.
Daraufhin öffnet sich im Editor ein leeres Fenster mit den Namen Transformation1.
Dieses Fenster bzw. diese Formeldatei nimmt nun nach und nach Eure Programmanweisungen auf. Damit Ihr nicht alles von Hand eingeben müsst, sind im Menüpunkt Einfügen (Insert) viele Anweisungen hinterlegt, die Ihr mit Klick einfügen könnt.
Die Formeln beginnen immer mit dem Eintrag-Identifikator, gefolgt von dessen Inhalt, der in geschweiften Klammern steht. Ihr solltet beachten, dass Leerzeichen und Tabulatoren nicht erlaubt sind. Ebenso darf der Eintrag-Identifikator innerhalb der Formeldatei nicht doppelt auftreten.
Meine-erste-Transformation {
; Inhalt
}
Kommentare in der Formel werden mit vorangestellten Semikolon gekennzeichnet. Zusätzliche globale Kommentare könnt Ihr mit dem speziellen ‚{ }
‘-Kommentar kennzeichnen.
Auch hier schreibe ich wieder einen globalen Kommentar, der folgende Inhalte aufweist:
comment {
File: Transformation1.uxf
Version: 1.0
Author: Oliver Konow, 2013
Last Modification:
}
Als nächstes folgt der Identifikator in dem Abschnitte, Funktionen und Parameter sowie weitere Einträge stehen können.
Im Menü Einfügen (Insert) findet Ihr den Punkt Neue Formel (New Formula…)
Es öffnet sich anschließend ein Fenster, in dem Ihr den Titel compressed-square eingeben könnt.
Im Gegensatz zur Fraktalformel und zum Kolorierungsalgorithmus, steht bei der Transformation weder der Bereich Symmetry noch der Bereich Usage zur Verfügung.
Den Haken am Punkt: Insert global section könnt Ihr entfernen. Falls Ihr für die verbleibenden Abschnitte keine Kommentare haben wollt, so entfernt den Haken auch am Punkt: Insert comments for each section. Drückt anschließend auf OK.
Folgende Abschnitte sollten jetzt vorhanden sein:
compressed-square {
transform:
default:
title = "Compressed Square"
}
Damit ist das Grundgerüst Eurer Formel fertig, welches Ihr an dieser Stelle speichern solltet. Im nächsten Schritt werde ich die Abschnitte näher erläutern bevor wir sie anschließend mit Variablen befüllen.
Die Abschnitte der Formel
Abschnitt: global
In der Formel ist dies der erste Abschnitt und wird nur einmal pro Bild ausgeführt. Er kann dazu verwendet werden, Suchtabellen zu füllen und Nur-Lese-Variablen zu initialisieren. Somit können viele wiederholte Berechnungen vermeiden werden.
Abschnitt: transform
Dieser Abschnitt enthält Anweisungen, um die Koordinaten des vordefinierten Symbols #pixel
auszulesen, sie anschließend zu transformieren und das Ergebnis danach wieder in das Symbol #pixel
abzulegen.
Wird #solid
auf true
gesetzt, so kann das Pixel die Hintergrundfarbe annehmen. Diese kann dann im Karteireiter Abbildung (Mapping) des Werkzeugfensters Ebenen-Eigenschaften (Layer Properties) angepasst werden
Abschnitt: default
Grundeinstellungen unserer Formel betreffend sind in diesem Abschnitt zu finden. Er kann Einstellungen wie title
, render
, precision
, helpfile
und/oder helptopic
beinhalten. Parametereinstellungen innerhalb der Blöcke param
und endparam
können ebenfalls verwendet werden.
Weitere Einstellungen sind in der Hilfedatei zu finden.
Einsetzen der Variablen in die Formel
Nachdem das Grundgerüst steht, können nun Variablen, Ausdrücke und Formeln in die entsprechenden Abschnitte eingesetzt werden.
Hinweis! Hinsichtlich der Parameter möchte ich auf den Artikel Formel schreiben – Teil 1 verweisen.
Inhalt des transform-Abschnitts
if (@mitte)
mitte = #center
else
mitte = @center
endif
Diese if
-Schleife fragt ab, ob die Einstellungen zur Bildmitte vom Karteireiter Standort (Location) übernommen (Häkchen gesetzt) oder vom Nutzer eingegeben werden soll.
float x = real(#pixel) + real(mitte)
float y = imag(#pixel) + imag(mitte)
x = x + x % @kachel
y = y + y % @kachel
Der Variable x
werden die Koordinaten des Realteils und der Variable y
werden die Koordinaten des Imaginärteils des Pixels übergeben.
Dieser Wert wird durch den benutzerdefinierten Parameter @kachel
dividiert und der Rest (Modulus) ermittelt, der abschließend mit dem Koordinatenwert addiert wird. Auf diese Weise werden neue x
– und y
-Werte ermittelt.
if @e_opt == 1
if @operator == "+"
#pixel = x + flip(y) * @fn1(x) + @fn2(y)
elseif @operator == "-"
#pixel = x + flip(y) * @fn1(x) - @fn2(y)
elseif @operator == "*"
#pixel = x + flip(y) * @fn1(x) * @fn2(y)
elseif @operator == "/"
#pixel = x + flip(y) * @fn1(x) / @fn2(y)
elseif @operator == "^"
#pixel = x + flip(y) * @fn1(x) ^ @fn2(y)
endif
else
#pixel = x + flip(y)
endif
Danach folgen zwei weitere if
-Abfragen, eine die prüft, ob das Kontrollkästchen für die erweiterten Optionen aktiviert wurde und die Andere, die überprüft, welcher Operator gewählt wurde und somit die dazugehörige Formel zum Berechnen der Pixelkoordinate verwendet.
Diese neue Koordinate #pixel
wird mit Hilfe der trigonometrischen Funktion flip
sowie zweier benutzerdefinierter Funktionen, @fn1
und @fn2
, aus x
und y
berechnet.
Ist das Kontrollkästchen für die erweiterte Option aktiviert, wird die Auswahlmöglichkeit Operator angezeigt, ansonsten wird auf eine Standardformel zurückgegriffen.
Inhalt des default-Abschnitts
title = "Compressed Square"
heading
caption = "Dateneingabe"
endheading
param @kachel
caption = "Kachelgröße"
default = 0.05
endparam
param @mitte
caption = "Bildmitte nutzen?"
default = true
endparam
complex param @center
caption = "Mitte"
default = (0.0)
visible = @mitte == false
endparam
func @fn1
caption = "Funktion 1"
default = cotanh()
endfunc
func @fn2
caption = "Funktion 2"
default = ident()
endfunc
heading
caption = "Zusatzfunktionen"
endheading
param @e_opt
caption = "Erweiterte Optionen"
hint = "Zusätzliche Optionen mit denen die Funktionsgleichungen unterschiedlich \
unterschiedlich berechnet werden."
default = false
endparam
param @operator
caption = "Operator"
enum = "+""-""*""/""^"
default = 0
visible = @e_opt
endparam
Standardmäßig ist das Häkchen zum Nutzen der Bildmitte auf true
gesetzt. Erst wenn der Parameter @mitte
den Wert false
, also das Häkchen entfernt wurde, werden die Eingabefelder Mitte (Paramerter @center
) für den Benutzer sichtbar.
Wie bereits weiter oben beschrieben, werden die Parameter der Zusatzfunktionen nur eingeblendet, wenn durch die if
-Anweisung (if @e_opt == 1
) festgestellt wurde, dass das Kontrollkästchen aktiviert ist.
Das Einblenden erfolgt mit visible = @e_opt
.
Die unterschiedlichen Auswahlmöglichkeiten zum Berechnen der Operatoren werden mittels enum
festgelegt und erscheinen anschließend in einer Dropdownliste.
Alle weiteren Einstellungen in den Parameterblöcken sind bereits im Artikel Formel schreiben – Teil 1 beschrieben und sollen an dieser Stelle nicht weiter erläutert werden.
Hier die Datei transformation1.uxf.
Ich wünsche Euch viel Spaß beim Experimentieren!
Formeln schreiben – Teil 4 by Oliver Konow is licensed under CC BY-NC-ND 4.0
Schreibe einen Kommentar