Chaos Game: Sierpinsky n-Eck Varianten
Überblick
Schauen wir uns zunächst an, was man im Vergleich zum letzten Kapitel anders machen kann. Es sind vier Dinge:
1. Man verwendet anstatt des Kissing-Ratios einen anderen Ratio-Wert.
2. Die Eckpunkte müssen kein regelmäßiges n-Eck bilden. Die Kissing-Ratio-Formel ist dann aber nicht mehr gültig!
3. Man ändert die Chaos-Game Regel.
4. Die bisher verwendete affine Abbildung, die sich aus der Iterationsvorschrift ergab, ist sehr speziell. Man
kann sie durch eine beliebige affine Abbildung ersetzten.
5. Im Anschluss an die affine Abbildung kann eine nicht-affine Abbildung angewandt werden.
In diesem Kapitel kümmern wir uns um die Punkte 1 bis 3. Die Punkte 4 und 5 bekommen je ein extra Kapitel.
1. Fall:   n = 4
Unter allen regelmäßigen n-Ecken sticht ein Fall heraus. Das Quadrat! Ein Sierpinski Quadrat gibt es
offensichtlich nicht. Kissing Ration für n = 4 ist ki = 0.5. Und so
wie unten links sieht das Ergebnis aus:
Auch wenn es hier so aussieht - einen Attraktor gibt es hier nicht! Die farblich unterschiedenen vier Teilquadrate,
die die zur entsprechenden Ecke zugehörigen Punkte markieren, sind nicht "flächenfüllend". Im zweidimensionalen
reelen (Teil-)Raum ist die Anzahl der Punkte
überabzählbar unendlich, bei einer Iteration aber nur
abzählbar unendlich .
Von einem Fraktal kann also keine Rede sein. Erhöht man aber ki nur
geringfügig, etwa ki = 0.55, dann sieht das Ergebnis (oben rechts) dem
Cantor Dust ähnlich. Und der
ist mit Sicherheit ein Fraktal. Im Folgenden lassen wir jedoch ki mit 0.5 unverändert und variieren lediglich
die Chaos Game Regeln.
2. Fall:   n = 4 und Chaos Game Regel mit erster Veränderung
Die erste Veränderung ist scheinbar gerinfügig. Wir verlangen, dass niemals zwei gleiche Ecken hintereinander
gewählt werden dürfen. Im Array history[] sind alle gewählten Ecken gespeichert. Im Programm-Code muss lediglich
folgender Einschub eingetragen werden:
while(history[i+t-1]==history[i+t] ){
j =round(random(0-0.5,n-0.5));
history[i+t] = j;
}
Eine scheinbar unwichtige Änderung in der Regel, und schon sieht das Ergebnis völlig anders aus. Im Bild oben
links wurden nur die Punkte mit ki = 0.5 eingetragen (plus zoom), daneben zusätzlich mit ka = 1.5.
3. Fall:   n = 4 und Chaos Game Regel mit zweiter Veränderung
Die zweite Veränderung schränkt weiter ein: Wurde eine Ecke zwei Mal hintereinander gewählt, darf die nächste Ecke
werder die vorherige noch die nachfolgende Nummer besitzten. Ein Beispiel: Es wurde zwei Mal hintereinander Ecke 3 gewählt.
Dann darf die folgende Ecke weder Ecke 2 noch Ecke 4 sein. Bei insgesamt vier Ecken kommen hier nur erneut die Ecke 3
oder Ecke 1 in Frage. Die Realisierung dieser Bedingung im Programmcode ist etwas trickreich:
while(history[i+t-1]==history[i+t-2] && ((abs(history[i+t]-history[i+t-1])==1 ||
(history[i+t-1]== n-1 && history[i+t]==0) || (history[i+t-1]== 0 && history[i+t]==n-1)))){
j =round(random(-0.5,n-0.5));
history[i+t] = j;
}
Mit dieser zweiten Regeländerung erhalten wir ein komplett anderes Bild. Im Bild oben
links wurden nur die Punkte mit ki = 0.5 eingetragen (plus Zoom), daneben zusätzlich mit ka = 1.5 (ohne Zoom).
4. Fall:   n = 4 und Chaos Game Regel mit variabler Veränderung
Treiben wir das Spiel auf die Spitze! Und so gehen wir vor:
Bestimme einmalig ein natürliche Zahl g kleiner gleich 10. (Oberhalb g = 10 ändert sich das Ergebnis nicht wesentlich.)
Wähle bei jeder Anwendung der CG Regel eine natürliche Zahl tZ ungleich Null, aber kleiner gleich g.
Bestimme history[i+t-tZ], also diejenige Ecke, die tZ Schritte vorher gewählt wurde.
Dann darf die aktuelle Ecke history[i+t] nicht gleich der tZ Schritte zuvor gewählen Ecke history[i+t-tZ] sein.
Beispiel: Die aktuelle Ecke wäre 4. Die Zufallszahl tZ hätte 5 ergeben. Nun schlägt man nach, welche Ecke fünf Schritte
zuvor gewählt wurde. Sagen wir es wäre die Ecke 4. Das heißt, man muss die aktuelle Ecke solange ändern,
bis nicht mehr 4 gewählt wird. Und dies machen wir bei jedem Punkt innerhalb der Iteration. Das muss doch Chaos geben, oder?
Offensichtlich nicht! Im Bild oben
links wurden nur die Punkte mit ki = 0.5 eingetragen (plus zoom), daneben zusätzlich mit ka = 1.5. So realisieren
wir diese neue CG Regel:
tZ =round(random(0.5,g-0.5));
while(history[i+t-tZ]==history[i+t] ){
j =round(random(0-0.5,n-0.5));
history[i+t] = j;
}
Für das obige Bild wurde g = 4 gewählt. Das heißt, tZ nimmt in unregelmäßiger Reihenfolde die Werte 1,2 und 3 an.
Für g = 2 bekommen wir den 2.Fall. Je größer g, desto ähnlicher ist das Ergebnis dem 1.Fall.
5. Fall:   n = 5 und Chaos Game Regel mit erster Veränderung
Wie im 2. Fall wird gefordert, dass niemals zwei gleiche Ecken hintereinander
gewählt werden dürfen. Im Array history[] sind alle gewählten Ecken gespeichert. Im Programm-Code
ist wie dort:
while(history[i+t-1]==history[i+t] ){
j =round(random(0-0.5,n-0.5));
history[i+t] = j;
}
Wie in den bisherigen Fällen werden die Ratios 0.5 und 1.5 verwendet. Diese sind für n = 5 keine
Kissing-Ratios.
6. Fall:   n = 8 und Punkte bilden kein regelmäßiges 8-Eck
Für das Bild unten wurden acht "Eckpunkte" gewählt: Die vier Eckpunkte des Quadrats und die vier
Seitenhalbierenden der Seiten des Quadrats. Kisssing Ratio ist 0.66666666(Bild links). Der Wert für ki
kann hier nicht aus der Formel bestimmt werden, da kein regelmäßiges n-Eck vorliegt.
Entweder man findet den Wert für ki durch probieren oder man schaut sich das Bild etwas genauer an ;-)
Das entstehende Bild nennt man
Sierpinski Carpet. Rechts daneben gilt Ratio = 0.7166 und history-Tiefe 1.
Die acht "Eckpunkte" des Carpets kann man kann man so bestimmen:
int id = -1;
for (int i = -3; i < 4; i=i+3) {
for (int j = -3; j < 4; j=j+3) {
if (i == 0 && j == 0) continue; // Mitte auslassen
id++;
.......(Parameter berechnen)..................
}
}
7. Fall: Beliebige Punkte
Damit man nachvollziehen kann, wie die Punkte in der Ebene das Ergebnis beeinflussen, verteilen wir
die Punkte nicht allzu beliebig. In unserem Fall bilden sie einen Stern. Außerdem ist im Ursprung ein
weiterer Punkt vorgegeben. Im Bild unten links handelt es sich um 17 Punkte. Es wurden zwei Ratios
verwendet: 0.8 und 1.2. Zur besseren Erkennbarkeit verbinden wir alle Punkte außer dem Ursprung durch
weiße Linien. Wie oben auch wird die Farbe durch die angestrebte Ecke bestimmt. 17 Ecken benötigen 17 Farben.
Bei den Außenpunkten des Sterns erkennt man je Punkt zwei Farben, erzeugt durch zwei Ratios. In der Mitte
ist die Sache etwas unübersichtlicher (Vergrößerung unten rechts). Zu sehen ist außerdem, dass wir hier
zweifelsfrei einen Attraktor erzeugt haben.
Die Sternpunkte kann man recht einfach realisieren:
w = 2*PI/(n-1);
for(int i=0;i <n-1;i++){
Punkte[i] = new PVector();
if(i%2==0){
Punkte[i].x = vG*R*cos(i*w);
Punkte[i].y = vG*R*sin(i*w);
}else{
Punkte[i].x = vU*R*cos(i*w);
Punkte[i].y = vU*R*sin(i*w);
}
}
Punkte[n-1] = new PVector();
Punkte[n-1].x =0;Punkte[n-1].y=0;
Am besten, Sie testen all diese Möglichkeiten selbst in folgendem Sketch:
Tasten- oder Mausaktion |
Wirkung |
Taste x |
Fall Nummer +1 |
Taste n |
Anzahl der Punkte verdoppeln |
Taste + |
Anzahl der Ecken um 1 erhöhen |
Taste - |
Anzahl der Ecken um 1 verringern |
Taste h |
Ratio um 0.01 erhöhen |
Taste t |
Ratio um 0.01 verringern |
Taste a |
Farben verändern |
Taste 0 |
History-Tiefe 0 |
Taste 1 |
History-Tiefe 1 |
Taste 2 |
History-Tiefe 2 |
Taste 3 |
History-Tiefe 3 |
Taste w |
Hintergrund weiß/schwarz |
Taste k |
Außenelemente zeichnen |
Taste i |
Zoomen-in einmalig, zentral |
Taste o |
Zoomen-out einmalig, zentral |
Maus-Klick ins Fenster |
Zoomen an dieser Stelle |
Sketch ChaosGame Sierpinski Varianten
Menu