mandel-6502/sim.js

65 lines
1.6 KiB
JavaScript
Raw Normal View History

2023-01-08 05:19:40 +00:00
import {toFixed, toFloat, mul} from './fixed.js';
let max = 256;
let width = 256;
let height = 256;
let zoom = 1;
let black = 0xff000000;
let tricolor = [
0xffff0000,
0xff00ff00,
0xff0000ff,
];
let palette = new Uint32Array(256);
palette[0] = black;
for (let i = 0; i < 255; i++) {
palette[i + 1] = tricolor[i % 3];
}
function nap() {
return new Promise((resolve) => setTimeout(() => resolve()));
}
async function setup(id, iterfunc) {
let canvas = document.getElementById(id);
let ctx = canvas.getContext('2d');
let imageData = ctx.createImageData(width, height);
let rgba = new Uint32Array(imageData.data.buffer);
for (let y = 0; y < height; y++) {
let cy = (y * 2 - height) / (height / 2);
for (let x = 0; x < width; x++) {
let cx = (x * 2 - width) / (width / 2);
let i = iterfunc(cx, cy);
let color = palette[i];
rgba[y * width + x] = color;
rgba[(256 - y) * width + x] = color;
if (x % 16 == 15) {
ctx.putImageData(imageData, 0, 0);
await nap();
}
}
}
}
setup('float', (cx, cy) => {
let zx = 0;
let zy = 0;
let zx_2 = 0;
let zy_2 = 0;
let zx_zy = 0;
for (let i = 1; i < max; i++) {
zx = zx_2 - zy_2 + cx;
zy = zx_zy + zx_zy + cy;
zx_2 = zx * zx;
zy_2 = zy * zy;
zx_zy = zx * zy;
if (zx_2 >= 4 || zy_2 >= 4 || zx_2 + zy_2 >= 4) {
return i;
}
}
return 0;
}).then(() => {
console.log('done');
})