English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
[Einführung]
Ich lese momentan „Die tiefere Einfachheit“ und in einem Kapitel wird die Verwendung von Noise-Generierungsmethoden zur Erstellung von Fraktalen vorgestellt, was sehr interessant ist, also versuche ich es mit einer Computersimulation, das Ergebnis ist recht gut(das Noise-Verfahren ist im Programmieren einfacher zu realisieren als das traditionelle Iterationsverfahren, und später fand ich heraus, dass es viele solcher Algorithmen gibt, man kann mehr durch die Suche nach „chaosgame“ finden)。
[Sierpinski-Triangle Noise Generation Method]
In diesen Lärmspielen ist die Generationsregel des Sierpinski-Triangles (谢尔宾斯基三角形) am einfachsten:
1.Wählen Sie auf der Fläche drei Punkte aus, markieren Sie sie als1、2、3,作为大三角形的顶点。
2.Wählen Sie eines der Punkte aus, als “aktuellen Punkt” zu verwenden(z.B. verwenden1号)。
3.Erzeugen1~3的随机数,在该数表达的顶点与“当前点”的中点绘制一个新点,并将新点作为“当前点”。
4.Wiederholen Sie den Schritt3,即可逼近图案。
*.Beachten Sie, dass die Zufallszahlen am besten nicht auf Zeit basierende Erzeugungsmethoden verwenden sollten.
[Simulationsprogramm]
package com.geiv.chaos; import java.awt.event.KeyEvent; import com.thrblock.util.RandomSet; import geivcore.DefaultFactor; import geivcore.KeyFactor; import geivcore.KeyListener; import geivcore.R; import geivcore.UESI; import geivcore.enginedata.obj.Obj; public class Sierpinski extends DefaultFactor implements KeyListener{ UESI UES; Obj[] basePoint; Obj crtPoint; public Sierpinski(UESI UES,int times){ this.UES = UES; basePoint = new Obj[3]; //Drei Referenzpunkte erstellen for (int i = 0;i < 3;i++){ basePoint[i] = UES.creatObj(UESI.BGIndex); basePoint[i].addGLPoint("70DBDB",0,0); basePoint[i].show(); } basePoint[0].setCentralX(400); //Dreipunktposition setzen basePoint[0].setCentralY(60); basePoint[1].setCentralX(60); basePoint[1].setCentralY(550); basePoint[2].setCentralX(740); basePoint[2].setCentralY(550); crtPoint = basePoint[0]; //Den Punkt 0 als aktuellen Punkt setzen this.setKeyListener(this); UES.pushKeyBoardIO(this); for (int i = 0;i < times;i++){ generateNew(); } } @Override public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) { //Mount Callback if(ispressed){ if(keyCode == KeyEvent.VK_SPACE){ //Leerzeichen entspricht der Erstellung eines neuen Punktes generateNew(); } else if(keyCode == KeyEvent.VK_A){ //A entspricht der Erstellung100 neue Punkte for (int i = 0;i < 100;i++){ generateNew(); } } else if(keyCode == KeyEvent.VK_B){ //B entspricht der Erstellung1000 neue Punkte for (int i = 0;i < 1000;i++){ generateNew(); } } } } public void generateNew(){ Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2); //zufällig einen Referenzpunkt auswählen float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f; //Berechne den Mittelpunkt float ny = (flagPoint.getCentralY() + crtPoint.getCentralY())/2f; Obj newPoint = UES.creatObj(UESI.BGIndex); //Erstelle neuen Punkt newPoint.addGLPoint("70DBDB",0,0); newPoint.setColor(RandomSet.getRandomColdColor()); newPoint.setCentralX(nx); //Setze Koordinaten newPoint.setCentralY(ny); newPoint.show(); crtPoint = newPoint; //Setze als aktuellen Punkt } public static void main(String[] args) { UESI ues = new R(); new Sierpinski(ues,0); //Die folgenden Konstruktionsparameter können die Anzahl der initialen Punkte eingestellt werden. } }
[Simulationsergebnis]
Wenn die Taste B gedrückt wird
[Methode zur Erzeugung von Rauschen im Barnsley-Fern]
Im Gegensatz zur einfachen Regelmäßigkeit des Sierpinski-Dreiecks hinterlässt das Barnsley-Fern (Fraktal-Weide) einen komplexeren Eindruck. Aufgrund seiner Komplexität wird das Chaos-Fachgebiet oft verwendet, um die Schlussfolgerung zu beweisen, dass "einfache Regeln komplexe Objekte erzeugen können".
Seine Erzeugungsregeln sind auch nicht sehr komplex:
1Zunächst wird der "aktuelle Punkt" (0,0) gegeben, wir verwenden ox, oy, um die Quer- und Längsachsen zu bezeichnen.
2Um den nächsten Punkt (nx, ny) zu berechnen, muss eine der folgenden vier Iterationsformeln nach einem bestimmten zufälligen Regelsystem ausgewählt werden:
1)mit %1Wahrscheinlichkeitsauswahl dieser Iterationsformel:
nx=0;
ny=0.16f*oy;
2)mit %85Wahrscheinlichkeitsauswahl dieser Iterationsformel:
nx=0.85*ox+0.04*oy;
ny=-0.04*ox+0.85*oy+1.6;
3)mit %7Wahrscheinlichkeitsauswahl dieser Iterationsformel:
nx=0.2*ox-0.26*oy;
ny=0.23*ox+0.22*oy+1.6;
4)mit %7Wahrscheinlichkeitsauswahl dieser Iterationsformel:
nx=-0.15*ox+0.28*oy;
ny=0.26*ox+0.24*oy+0.44;
3Zeichne (nx, ny) und setze es als aktuellen Punkt, wiederhole2Man kann den Endwert unendlich nah heranreichen.
↑Die obigen Formeln wurden aus Wiki abgeleitet:http://en.wikipedia.org/wiki/Barnsley_fernWährend der Programmierung habe ich ein Problem entdeckt, Wiki hat nicht angegeben, wie der absolute Wert dieser Koordinate im Verhältnis zur Bildschirmgröße ist und hat auch nicht die Richtungen der Achsen x und y erklärt. Unter meiner selbst definierten Koordinate konnte ich nie erfolgreich zeichnen, später habe ich nach der Formel gesucht und habe diese Fläche gefunden:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cppDies ist ein C++Das OPENGL-Programm, das darin verwendet wird, verwendet die gleiche Formel wie Wiki, das bedeutet, dass diese Gruppe von Formeln auf dem Koordinatensystem von Opengl basiert und nach der entsprechenden Transformation schließlich erfolgreich gezeichnet wurde.
[Simulationsprogramm]
package com.geiv.chaos; import geivcore.DefaultFactor; import geivcore.KeyFactor; import geivcore.KeyListener; import geivcore.R; import geivcore.UESI; import geivcore.enginedata.obj.Obj; import java.awt.Color; import java.awt.event.KeyEvent; import com.thrblock.util.RandomSet; public class Barnsleyfern extends DefaultFactor implements KeyListener{ UESI UES; Obj crtPoint; public Barnsleyfern(UESI UES,int times){ this.UES = UES; crtPoint = UES.creatObj(UESI.BGIndex); crtPoint.addGLPoint("70DBDB",0,0); crtPoint.show(); crtPoint.setCentralX(0); crtPoint.setCentralY(0); UES.setViewOffsetX(90); this.setKeyListener(this); UES.pushKeyBoardIO(this); for (int i = 0;i < times;i++){ generateNew(); } } @Override public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) { //Die Tastatur-IO-Methode ist wie im obigen Beispiel if(ispressed){ if(keyCode == KeyEvent.VK_SPACE){ generateNew(); } else if(keyCode == KeyEvent.VK_A){ for (int i = 0;i < 100;i++){ generateNew(); } } else if(keyCode == KeyEvent.VK_B){ for (int i = 0;i < 1000;i++){ generateNew(); } } } } public void generateNew(){ float nx,ny; float ox = crtPoint.getCentralX()/150f,oy = (600 - crtPoint.getCentralY())/60f; //Hier wurde die OPENGL-Koordinatenumwandlung vorgenommen, bei der Einstellung der neuen Punktposition wird umgekehrt. double code = 100.0 * RandomSet.getRandomFloatIn_1; //Zufällige Gleitkommazahl von 0~100 if(code >= 0&&code <= 1){ nx = 0; ny = 0.00f * ox + 0.16f * oy; } else if(code > 1&& code <= 86){ nx = 0.85f*ox + 0.04f*oy; ny = -0.04f*ox + 0.85f*oy + 1.6f; } else if(code > 86&& code <= 93){ nx = 0.2f*ox - 0.26f*oy; ny = 0.23f*ox + 0.22f*oy + 1.6f; } else{ nx = -0.15f*ox + 0.28f*oy; ny = 0.26f*ox + 0.24f*oy + 0.44f; } Obj newPoint = UES.creatObj(UESI.BGIndex); newPoint.addGLPoint("70DBDB",0,0); newPoint.setColor(Color.GREEN); newPoint.setCentralX(nx*150f); //Verwenden Sie die Koordinatentransformation, um die vorherige Koordinate auszugleichen newPoint.setCentralY(600 - ny*60f); newPoint.show(); crtPoint = newPoint; //Setzen Sie den neuen Punkt als aktuellen Punkt. } public static void main(String[] args) { UESI ues = new R(); new Barnsleyfern(ues,0); } }
[Simulationsergebnis]
Zusammenfassung
Das ist der vollständige Inhalt dieses Artikels über das Java Chaos Game Noise Beispielcode. Wir hoffen, dass es Ihnen weiterhilft. Freunde, die interessiert sind, können weiterhin andere relevante Themen dieser Website lesen. Wir freuen uns über Kommentare, die Verbesserungen vorschlagen. Vielen Dank für die Unterstützung der Freunde dieser Website!
Erklärung: Der Inhalt dieses Artikels wurde aus dem Internet bezogen und gehört dem Urheberrechtinhaber. Der Inhalt wurde von Internetbenutzern freiwillig und selbstständig hochgeladen. Diese Website besitzt keine Eigentumsrechte und hat den Inhalt nicht manuell bearbeitet. Sie übernimmt auch keine Haftung für relevante rechtliche Verantwortlichkeiten. Wenn Sie urheberrechtswidrige Inhalte entdecken, freuen wir uns über eine E-Mail an: notice#oldtoolbag.com (Bitte ersetzen Sie # durch @ beim Senden einer E-Mail, um eine Beschwerde einzureichen und relevante Beweise bereitzustellen. Sobald überprüft, wird die Website den mutmaßlich urheberrechtswidrigen Inhalt sofort löschen.