[Introdução]
Eu tenho lido "o segredo conciso". Há um capítulo que introduz vários métodos de uso de ruído para gerar gráficos fractais. Parece muito interessante, então tentei usar um computador para simulá -lo, e o efeito não é ruim (o método de ruído é mais fácil de implementar na programação do que o método iterativo tradicional. Mais tarde, descobri que ainda existem muitos desses algoritmos, para que eu possa encontrar mais em busca de Chaosgame).
[Método de geração de ruído do triângulo Sierpinski]
Nestes jogos de ruído, as regras para gerar triângulos de Sierpinski são os mais fáceis:
1. Selecione três pontos no plano, marcados como 1, 2 e 3, como os vértices do grande triângulo.
2. Selecione um deles como o "ponto de corrente" (como a seleção nº 1).
3. Gere um número aleatório de 1 a 3, desenhe um novo ponto no ponto médio do vértice e o "ponto de corrente" expresso pelo número e use o novo ponto como o "ponto de corrente".
4. Repita a Etapa 3 para se aproximar do padrão.
*. Preste atenção aos números aleatórios, é melhor não usar o tempo como o caminho da geração de sementes.
[Programa de simulação]
pacote com.geiv.chaos; importar java.awt.event.keyevent; importação com.thrblock.util.randomset; importar geivcore.defaultFactor; importação geivcore.keyFactor; importCore.KeyListener; Importcore.r; ImporterCore.uesi; DefaultFactor implementa o KeyListener {uesi ues; obj [] base de base; obj crtpoint; public Sierpinski (uesi ues, int times) {this.ues = ues; basepoint = new obsj [3]; // crie três pontos de referência para (int i = 0; i <3 i ++); Ues.creatobj (uesi.bgindex); base [i] .AddglPoint ("70DBDB", 0,0); Basepoint [i] .show ();} base [0] .SetCentralx (400); // Defina a posição de três pontos BasePoint [0] .SsetCentraly (60); BasePoint [1] .SetCentralX (60); BasePoint [1] .SetCentraly (550); BasePoint [2] .SetCentralX (740); BasePoint [2]. 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 new ponto correspondente a generateNew ();} else if (keycode == keyEvent.vk_a) {// a corresponde a 100 novos pontos para (int i = 0; i <100; i ++) {generateNew ();}}} se (keycode == keyEvent.vk_b) {// bs para 1000 para 1000 para 1000 para 1000 para 1000 if (keycode == keyEvent.vk_b) {/bs a 1}}} 1000; i ++) {generateNew ();}}}}} public void generateNew () {obj flagPoint = BasePoint [RandomSet.getrandomnum (0, 2)]; // CRTPOINTXEMPTELTX (FLOATT) () 1; (flagPoint.getCentraly () + crtPoint.getCentraly ())/2f; obj newPoint = ues.creatobj (uesi.bgindex); // crie um novo ponto newPoint.addglPoint ("70DBDB", 0,0); newpoint.SetColor (RandomEtRaRandomCollCol "; Coordena o newPoint.SetCentraly (NY); newPoint.Show (); CrtPoint = newPoint; // Defina como o ponto atual} public static void main (string [] args) {uesi ues = novos parâmetros de construção pode definir os pontos iniciais do SierPinski (ues, 0); // Os parâmetros de construção subsequentes podem definir o número inicial do número inicial. }}[Resultados da simulação]
Quando a tecla B é pressionada
[Método de geração de ruído de Barnsleyfern]
Comparado à simples regularidade do triângulo Sierpinski, Barnsleyfern (grama de dentes fractal) dá às pessoas uma impressão mais complexa. Devido à sua complexidade, a disciplina do caos geralmente surge para provar a conclusão de que "regras simples também podem produzir objetos complexos".
Suas regras de geração também não são complicadas:
1. Primeiro, dado o "ponto de corrente" (0,0), usamos OX e OY para representar coordenadas horizontais e verticais.
2. Para calcular o próximo ponto (NX, NY), você precisa selecionar uma das quatro fórmulas de iteração a seguir com certas regras aleatórias:
1) Selecione esta fórmula de iteração com a probabilidade de %1:
nx = 0;
NY = 0,16f*oy;
2) Selecione esta fórmula de iteração com a probabilidade de %85:
nx = 0,85*ox+0,04*oy;
NY = -0,04*OX+0,85*oy+1,6;
3) Selecione esta fórmula de iteração com a probabilidade de %7:
nx = 0,2*ox-0.26*oy;
NY = 0,23*OX+0,22*oy+1,6;
4) Selecione esta fórmula de iteração com a probabilidade de %7:
nx = -0,15*ox+0,28*oy;
NY = 0,26*OX+0,24*oy+0,44;
3. Desenhe (NX, NY), defina -o para o ponto atual, repita 2 e você pode aproximar o resultado infinitamente.
↑ A fórmula acima é extraída do Wiki: http://en.wikipedia.org/wiki/barnsley_fern. Ao programar, encontrei um problema. O wiki não especificou a relação entre o valor relativo dessa coordenada e o tamanho da tela, nem especificou a direção dos eixos X e Y. O desenho sempre não teve êxito no sistema de coordenadas que eu defini. Mais tarde, procurei de acordo com a fórmula e encontrei esta superfície: http://people.sc.fsu.edu/~jburkardt/cpp_src/fern_opengl/fern.cpp. Este é um programa OpenGL em C ++, e a mesma fórmula que o wiki é usada. Ou seja, esse conjunto de fórmulas é baseado no sistema de coordenadas do OpenGL. Depois de fazer a transformação correspondente, foi finalmente desenhada com sucesso.
[Programa de simulação]
pacote com.geiv.chaos; importar geivcore.defaultFactor; importar geivcore.keyFactor; importar geivcore.keylistener; importar geivcore.r; importar geivcore.uesi; imporíssima geivcore.enginedata.obj.obj; importar java.awt.color; importar java.w.w.obj.obj; import.ev.awkey; com.thhrblock.util.randomset; classe pública Barnsleyfern estende o DefaultFactor implementa 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); thTtPoint.SetListRener (that); that); <times; i ++) {generateNew ();}}@substituir public void DokeyBord (KeyFactor Who, int keycode, Boolean ispreted) {// O método IO do teclado é o mesmo que acima (generatenw) {if (keycode == keyEvent.vk_space) {generatenw () {if (keycode == ». KeyEvent.vk_a) {for (int i = 0; i <100; i ++) {generateNew ();}} else if (keycode == keyEvent.vk_b) {for (int i = 0; i <100; i ++) {generatenew ();}}}} para (keycode ===; 1000; i ++) {generateNew ();}}}} public void generateNew () {float nx, ny; ox float = crtPoint.getCentralx ()/150f, oys de que a coordenação de 600 cenário. Código duplo = 100.0 * RandomSet.Getrandomfloatin_1 (); // Número do ponto flutuante aleatório 0 ~ 100 se (código> = 0 && code <= 1) {nx = 0; ny = 0,00f * ox + 0,16f * oy;} else (código> 1 && code <= 86) {nx = 0.85f *; 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,28*oy; ny; ny; 0.44f;} obj newPoint = ues.creatobj (uesi.bgindex); newpoint.addglpoint ("70dbdb", 0,0); newpoint.setColor (color.green); newpoint.setCentralx (nx*150f); ny*60f); newpoint.show (); CrtPoint = newPoint; // Defina o novo ponto para o ponto atual. } public static void main (string [] args) {uesi ues = new r (); new Barnsleyfern (ues, 0);}}[Resultados da simulação]
Resumir
O exposto acima é todo o conteúdo deste artigo sobre o código Java Chaos Game Noise Game Code, espero que seja útil para todos. Amigos interessados podem continuar se referindo a outros tópicos relacionados neste site. Se houver alguma falha, deixe uma mensagem para apontá -la. Obrigado amigos pelo seu apoio para este site!