<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.
Legal! Para completar, o terceiro post da serie poderia implementar o algoritmo para continuous smooth coloring :-)
ResponderExcluirHmmm... isso não estava nos requisitos. Vou precisar de um Change Request.
ResponderExcluir