xxxxxxxxxx
const w = 300;
const brushRadius = 5;
const dead = new Uint8Array([0, 0, 0, 255]);
const alive = new Uint8Array([255, 255, 255, 255]);
let grid = new Uint8Array(w * w);
let zoom;
let mat = [1, 1, -5];
function setup() {
const m = min(windowWidth, windowHeight);
createCanvas(m, m);
background(0);
zoom = w / m;
pixelDensity(zoom);
background(255);
loadPixels();
grid = grid.map((v) => (v = random(256)));
sum = mat[0] + mat[1] * 4 + mat[2] * 4;
mat = mat.map((e) => e / sum / 9);
}
function draw() {
const newGrid = new Uint8Array(grid);
for (let y = 1; y < w - 1; y++) {
for (let x = 1; x < w - 1; x++) {
const i = x + y * w;
const self = grid[i];
const sum1 =
grid[i - w]
+ grid[i - 1]
+ grid[i + 1]
+ grid[i + w];
const sum2 =
grid[i - 1 - w]
+ grid[i + 1 - w]
+ grid[i - 1 + w]
+ grid[i + 1 + w];
const sum =
self * mat[0]
+ sum1 * mat[1]
+ sum2 * mat[2];
newGrid[i] = sum;
col = sum > grid[i] ? alive : dead;
pixels.set(col, i * 4);
}
}
grid = newGrid;
updatePixels();
}
function mouseDragged() {
for (let dy = -brushRadius; dy <= brushRadius; dy++) {
for (let dx = -brushRadius; dx <= brushRadius; dx++) {
if (dx ** 2 + dy ** 2 > brushRadius ** 2) continue;
const x = floor(mouseX * zoom + dx);
const y = floor(mouseY * zoom + dy);
if (0 <= x && x < w && 0 <= y && y < w) grid[x + y * w] = random(256);
}
}
}