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}