terça-feira, 13 de novembro de 2012

Nau em chamas

Quase sem querer, encontrei um fractal curioso chamado Burning Ship. Ele é uma variação do conjunto de Mandelbrot; a única diferença é que, a cada iteração, são aplicados os valores absolutos dos componentes imaginário e real.

Aproveitei o código de aventuras anteriores. Com o Javascript abaixo é possível analisar este fractal; basta clicar sobre a imagem para inspecionar regiões cada vez menores.

<html>
  <head>
  </head>
  <body>
    <canvas id="canvas" width="256" height="256"></canvas>
    <script>

function mandel(x,y) {
  var c=1;
  var r=0;
  var i=0;
  var MAXITER=512;
  while(r*r+i*i<4 && c<MAXITER) {
    var t=2*Math.atan2(i,r);
    var d=Math.pow(Math.sqrt(r*r+i*i),2);
    var nr=d*Math.cos(t)+x;
    var ni=d*Math.sin(t)+y;
    r=Math.abs(nr);//Aqui ocorre
    i=Math.abs(ni);//a mágica
    c+=1;
  }
  return c;
}

var canvas=document.getElementById("canvas");
var ctx=canvas.getContext("2d");
var imageData=ctx.getImageData(0,0,256,256);
   
var minx=-2;
var miny=-2;
var maxx=2
var maxy=2;
   
  
function plot() {
  var deltax=(maxx-minx)/256;
  var deltay=(maxy-miny)/256;
 
  for(var x=0; x<256; x++) {
    for(var y=0; y<256; y++) {
      var c=mandel(minx+x*deltax, miny+y*deltay);
      var red=(c*8)%255;
      var green=(c*9)%255;
      var blue=(255-c*4)%255;
      var index=(x+y*imageData.width)*4;
      imageData.data[index+0]=red;
      imageData.data[index+1]=green;
      imageData.data[index+2]=blue;
      imageData.data[index+3]=0xff;
    }
  }
  ctx.putImageData(imageData,0,0);
}
plot();
   
function zoom(e) {
  var x=minx+(maxx-minx)*((e.clientX-canvas.offsetLeft)/256);
  var y=miny+(maxy-miny)*((e.clientY-canvas.offsetTop)/256);
  var dx=(maxx-minx)/4;
  var dy=(maxy-miny)/4;
  
  minx=x-dx;
  maxx=x+dx;
  miny=y-dy;
  maxy=y+dy;
  plot();
}
canvas.onclick=zoom;
   
    </script>
  </body>
</html>

Como se espera de um fractal, o tema torna a surgir com formas e cores ligeiramente diferentes.

Nenhum comentário: