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

Esempio di codice del gioco di rumore Chaos Game implementato in Java

[Introduzione]

Recentemente ho letto "La semplicità profonda", in cui c'è un capitolo che introduce diversi metodi per generare immagini frattali utilizzando il rumore, che mi ha sembrato molto interessante, quindi ho provato a simulare con il computer, e l'effetto è piuttosto buono (il metodo del rumore è più facile da implementare rispetto al metodo iterativo tradizionale, e più tardi ho scoperto che ci sono molti algoritmi di questo tipo, cercando chaosgame si possono trovare molti altri).

[Metodo di generazione del rumore del triangolo di Sierpinski]

In questi giochi di rumore, le regole di generazione del triangolo di Sierpinski (谢尔宾斯基) sono tra le più semplici:

1.seleziona tre punti sul piano, etichettali come 1, 2, 3 e considera questi come i vertici del triangolo grande.

2.seleziona uno di questi punti come "punto corrente" (ad esempio, seleziona il punto 1).

3.produci un numero casuale tra 1 e 3, disegna un nuovo punto nel punto medio tra il vertice espresso da quel numero e il "punto corrente" e considera il nuovo punto come "punto corrente".

4.ripeti il passo 3 per avvicinarti al disegno.

*.non usare meglio non i numeri casuali generati con il tempo come seme.

[Simulazione programma]

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];
		//创建三个基准点 
		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);
		//Impostare la posizione di tre punti 
		basePoint[0].setCentralY(60);
		basePoint[1].setCentralX(60);
		basePoint[1].setCentralY(550);
		basePoint[2].setCentralX(740);
		basePoint[2].setCentralY(550);
		crtPoint = basePoint[0];
		//Impostare il punto 0 come punto corrente 
		this.setKeyListener(this);
		UES.pushKeyBoardIO(this);
		for (int i = 0; i < times; i++) {
			generateNew();
		}
	}
	@Override 
	  public void doKeyBord(KeyFactor whom, int keyCode, Boolean ispressed) {
		//Montaggio del callback 
		if(ispressed) {
			if(keyCode == KeyEvent.VK_SPACE) {
				//Spazio crea un nuovo punto 
				generateNew();
			else if(keyCode == KeyEvent.VK_A) {
				//A crea 100 nuovi punti 
				for (int i = 0; i < 100; i++) {
					generateNew();
				}
			else if(keyCode == KeyEvent.VK_B) {
				//B crea 1000 nuovi punti 
				for (int i = 0; i < 1000; i++) {
					generateNew();
				}
			}
		}
	}
	public void generateNew() {
		Obj flagPoint = basePoint[RandomSet.getRandomNum(0, 2)];
		//Scegliere uno dei punti di riferimento casuali 
		float nx = (flagPoint.getCentralX() + crtPoint.getCentralX()) / 2f;
		//Calcolare il punto medio 
		float ny = (flagPoint.getCentralY() + crtPoint.getCentralY()) / 2f;
		Obj newPoint = UES.creatObj(UESI.BGIndex);
		//Creare un nuovo punto 
		newPoint.addGLPoint("70DBDB",0,0);
		newPoint.setColor(RandomSet.getRandomColdColor());
		newPoint.setCentralX(nx);
		//Impostare le coordinate 
		newPoint.setCentralY(ny);
		newPoint.show();
		crtPoint = newPoint;
		//Impostare il punto corrente
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Sierpinski(ues, 0);
		//I parametri di costruzione successivi possono impostare il numero iniziale di punti.
	}
}

[Risultato simulato]

Quando si preme il tasto B

[Metodo di generazione del rumore del Barnsley fern]

Contrariamente alla semplicità delle regole del triangolo di Sierpinski, il Barnsley fern (ferna di Barnsley) lascia un'impresione più complessa. A causa della sua complessità, la disciplina del caos spesso lo utilizza per dimostrare la conclusione che "le regole semplici possono generare oggetti complessi".

La sua regola di generazione non è molto complessa:

1. Inizialmente, dati il "punto corrente" (0,0), utilizziamo ox, oy per rappresentare le coordinate orizzontali e verticali.

2. Per calcolare il punto successivo (nx, ny) è necessario scegliere una delle quattro formule iterative elencate di seguito secondo una regola casuale:

1) Con una probabilità del 1% scegliere questa formula iterativa:

nx = 0;

ny = 0.16f * oy;

2) Con una probabilità del 85% scegliere questa formula iterativa:

nx = 0.85 * ox + 0.04 * oy;

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

3) Scegli questa formula iterativa con una probabilità del 7%:

nx = 0.2 * ox - 0.26 * oy;

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

4) Scegli questa formula iterativa con una probabilità del 7%:

nx = -0.15 * ox + 0.28 * oy;

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

3. Disegna (nx, ny) e imposta come punto corrente, ripeti il punto 2 per avvicinarti无限mente al risultato.

↑Le formule sopra sono tratte da Wiki:http://en.wikipedia.org/wiki/Barnsley_fernNel programming, ho riscontrato un problema: Wiki non specifica la relazione tra il valore assoluto di questa coordinata e la dimensione dello schermo né specifica la direzione degli assi x e y. Il disegno nel mio sistema di coordinate definito non è mai stato possibile, dopo aver cercato le formule secondo la formula, ho trovato questa superficie:http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cppQuesto è un programma OPENGL in C++ e utilizza le stesse formule di Wiki, il che significa che questo set di formule è basato sul sistema di coordinate di OpenGL e, dopo le trasformazioni corrispondenti, è stato finalmente possibile disegnare con successo.

[Simulazione programma]

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) {
		//键盘IO的方式同上例 
		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;
		//这里做了OPENGL坐标转换,在设置新点位置时对应反转。 
		double code = 100.0 * RandomSet.getRandomFloatIn_1();
		//随机浮点数数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);
		//Annullare la trasformazione delle coordinate precedenti 
		newPoint.setCentralY(600 - ny*60f);
		newPoint.show();
		crtPoint = newPoint;
		//Impostare il punto nuovo come il punto corrente.
	}
	public static void main(String[] args) {
		UESI ues = new R();
		new Barnsleyfern(ues,0);
	}
}

[Risultato simulato]

Conclusione

Questo è tutto il contenuto dell'esempio di codice del gioco di rumore Chaos Game di Java, spero che sia utile a tutti. Gli amici interessati possono continuare a consultare altre sezioni correlate di questo sito, e sono benvenuti i commenti sugli aspetti insufficienti. Grazie per il supporto degli amici a questo sito!

Dichiarazione: il contenuto di questo articolo è stato raccolto da Internet, il diritto d'autore spetta ai rispettivi proprietari, il contenuto è stato contribuito e caricato volontariamente dagli utenti di Internet, questo sito non detiene i diritti di proprietà, non è stato editato manualmente e non assume alcuna responsabilità legale. Se trovi contenuti sospetti di violazione del copyright, sei invitato a inviare una e-mail a: notice#oldtoolbag.com (al momento dell'invio dell'e-mail, sostituisci # con @) per segnalare il problema e fornire prove pertinenti. Una volta verificata, questo sito eliminerà immediatamente il contenuto sospetto di violazione del copyright.

Ti potrebbe interessare