Chaos Game: IFS coloring




Überblick


Wie viele verschiedene Methoden der Farbgebung gibt es bei Attraktoren und Fraktalen? Die Frage ist nicht beantwortbar, weil es unzählige Umsetzungen gibt, die nicht veröffentlicht werden. Erfunden haben sie diejenigen, die mit den so erzeugten Bildern Geld verdienen wollen...
Beschränken wir uns auf die Frage, wie viele Methoden auf dieser Homepage verwendet werden.

1. Funktions-indiziertes Färben:

    Jeder Funktion des IFS wird eine Farbe zugeordnet. Das Sierpinski Dreieck wurde damit eingefärbt. Diese Art der Colorierung ist hilfreich, wenn man Selbstähnlichkeit erkennen will.

2. Dichtefärbung:

    Hier wird ein "Maß" verwendet. Zum Beispiel die Anzahl der Treffer für jedes Pixel. Mit dieser Größe bestimmen wir die zugehörige Pixelfarbe. Die durch die IFS beschriebene Menge zusammen mit ihrem Maß, nennt man Measure-Attraktor. Angewandt wurde das Verfahren hauptsächlich im Kapitel Attraktore. Man benötigt dafür zunächst einen Farbverlauf. Die Ergebnisse sind erstaunlich gut, sofern man den Logarithmus der Anzahl, multipliziert mit einen geeignetem Faktor, verwendet. Der Grund dafür ist, dass die Variationsbreite der Anzahl Treffer sehr groß sein kann. Man kann keinen Farbverlauf finden, der etwa 10 Treffer gegen 100 000 Treffer mit weichem Farbübergang darstellen kann.

3. Escape Time Ansatz:

   Das Verfahren kennen Sie vom Mandelbaum Fraktal. Man prüft beispielsweise nach, wieviele Iterationsschritte notwendig sind, bis sich zwei benachbarte Interationswerte um weniger als 0.0000001 unterscheiden.

4. Color stealing:

   Die Methode wurde im letzten Abschnitt behandelt. Mittels einer zweiten IFS-Iteration bestimmt man den Ort (x,y) auf einem vorgegebenen Bild. Mit der Farbe dort wird das Pixel, das bei der ersten IFS-Iteration erreicht wird, gefärbt. Wir haben es also mit zwei Bildern zu tun. Das erste Bild soll den Attraktor bzw. das Fraktal enthalten, das zweite Bild ist eine Vorlage. Aus ihr "stiehlt" das Programm die Farbe.

5. IFS Färbung:

Genau davon handelt dieses Kapitel.

Idee


Die kompakte Menge, die mittels kontrahierendem IFS beschrieben wird, bezeichnet man als Set-Attraktor. Ein Maß ist hier nicht definiert. Trotzdem wollen wir eine weitere Färbung finden, die einer funktions-indizierten Färbung überlegen, aber nicht die Color-stealing-Methode ist. Bei letzterer lief ein zweites IFS mit, mit dessen Hilfe man aus einem vorgegebenen Bild die Farbe des aktuellen Pixels ausliest.
Bei der IFS-Färbung nutzen wir ebenfalls ein zweites IFS mit sechs Paramtern und drei Ausgabe-Variablen. Allerdings wird hier die Färbung für einen neuen Punkt mittes der drei Ausgaben des "Farb-IFS" berechnet. Zum besseren Verständis schauen wir uns die entprechenden Programmcode an:

float[] apply(float[] daten) {
    float x = a * daten[0] + b * daten[1] + e;
    float y = c * daten[0] + d * daten[1] + f;
    float R = aR + AR*daten[2];
    float G = bG + BG*daten[3];
    float B = cB + CB*daten[4];
    daten[0]=x;daten[1]=y;daten[2]=R;daten[3]=G;daten[4]=B;
    return daten;
}
Die Berechnung für die Geometrie (daten[0] und daten[1], also x und y) und die für die drei Farben rot, grün und blau (R,G und B), packen wir in die Methode apply. Für die Berechnung der Farbe verwendet man dreier Variablen( daten[2], daten[3],daten[3]), die sechs Paramter fordern (aR, AR, bG, BG, cB und CB mit colorMode(RGB)). Barnsley wählt in seinem Buch "Superfracts" für aR,bG und cB Werte zwischen 0 und 200. Die Faktoren vor AR, BG und CB sind bei ihm zwischen 0.1 und 0.7. Das hat den Vorteil, dass man weder negativen Farbwerte noch solche über wesentlich über 255 bekommt. (Rein theoretisch wäre ein Farbwert wie 200+200*0.7 = 340 möglich. Dies dürfte, wenn überhaupt, aber sehr selten passieren.)
Um größere Farbvariationen zu erreichen, gehen wir einen leicht anderen Weg. Alle Parameter dürfen aus dem Bereich von -0.9 und 0.9 gewählt werden. Negative Parameter bilden aber die Ausnahme. Nun bestimmt man in einem ersten Programmstart die minimalen und maximalen Ergebnisse für R,G und B. Über die map()-Methode berechnen wir damit den Farbwert zwischen 0 und 255 für alle drei Farben. Schauen Sie sich die Iterationsschleife an:
for (int i = 0; i <maxIter; i++) {
    float R = random(1);
    IFSTransform transform1 = ifs.getTransform(R);
    daten = transform1.apply(daten);
    nx = map(daten[0], xU, xO, 0, width); xI = round(nx);
    ny = map(daten[1], yU, yO, height, 0); yI = round(ny);

    //Punkte nur auf dem Bildschirm (Verlust an Information)
    if(xI > width-1) xI = width-1; if(xI < 0) xI = 0;
    if(yI > height-1) yI = height-1; if(yI < 0) yI = 0;

    //Minima und Maxima berechnen
    if(daten[2] <rMin)rMin=daten[2];if(daten[2]>rMax)rMax=daten[2];
    if(daten[3] <rMin)gMin=daten[3];if(daten[3]>gMax)gMax=daten[3];
    if(daten[4] <bMin)bMin=daten[4];if(daten[4]>bMax)bMax=daten[4];

    //Erster Start rechnet mit Min = 0 und Max = 1 bei allen Farben
    if(!fKorrektur) {
        rot = round(255*daten[2]);gruen = round(255*daten[3]);blau = round(255*daten[4]);
        rS=rS+rot;gS=gS+gruen;bS=bS+blau;
    }

    //wenn rMin, rMax, etc bekannt sind
    else{
        rK = map(daten[2],rMin,rMax,0,255);rS=rS+rK;
        gK = map(daten[3],gMin,gMax,0,255);gS=gS+gK;
        bK = map(daten[4],bMin,bMax,0,255);bS=bS+bK;
        rot=round(rK);gruen=round(gK);blau=round(bK);
    }
    stroke(color(rot,gruen,blau));
    point(nx, ny);
}
Das boolesche Attribut "fKorrektur" kann man mit Taste 'k' auf 'true' stellen. Dann werden die wirklichen Minima und Maxima von daten[2], daten[3] und daten[4] verwendet.
In diesen Sketchen lassen sich über die Tasten 'r','R', 'g', 'G', 'b' und 'B' die Parameter AR, BG und CB vergrößern bzw. verkleinern. Damit kann man auf einfache Weise die Farbgebung beeinflussen. Um einen Überblick zu haben, ist es sinnvoll, sich die Farbdurchschnitte von R,G und B und die Minima bzw. Maxima von daten[2], daten[3] und daten[4] ausgeben zu lassen. So kann das dann nach dem ersten Programmstart aussehen:

Durchschnitte rot: 178.11542 grün: 222.59183 blau: 123.9007
daten[2] zwischen -0.5425 und 1.5446446
daten[3] zwischen -0.38000554 und 1.2175996
daten[4] zwischen 0.0 und 3.0494277

In diesem Fall erkennt man zweierlei: erstens ist die Farbe blau nicht sonderlich hell und zweitens wird erkennbar, dass der erste Programmdurchlauf mit den Minima 0 und Maxima 1 die Variationsbreite stark einschränkt.
Um mit Color-stealing aus dem letzten Abschnitt vergleichen zu können, sehen wir und die dort behandelten Fälle Blatt, Farn, Spirale und Drachen an. Das erste Bild ist jeweils mit den Standardparametern erzeugt, das zweite zeigt ein Ergebnis mit davon leicht veränderten Parametern (Taste 'l');

Blatt




Farn




Spirale




Drache




Die zugehörigen Sketche können weiter unten heruntergeladen werden. Es gibt etliche Möglichkeiten mittels keyPressed()-Methode auf die Entwicklung des Bildes Einfluss zu nehmen. Außerdem ist die mousePressed()-Methode implementiert, mit deren Hilfe Sie in das Bild hinein oder aus ihm heraus zu zoomen können.





Sketch IFScoloring_Blatt                 Sketch IFScoloring_Farn

Sketch IFScoloring_Spirale           Sketch IFScoloring_Drache




Menu