segunda-feira, 8 de novembro de 2010

Explorações fractais III

As imagens geradas pelo algoritmo inicial tinham faixas de cores, porque ele usa o número de passos necessários para a função z=z2+c fugir para o infinito.

A ação toda dá-se na função mandel().


function mandel(x,y) {
var c=0;
var r=0;
var i=0;
var MAXITER=1000;
while(r*r+i*i<4 && c<MAXITER) {
var nr=r*r-i*i+x;
var ni=2*r*i+y;
r=nr;
i=ni;
c+=1;
}
return c;
}



Cada coordenada da tela (x,y) vira um número imaginário (r,i). A função tira o quadrado desse número e soma o valor inicial até que o resultado seja maior que 4 (a conta tendeu ao infinito) ou o número de iterações passou de 10.000 (indicando que ele não vai tender ao infinito).

O número de iterações (c) é usado para escolher a cor e como muitos pontos caem entre uma iteração e outra, as faixas acabam aparendo.

Uma solução simples que encontrei para eliminar as faixas é normalizar com o MAXITER. A figura abaixo mostra o resultado.



A única mudança necessária no código é trocar o último comando da função mandel():


return (c/MAXITER)*256;



Uma alternativa é apresentada na Wikipédia: Continuous Smooth Coloring. O código e a imagem abaixo mostram a diferença. A imagem, ademais, foi gerada com uma paleta um pouco diferente (os componentes verde e vermelho são iguais).


return c + 1 - Math.log(Math.log(r*r+i*i))/Math.log(2);




Para terminar, como bônus, uma alteração descoberta por acaso que parece criar camadas na imagem.


return (Math.log(c)/Math.log(MAXITER))*256;


Nenhum comentário: