quarta-feira, 3 de novembro de 2010

Explorações fractais II

Como o primeiro explorador não guardava a seqüência de passos para encontrar um ponto específico do Mandelbrot, resolvi fazer umas pequenas alterações. Agora, cada zoom é desenhado num Canvas novo.


<html>
<head>
<style>canvas {border:2px solid black; margin: 1px};</style>
</head>
<body>
<script>
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;
}

var body=document.getElementsByTagName("body")[0];
var canvas, ctx, imageData;
var minx=-2;
var miny=-2;
var maxx=2;
var maxy=2;

function prepare() {
if(canvas) {
canvas.onclick=null;
}
canvas=document.createElement("CANVAS");
canvas.setAttribute("width", 256);
canvas.setAttribute("height", 256);
body.appendChild(canvas);
ctx=canvas.getContext("2d");
imageData=ctx.getImageData(0,0,256,256);
canvas.onclick=zoom;
}

function plot() {
var deltax=(maxx-minx)/256;
var deltay=(maxy-miny)/256;
var deltay=(maxy-miny)/256;

prepare();
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();
}
</script>
</body>
</html>

O resultado é o que se vê na figura abaixo.


Clique na imagem para vê-la no tamanho original.

2 comentários:

Claudio disse...

Legal! Para completar, o terceiro post da serie poderia implementar o algoritmo para continuous smooth coloring :-)

forinti disse...

Hmmm... isso não estava nos requisitos. Vou precisar de um Change Request.