Barnsleys Fractal Top


Address-Coloring

Von der Adresse zur Farbe

Im letzten Kapitel haben wir gesehen, dass jeder Punkt eines IFS-Attraktors eine Adresse besitzt – eine (im Zweifel über die top address eindeutig gemachte) unendliche Folge von Abbildungsindizes, die beschreibt, wie der Punkt aus immer feineren Verschachtelungen der Selbstähnlichkeitskopien hervorgeht. Address-Coloring ist die Idee, diese Adresse nicht nur zur geometrischen Konstruktion des Punktes zu nutzen, sondern direkt in eine Farbe zu übersetzen: man definiert eine Abbildung

c : Σ → Farbraum, σ ↦ c(σ)

vom Adressraum in einen Farbraum (etwa RGB oder HSB) und färbt jeden Punkt x = π(σ) des Attraktors mit der Farbe c(σ) seiner Adresse. Damit ist Color Stealing – die Übertragung von Farbe aus einem zweiten IFS oder einem Foto – nur ein Spezialfall: dort wird c konkret dadurch realisiert, dass dieselbe Adresse in ein zweites, farbgebendes IFS eingesetzt wird. Address-Coloring im Allgemeinen verlangt das nicht – die Farbfunktion c kann ebenso gut direkt, über eine geeignete Funktion, definiert werden.
Da eine unendliche Sequenz im Computer nicht direkt dargestellt werden kann, nutzt man k Schritte der Generierung (die jüngste Geschichte oder die historische Abfolge der Funktionsaufrufe), um den Farbton zu bestimmen. Statt nur zu zählen, wie oft ein Pixel getroffen wurde, schaut man sich an, welche Funktionen in den letzten Schritten der Rekursion angewendet wurden.
Die ersten Funktions-Nummern einer Adresse bestimmen meist den groben Sektor oder Hauptast des Fraktals (Makro-Struktur).
Spätere Funktions-Nummern in der Sequenz verfeinern die Farbe, sodass feine Farbnuancen entstehen, die die Selbstähnlichkeit und die Nachbarschaftsbeziehungen im Codespace widerspiegeln.
Address Coloring macht visuell sichtbar, wie der Codespace auf die Ebene abgebildet wird. Sprünge in den Farben zeigen auf, wo verschiedene Zweige des IFS zusammenstoßen, was besonders bei nicht-affinen Systemen (wie Fractal Tops) entscheidend ist, um Überlappungen und die Topologie des Attraktors zu verstehen.

(Address-Coloring beim Blatt-Attraktor)

Eine rekursive Konstruktion für c

Praktisch läuft das beim Chaos-Game-Rendering darauf hinaus, dass man parallel zum geometrischen Punkt eine laufende Farbe mitführt und sie bei jedem Schritt ein Stück in Richtung der Basisfarbe der gerade gewählten Abbildung zieht .
Jeder geometrischen Abbildung fi wird eine Basisfarbe ki zugeordnet, und die Farbe wird Adressziffer für Adressziffer rekursiv aufgebaut. Damit Address-Coloring zu zusammenhängenden, erkennbaren Farbregionen führt und nicht zu Bildrauschen, muss die Farbfunktion c mit der Topologie des Adressraums verträglich sein: Adressen mit langem gemeinsamem Präfix – also Punkte aus derselben, tief verschachtelten Selbstähnlichkeitskopie – müssen auf ähnliche Farben abgebildet werden. Die rekursive Konstruktion aus dem vorigen Abschnitt garantiert das automatisch, weil frühe (also in der Präfix-Ordnung erste) Adressziffern das stärkste, am längsten nachwirkende Gewicht erhalten.
Am besten schauen Sie sich den Programmcode für die Farbbestimmung an:

color farbeAusAdresse(int[] adresse, int tiefe) {
   float basis = 3.0;
   float faktor = 1.0/basis;
   float ergebnisRot=0, ergebnisGruen=0, ergebnisBlau=0;
   int tiefeFarbe = round(tiefe/3.0);//Adresse in drei Teile (Kanäle) zerlegt

    for (int i = 0; i < tiefeFarbe; i++) {
       ergebnisRot += (adresse[tiefe - 1 - i]-1) * pow(faktor, i);
    }
   for (int i = 0; i < tiefeFarbe; i++) {
        ergebnisGruen += (adresse[tiefe - 1 - tiefeFarbe - i]-1) * pow(faktor, i);
   }
   for (int i = 0; i < tiefeFarbe; i++) {
        ergebnisBlau += (adresse[tiefe - 1 - 2*tiefeFarbe - i]-1) * pow(faktor, i);
    }
    rot = 255*ergebnisRot/basis; rot = constrain(rot,0,255);
    gruen = 255*ergebnisGruen/basis; gruen = constrain(gruen,0,255);
    blau = 255*ergebnisBlau/basis; blau = constrain(blau,0,255);
    return color(rot, gruen, blau);
}

Der Faktor 1.0/basis wirkt über pow(faktor,i) auf die Größe des Farbbeitrages für jedes i. Dieser wird für größere i immer kleiner. Daher ist wie gewünscht eine frühe Adressziffer von größerer Wirkung als eine späte.
Die Adresstiefe gibt die Anzahl der Funktionsnummern in einer Adresse an. Wie groß kann sie werden?
Bei einer Adresstiefe von beispielsweise 18 trägt jede Farbe eine Tiefe von 6. Sinnvoll ist der Wert ja nur, wenn der kleinste Faktor pow(1/3,5) etwas zum Ergebnis beitragen kann. Mit einem print-Befehl an geeigneter Stelle in obigem Code, kann man dies nachprüfen.

In der folgenden App können Sie Address-Coloring für den Barnsley Farn testen.


Tasten- oder Mausaktion Wirkung
Taste w Hintergrund weiß/schwarz
Taste 2 Iterationen verdoppeln
Taste i Farben invertieren
Taste t Adresstiefe 15, 18, 3, 6...
Rechts-Klick ins Fenster An dieser Stelle zoomen

Ausblick

Address-Coloring liefert also den allgemeinen Rahmen. Color Stealing aus einem Foto ist die naheliegendste und visuell reichhaltigste Ausprägung davon, weil an die Stelle einer einfachen Farb-Rekursion die volle Farbvielfalt eines echten Bildes tritt. Im nächsten Kapitel gehen wir auf genau diesen Schritt ein: wie man die Adresse nutzt, um statt einer berechneten Farbe einen konkreten Bildpunkt eines Fotos auszuwählen.


Sketch Address-Coloring Farn
Sketch Address-Coloring Blatt


Menu