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:

  1. die Transformation soll eine Dateneingabe durch den Nutzer ermöglichen,
  2. zwei Funktionen sollen eine Auswahl bieten und
  3. 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.

Transformationsdatei öffnen

Daraufhin öffnet sich im Editor ein leeres Fenster mit den Namen Transformation1.

Leere Transformationsdatei

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…)

Neue Formel erstellen

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.

Eintrag-Identifikator

Folgende Abschnitte sollten jetzt vorhanden sein:

compressed-square {
transform:
 
default:
  title = "Compressed Square"
}

Das Grundgerüst unserer Formel

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.

User Interface

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