[Introducción]
He estado leyendo "The Secret Concise". Hay un capítulo que introduce varios métodos para usar el ruido para generar gráficos fractales. Se siente muy interesante, por lo que intenté usar una computadora para simularla, y el efecto no es malo (el método de ruido es más fácil de implementar en la programación que el método iterativo tradicional. Más tarde descubrí que todavía hay muchos algoritmos de este tipo, por lo que puedo encontrar más en busca de Chaosgame).
[Método de generación de ruido del triángulo de Sierpinski]
En estos juegos de ruido, las reglas para generar triángulos Sierpinski son los más fáciles:
1. Seleccione tres puntos en el plano, marcados como 1, 2 y 3, como los vértices del triángulo grande.
2. Seleccione uno de ellos como "punto de corriente" (como seleccionar No. 1).
3. Genere un número aleatorio de 1 a 3, dibuje un nuevo punto en el punto medio del vértice y el "punto de corriente" expresado por el número, y use el nuevo punto como "punto de corriente".
4. Repita el paso 3 para acercarse al patrón.
*. Preste atención a los números aleatorios, es mejor no usar el tiempo como la forma de generación de semillas.
[Programa de simulación]
paquete com.geiv.chaos; import java.awt.event.keyevent; import com.thblock.util.randomset; import geivcore.defaultFactor; import geivcore.keyfactor; import geivcore.keylistener; import geivcore.r; import geivcore.uesi; importe geivcore.enginedata.obj.obj; DefaultFactor implementa KeyListener {uesi ues; obj [] basepoint; obj crtpoint; public sierpinski (uesi ues, int tiempo) {this.ues = ues; basepoint = new obj [3]; // crea tres puntos de referencia para (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); // establece la posición de tres puntos BasePoint [0] .SetCentraly (60); BasePoint [1] .SetCentralx (60); BasePoint [1] .SetCentraly (550); BasePoint [2] .SetCentralx (740); BasePoint [2] .SetCentraly (550); CRTPoint = BasePoint [0]; // Take Point 0 como punto corriente actual this.setKeyListener (this); ues.pushkeyboardio (this); for (int i = 0; i <times; i ++) {generateNew ();}}@anular public void dokeyBord (keyFactor Who, int keycode, boolean iSpressed) {// call if if (está evaluado) punto correspondiente a generateNew ();} else if (keyCode == keyevent.vk_a) {// A corresponde a 100 nuevos puntos para (int i = 0; i <100; i ++) {generatewew ();}} else if (keyCode == keyevent.vk_b) {// b corresponde a 1000 puntos nuevos para (int i = 0; i <i <It < 1000;i++){generateNew();}}}}} public void generateNew(){Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2)];// Randomly select one of the reference points float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f;//Calculate the midpoint float ny = (flagPoint.getCentraly () + crtpoint.getCentRraly ())/2f; obj newPoint = ues.creatobj (uesi.bgindex); // Cree un nuevo punto newPoint.AddglPoint ("70DBDB", 0,0); NewPoint.SetColor (aleatorset.getRandomColor ()); NewPoint.set.set.set.Set.StEn coordina newPoint.setCentraly (ny); newPoint.show (); crtpoint = newPoint; // establecer como el punto actual} public static void main (string [] args) {uesi ues = new r (); new Sierpinski (UES, 0); // Los parámetros de construcción posteriores pueden establecer el número inicial de puntos. }}[Resultados de simulación]
Cuando se presiona la tecla B
[Método de generación de ruido de Barnsleyfern]
En comparación con la simple regularidad del triángulo de Sierpinski, Barnsleyfern (hierba de dientes fractales) ofrece a las personas una impresión más compleja. Debido a su complejidad, la disciplina del caos a menudo surge para demostrar la conclusión de que "las reglas simples también pueden producir objetos complejos".
Sus reglas de generación tampoco son complicadas:
1. Primero, dado el "punto actual" (0,0), usamos OX y OY para representar coordenadas horizontales y verticales.
2. Para calcular el siguiente punto (NX, NY), debe seleccionar una de las siguientes cuatro fórmulas de iteración con ciertas reglas aleatorias:
1) Seleccione esta fórmula de iteración con la probabilidad de %1:
nx = 0;
ny = 0.16f*oy;
2) Seleccione esta fórmula de iteración con la probabilidad de %85:
nx = 0.85*ox+0.04*oy;
ny = -0.04*ox+0.85*oy+1.6;
3) Seleccione esta fórmula de iteración con la probabilidad de %7:
nx = 0.2*ox-0.26*oy;
ny = 0.23*ox+0.22*oy+1.6;
4) Seleccione esta fórmula de iteración con la probabilidad de %7:
nx = -0.15*ox+0.28*oy;
ny = 0.26*ox+0.24*oy+0.44;
3. Dibuja (NX, NY), configúrelo en el punto actual, repita 2, y puede aproximar el resultado infinitamente.
↑ La fórmula anterior está extraída de Wiki: http://en.wikipedia.org/wiki/barnsley_fern. Al programar, encontré un problema. El wiki no especificó la relación entre el valor relativo de esta coordenada y el tamaño de la pantalla, ni especificó la dirección de los ejes x e y. El dibujo siempre no tuvo éxito bajo el sistema de coordenadas que definí. Más tarde, busqué de acuerdo con la fórmula y encontré esta superficie: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp. Este es un programa OpenGL en C ++, y se usa la misma fórmula que Wiki. Es decir, este conjunto de fórmulas se basa en el sistema de coordenadas de OpenGL. Después de hacer la transformación correspondiente, finalmente se dibujó con éxito.
[Programa de simulación]
paquete 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; importar; importar; importar; importar; importar; import com.thlblock.util.randomset; public class Barnsleyfern extiende el factor predeterminado implementa Keylistener {uesi ues; obj crtpoint; public Barnsleyfern (uesi ues, intimio) {this.ues = ues; crtpoint = Ues.creatobj (uesi.bgindex); crtpoint.addglpoint ("70dbdb", 0,0); crtpoint.show (); crtpoint.setCentralx (0); crtpoint.setCentraly (0); ues.setViewOffsetSetX (90); this.setkylistener (esto); ues.phey keye 0; i <Times; i ++) {generateNew ();}}@anular public void dokeyBord (keyFactor Who, int keycode, boolean isProssed) {// El método de teclado IO es el mismo que el anterior if (isScessess) {if (keyCode == keyevent.vk_space) {generatenew ();} si (isScessE) KeyEvent.vk_a) {for (int i = 0; i <100; i ++) {generateNew ();}} else if (keycode == keyEvent.vk_b) {for (int i = 0; i <100; i ++) {generateW 1000; i ++) {generatew ();}}}} public void generatEnw () {float nx, ny; float ox = crtpoint.getCentralx ()/150f, oy = (600 - CRTPoint.getCentRaly ())/60f; // La conversación de coordinada de apertura se realiza aquí, y la Correspondencia se revela la Versión. Código doble = 100.0 * aleationSet.getRandomfloatin_1 (); // Número de punto flotante aleatorio 0 ~ 100 if (código> = 0 && code <= 1) {nx = 0; ny = 0.00f * ox + 0.16f * oy;} else if (código> 1 && code <= 86) {nx = 0.85f * ox + 0.04f * oy; ny; + 0.85f*oy + 1.6f;} else if (código> 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*oxf;} else {nx = -0.15f*ox + 0.28f*oy; ny = 0.26f*oxf;} else {nx = -0.15f*ox + 0.28f*oy; ny = 0.26f*oxf;} más 0.44f;} obj newPoint = ues.creatobj (uesi.bgindex); newPoint.addglpoint ("70dbdb", 0,0); newPoint.setColor (color.green); newPoint.setCentralX (NX*150F); // Cancelar la transformación coordinada anterior NewPoint.setcentraly (600 - - - - 600 - - ny*60f); newPoint.show (); crtpoint = newPoint; // Establezca el nuevo punto en el punto actual. } public static void main (string [] args) {uesi ues = new r (); new Barnsleyfern (ues, 0);}}[Resultados de simulación]
Resumir
Lo anterior es todo el contenido de este artículo sobre el código de ejemplo del juego de ruido del juego Java Chaos, espero que sea útil para todos. Los amigos interesados pueden continuar referiéndose a otros temas relacionados en este sitio. Si hay alguna deficiencia, deje un mensaje para señalarlo. ¡Gracias amigos por su apoyo para este sitio!