52 lines
1.3 KiB
JavaScript
52 lines
1.3 KiB
JavaScript
// The mandelbrot set definition
|
|
const set = (c) =>
|
|
(z) => z.multiply(z).add(c);
|
|
|
|
|
|
const BASE_COLOR = new Color(60, 60, 200, 255);
|
|
|
|
(function render() {
|
|
requestAnimationFrame(() => {
|
|
const image = ctx.createImageData(board.width, board.height);
|
|
|
|
for (let i = 0; i < board.width; i++) {
|
|
for (let j = 0; j < board.height; j++) {
|
|
const scaledX = rangeTransform(i, 0, board.width, -2.5, 1);
|
|
const scaledY = rangeTransform(j, 0, board.height, -1, 1);
|
|
|
|
// constant: x_0 + iy_0
|
|
const c = new Complex(scaledX, scaledY);
|
|
|
|
// The mandelbrot set, with the constant value fixed
|
|
const f = set(c);
|
|
let value = new Complex(0, 0);
|
|
|
|
let step = 0;
|
|
while (value.squaredAbsolute() < 4 && step < maxIterations) {
|
|
value = f(value);
|
|
step++;
|
|
}
|
|
|
|
let color = BASE_COLOR.clone();
|
|
color.hue((baseHue / 255) + step*step / maxIterations);
|
|
|
|
paintPixel(image, i, j, color);
|
|
}
|
|
}
|
|
|
|
ctx.putImageData(image, 0, 0);
|
|
|
|
render();
|
|
});
|
|
}());
|
|
|
|
maxIterations = 0;
|
|
const mxi = setInterval(() => {
|
|
maxIterations = Math.min(maxIterations + 10, 300);
|
|
document.getElementById('max-iterations').value = maxIterations;
|
|
|
|
if (maxIterations === 300) {
|
|
clearInterval(mxi);
|
|
}
|
|
}, 200);
|