English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Ejemplo de código del juego de ruido Chaos Game en Java

[Introducción]

Recientemente he estado leyendo "La simplicidad profunda", en el que hay un capítulo que introduce varios métodos de generación de fractales usando ruido, y me ha parecido muy interesante, así que he intentado simularlo con la computadora y el resultado es bastante bueno (el método de ruido es más fácil de implementar en programación que el método iterativo tradicional, y más tarde descubrí que hay muchos algoritmos de este tipo, puedes encontrar más buscando chaosgame).

[Método de generación de ruido del triángulo de Sierpinski]

en estos juegos de ruido, las reglas de generación del triángulo de Sierpinski (谢尔宾斯基) son las más simples:

1.En el plano selecciona tres puntos, marca como1,2,3como vértice del gran triángulo.

2.Elije uno de ellos, como "punto actual" (por ejemplo, elige1número).

3.Generar1~3del número aleatorio, en el vértice expresado por ese número y en el punto medio del "punto actual" dibuja un nuevo punto, y ese nuevo punto se convierte en el "punto actual".

4.Repite los pasos3para acercarse al patrón.

*.Atención, mejor no usar la forma de generación de números aleatorios basada en la hora como semilla.

[Simulación de programa]

paquete 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];
		//crear tres puntos de referencia 
		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);
		//establecer 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];
		//poner el punto 0 como el punto actual 
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0; i < times; i++){
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		//montar retroalimentación 
		if(ispressed){
			if(keyCode == KeyEvent.VK_SPACE){
				//espacio crea un nuevo punto 
				generateNew();
			} else if(keyCode == KeyEvent.VK_A){
				//A crea100 nuevos puntos 
				for (int i = 0; i < 100;i++){
					generateNew();
				}
			} else if(keyCode == KeyEvent.VK_B){
				//B crea1000 nuevos puntos 
				for (int i = 0; i < 1000;i++){
					generateNew();
				}
			}
		}
	}
	public void generateNew(){
		Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2);
		//seleccionar uno de los puntos de referencia 
		float nx = (flagPoint.getCentralX() + crtPoint.getCentralX())/2f;
		//Calcular el punto medio 
		float ny = (flagPoint.getCentralY() + crtPoint.getCentralY())/2f;
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		//Crear nuevo punto 
		newPoint.addGLPoint("70DBDB",0,0);
		Establecer color
		newPoint.setCentralX(nx);
		//Establecer coordenadas 
		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 configurar el número inicial de puntos.
	}
}

[Resultados de la simulación]

Al presionar la tecla B

[Método de generación de ruido de Barnsley fern]

En comparación con la regla simple del triángulo de Sierpinski, el Barnsley fern (pata de oveja fractal) da una impresión más compleja. Debido a su complejidad, la ciencia del caos a menudo lo toma como ejemplo para probar la conclusión de "Las reglas simples pueden generar objetos complejos".

Sus reglas de generación no son muy complejas:

1.Primero se da el "punto actual" (0,0), usamos ox, oy para representar las coordenadas horizontales y verticales.

2.Para calcular el siguiente punto (nx,ny) es necesario elegir una de las cuatro fórmulas iterativas siguientes según una regla aleatoria:

1)con1La probabilidad de elegir esta fórmula iterativa es

nx=0;

ny=0.16f*oy;

2)con85La probabilidad de elegir esta fórmula iterativa es

nx=0.85*ox+0.04*oy;

ny=-0.04*ox+0.85*oy+1.6;

3)con7La probabilidad de elegir esta fórmula iterativa es

nx=0.2*ox-0.26*oy;

ny=0.23*ox+0.22*oy+1.6;

4)con7La probabilidad de elegir esta fórmula iterativa es

nx=-0.15*ox+0.28*oy;

ny=0.26*ox+0.24*oy+0.44;

3.Dibujar (nx,ny) y establecerlo como el punto actual, repetir2Puede acercarse infinitamente al resultado.

↑Las fórmulas anteriores se copiaron de Wiki:http://en.wikipedia.org/wiki/Barnsley_fernMientras programaba, descubrí un problema: Wiki no especifica la relación entre el valor absoluto de esta coordenada y el tamaño de la pantalla, ni tampoco indica la dirección del eje x, y del eje y. Al dibujar en el sistema de coordenadas que definí, siempre fracasé. Más tarde, según la fórmula de búsqueda, encontré esta superficie:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp。++El programa OPENGL bajo, que utiliza 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 la transformación correspondiente, finalmente se dibujó con éxito.

[Simulación de programa]

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 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) {
		//La forma de E/S de teclado es igual al ejemplo anterior 
		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;
		//Aquí se realiza la conversión de coordenadas OPENGL, se invierte al establecer la nueva posición del punto. 
		double code = 100.0 * RandomSet.getRandomFloatIn_1;
		//Número aleatorio de coma flotante de 0~100 
		if(code >= 0&&code <= 1){
			nx = 0;
			ny = 0.00f * ox + 0.16f * oy;
		} 1&& code <= 86){
			nx = 0.85f*ox + 0.04f*oy;
			ny = -0.04f*ox + 0.85f*oy + 1.6f;
		} 86&& code <= 93){
			nx = 0.2f*ox - 0.26f*oy;
			ny = 0.23f*ox + 0.22f*oy + 1.6f;
		}
			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);
		//Anular la transformación de coordenadas anteriores 
		newPoint.setCentralY(600 - ny*60f);
		newPoint.show();
		crtPoint = newPoint;
		//Establecer el nuevo punto como el punto actual.
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Barnsleyfern(ues,0);
	}
}

[Resultados de la simulación]

Resumen

Esto es todo el contenido del código de ejemplo del juego de ruido Chaos Game de Java que se trata en este artículo, esperamos que sea útil para todos. Los amigos interesados pueden continuar consultando otros temas relacionados en este sitio, y bienvenidos a dejar comentarios si encuentran alguna deficiencia. Agradecemos el apoyo de los amigos a este sitio!

Declaración: El contenido de este artículo se obtiene de la red, es propiedad del autor original, el contenido se contribuye y carga de manera autónoma por los usuarios de Internet, este sitio no posee los derechos de propiedad, no se ha procesado editorialmente y no asume responsabilidades legales relacionadas. Si encuentra contenido sospechoso de copyright, le invitamos a enviar un correo electrónico a: notice#oldtoolbag.com (al enviar un correo electrónico, reemplace # con @) para denunciar y proporcionar evidencia relevante. Una vez confirmado, este sitio eliminará inmediatamente el contenido sospechoso de infracción.

Te gustará