function mandelIter(cx, cy, maxIter) {
let x = 0.0;
let y = 0.0;
let xx = 0;
let yy = 0;
let xy = 0;
let i = maxIter;
while (i-- && xx + yy <= 4) {
xy = x * y;
xx = x * x;
yy = y * y;
x = xx - yy + cx;
y = xy + xy + cy;
}
return maxIter - i;
}
function mandelbrot(canvas, xmin, xmax, ymin, ymax, iterations) {
const width = canvas.width;
const height = canvas.height;
const ctx = canvas.getContext('2d');
const img = ctx.getImageData(0, 0, width, height);
const pix = img.data;
const pixels = Array.from({ length: width * height }, (_, index) => {
const ix = index % width;
const iy = Math.floor(index / width);
const x = xmin + (xmax - xmin) * ix / (width - 1);
const y = ymin + (ymax - ymin) * iy / (height - 1);
const i = mandelIter(x, y, iterations);
if (i > iterations) {
return [0, 0, 0, 255];
} else {
const c = 3 * Math.log(i) / Math.log(iterations - 1.0);
if (c < 1) {
const shade = Math.floor(255 * c);
return [shade, shade, shade, 255];
} else if (c < 2) {
const shade = Math.floor(255 * (c - 1));
return [shade, shade, shade, 255];
} else {
const shade = Math.floor(255 * (c - 2));
return [shade, shade, shade, 255];
}
}
});
pixels.forEach(([r, g, b, a], index) => {
const ppos = 4 * index;
pix[ppos] = r;
pix[ppos + 1] = g;
pix[ppos + 2] = b;
pix[ppos + 3] = a;
});
ctx.putImageData(img, 0, 0);
}
const canvas = document.getElementById('mandelbrot');
canvas.width = 900;
canvas.height = 600;
mandelbrot(canvas, -2, 1, -1, 1, 1000);