tiles.js

1.2 kB · javascript · 44 lines

1export const DESIGNS = ['carpet', 'net', 'htree', 'vtree', 'void'];23export const NUMBERS = [3, 5, 7, 9];45export const LEVELS = [1, 2];67/* RULES */89const RULES = {10  carpet: (r, c) => (r & 1) + (c & 1) <= 1,11  net: (r, c) => (r & 1) + (c & 1) >= 1,12  htree: (r) => (r & 1) === 0,13  vtree: (r, c) => (c & 1) === 0,14  void: (r, c) => (r & 1) === (c & 1),15};1617export function seed(design, n) {18  const rule = RULES[design] ?? RULES.carpet;19  const cells = new Uint8Array(n * n);20  for (let r = 0; r < n; r++) for (let c = 0; c < n; c++) cells[r * n + c] = rule(r, c) ? 1 : 0;21  return { size: n, cells };22}2324/* GROWTH */2526export function kron(base, level = 2) {27  let out = base;28  const p = base.size;29  for (let step = 1; step < level; step++) {30    const size = out.size * p;31    const cells = new Uint8Array(size * size);32    for (let r = 0; r < size; r++) {33      const up = ((r / p) | 0) * out.size;34      const lo = (r % p) * p;35      for (let c = 0; c < size; c++) cells[r * size + c] = out.cells[up + ((c / p) | 0)] & base.cells[lo + (c % p)];36    }37    out = { size, cells };38  }39  return out;40}4142export function tile(design, n = NUMBERS[0], level = 1) {43  return kron(seed(design, n), level);44}