[Einführung]
Ich habe "The Secret Concise" gelesen. Es gibt ein Kapitel, in dem verschiedene Methoden zur Verwendung von Rauschen zur Erzeugung fraktaler Diagramme eingeführt werden. Es fühlt sich sehr interessant an, daher habe ich versucht, einen Computer zu verwenden, um ihn zu simulieren, und der Effekt ist nicht schlecht (die Rauschmethode ist in der Programmierung einfacher zu implementieren als die herkömmliche iterative Methode. Später fand ich, dass es immer noch viele solcher Algorithmen gibt, sodass ich mehr auf der Suche nach Chaosgame finden kann).
[Sierpinski Triangle Rauschenerzeugung Methode]
In diesen Noise -Spielen sind die Regeln für die Erzeugung von Sierpinski -Dreiecken am einfachsten:
1. Wählen Sie drei Punkte in der Ebene aus, markiert als 1, 2 und 3 als Eckpunkt des großen Dreiecks.
2. Wählen Sie einen von ihnen als "aktueller Punkt" aus (z. B. Auswahl von Nr. 1).
3. Erstellen Sie eine zufällige Anzahl von 1 bis 3, zeichnen Sie einen neuen Punkt im Mittelpunkt des Scheitelpunkts und den "Strompunkt", der von der Anzahl ausgedrückt wird, und verwenden Sie den neuen Punkt als "aktueller Punkt".
4. Wiederholen Sie Schritt 3, um dem Muster näher zu kommen.
*. Achten Sie auf zufällige Zahlen, es ist am besten, Zeit nicht als Art der Samengenerierung zu verwenden.
[Simulationsprogramm]
Paket com.geiv.chaos; import Java.awt.event.KeyEvent; Import com.thrblock extends DefaultFactor implements KeyListener{UESI UES;Obj[] basePoint;Obj crtPoint;public Sierpinski(UESI UES,int times){this.UES = UES;basePoint = new Obj[3];//Create three benchmark points 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); // Setzen Sie die Drei-Punkte-Position ein BasePoint [0] .SetCentraly (60); BasePoint [1] .SetCentralx (60); Basepoint [1] .SetCentraly (550); BasePoint [2] .Setcentralx (740); Basepoint [2] .Setcentraly (550); crtpoint = basepoinT [0];/// // als aktueller Punkt 0 nimm als 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){//Create a neuer Punkt entspricht GenerateNew ();} else if (KeyCode == KeyEvent.vk_a) {// a entspricht 100 neue Punkte für (int i = 0; i <100; i ++) {generateNew ();}} else if (keyCode == keyEvent.vk_b) {/// b. 1000; i ++) {generateNew ();}}}}} public void GenerateNew () {obj flagpoint = basepoint [randomset.getrandomnum (0, 2)]; // aus dem Zufallsprinzip eines der Referenzpunkte float nx = (flagpoint.getCenterx ()+crtpoint.getPoint.getPoint.getPoint.Goint.Goint. (flagpoint.getCentraly () + crtpoint.getCentraly ())/2f; obj Newpoint = ues.creatobj (uesi.bgindex); // Erstellen Sie einen neuen Punkt newpoint.addglpoint ("70dbdb", 0,0); newpoint.setcolor (randomset.getrandrandrandrandrandrandrandrandrandrandrandRands); Koordinaten Newpoint.SetCentraly (NY); newpoint.show (); crtpoint = newpoint; // Setzen Sie als aktueller Punkt} public static void main (String [] args) {uesi ues = new R (); new Sierpinski (UEs, 0); // Die nachfolgenden Konstruktionsparameter können die anfängliche Anzahl von Punkten festlegen. }}[Simulationsergebnisse]
Wenn die B -Taste gedrückt wird
[Barnsleyfers Rauschgenerierungsmethode]
Im Vergleich zur einfachen Regelmäßigkeit des Sierpinski -Dreiecks vermittelt Barnsleyfer (fraktales Zahngras) Menschen einen komplexeren Eindruck. Aufgrund ihrer Komplexität kommt die Chaos -Disziplin häufig zu dem Nachweis der Schlussfolgerung, dass "einfache Regeln auch komplexe Objekte erzeugen können".
Seine Generierungsregeln sind auch nicht kompliziert:
1. Angesichts des "aktuellen Punktes" (0,0) verwenden wir Ox und OY, um horizontale und vertikale Koordinaten darzustellen.
2. Um den nächsten Punkt (NX, NY) zu berechnen, müssen Sie eine der folgenden vier Iterationsformeln mit bestimmten zufälligen Regeln auswählen:
1) Wählen Sie diese Iterationsformel mit der Wahrscheinlichkeit von %1 aus:
nx = 0;
NY = 0,16F*oy;
2) Wählen Sie diese Iterationsformel mit der Wahrscheinlichkeit von %85 aus:
NX = 0,85*OX+0,04*OY;
NY = -0,04*OX+0,85*OY+1,6;
3) Wählen Sie diese Iterationsformel mit der Wahrscheinlichkeit von %7 aus:
nx = 0,2*OX-0,26*oy;
NY = 0,23*OX+0,22*OY+1,6;
4) Wählen Sie diese Iterationsformel mit der Wahrscheinlichkeit von %7 aus:
nx = -0,15*ox+0,28*oy;
NY = 0,26*OX+0,24*OY+0,44;
3. Zeichnen (NX, NY), setzen Sie es auf den Strompunkt, wiederholen Sie 2 und Sie können das Ergebnis unendlich annähern.
↑ Die obige Formel ist aus Wiki ausgehalten: http://en.wikipedia.org/wiki/barnsley_fern. Beim Programmieren fand ich ein Problem. Das Wiki spezifizierte weder die Beziehung zwischen dem relativen Wert dieser Koordinate und der Bildschirmgröße noch die Richtung der X- und Y -Achsen. Die Zeichnung war immer erfolglos unter dem von mir definierten Koordinatensystem. Später suchte ich gemäß der Formel und fand diese Oberfläche: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fernn.cpp. Dies ist ein OpenGL -Programm in C ++ und dieselbe Formel wie Wiki wird verwendet. Das heißt, dieser Satz von Formeln basiert auf dem Koordinatensystem von OpenGL. Nach der entsprechenden Transformation wurde es schließlich erfolgreich gezeichnet.
[Simulationsprogramm]
Paket com.geiv.chaos; import Geeivcore.DefaultFactor; Import Geeivcore.Keyfactor; Import Geeivcore.KeyListener; Import Geeivcore.r; Import Geeivcore.uesi; Import Geeivcore.Enginedata.obj.obj; Import Java.awt.Color; Import. com.thrblock.util. Ues.creatobj (uesi.bgindex); crtpoint.addglpoint ("70dbdb", 0,0); crtpoint.show (); crtpoint.setCentralx (0); crtpoint.setCentraly (0); ues.setViewoffx (90); 0; i <times; i ++) {GenerateNew ();}}@override public void Dokeybord (KeyFactor Who, int keycode, boolean isprimiert) {// Die Tastatur -IO -Methode ist das gleiche wie oben if if (ispressed) {if (keycode == keyEvent.vk_Space) {Generatew ();} sonst (keycode). KeyEvent.vk_a) {für (int i = 0; i <100; i ++) {generateNew ();}} else if (keyCode == KeyEvent.vk_b) {für (int i = 0; i <100; i ++) {generatenew ();}}}}}} use if (keycodes = i = 0; 1000; i ++) {generateNew ();}}}} public void GenerateNew () {float nx, ny; float ox = crtpoint.getCentralx ()/150f, OY = (600 - crtpoint.getcentraly)/60F;/// OpenGL -Koordination ist hier abgekehrt, und die Inversion der New Pointa, die hier ist. Double Code = 100.0 * randomset.getRandomfloatin_1 (); // Zufallsfloating -Punktnummer 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,00. ox + 0,00. ox + 0,00. ox + 0,00. och. . 0,44f;} obj Newpoint = ues.creatobj (uesi.bgindex); newpoint.addglpoint ("70dbdb", 0,0); newpoint.setColor (color.green); newpoint.setcentalx (NX*150f); // Die vorherige Koordinationstransformation Newpoint. ny*60f); newpoint.show (); crtpoint = newpoint; // Setzen Sie den neuen Punkt auf den aktuellen Punkt. } public static void main (String [] args) {uesi ues = new r (); new Barnsleyfer (ues, 0);}}[Simulationsergebnisse]
Zusammenfassen
Das obige ist der Inhalt dieses Artikels über den Beispiel -Code von Java Chaos Game Noise Game -Spiel. Ich hoffe, er wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!