binary.py

2.5 kB · python · 109 lines

1import numpy as np2from typing import List3from .errors import MrlyError4from . import rules56# ZEROS78def zeros_2d(n: int) -> np.ndarray:9    return np.zeros((n, n), dtype=np.uint8)1011def zeros_3d(n: int) -> np.ndarray:12    return np.zeros((n, n, n), dtype=np.uint8)1314# ONES1516def ones_2d(n: int) -> np.ndarray:17    return np.ones((n, n), dtype=np.uint8)1819def ones_3d(n: int) -> np.ndarray:20    return np.ones((n, n, n), dtype=np.uint8)2122# NOISE2324def noise_2d(n: int, density: float = 0.5, rng=None) -> np.ndarray:25    if rng is None:26        rng = np.random27    return (rng.random((n, n)) < density).astype(np.uint8)2829def noise_3d(n: int, density: float = 0.5, rng=None) -> np.ndarray:30    if rng is None:31        rng = np.random32    return (rng.random((n, n, n)) < density).astype(np.uint8)3334# CARPET3536def carpet_2d(n: int) -> np.ndarray:37    return rules.carpet(n, 2)3839def carpet_3d(n: int) -> np.ndarray:40    return rules.carpet(n, 3)4142# NET4344def net_2d(n: int) -> np.ndarray:45    return rules.net(n, 2)4647def net_3d(n: int) -> np.ndarray:48    return rules.net(n, 3)4950# TREE5152def tree_2d(n: int) -> np.ndarray:53    return rules.tree(n, 2, free_axis=0)5455def tree_3d(n: int) -> np.ndarray:56    return rules.tree(n, 3, free_axis=2)5758def htree_2d(n: int) -> np.ndarray:59    return rules.tree(n, 2, free_axis=1)6061def vtree_2d(n: int) -> np.ndarray:62    return rules.tree(n, 2, free_axis=0)6364def xtree_3d(n: int) -> np.ndarray:65    return rules.tree(n, 3, free_axis=0)6667def ytree_3d(n: int) -> np.ndarray:68    return rules.tree(n, 3, free_axis=1)6970def ztree_3d(n: int) -> np.ndarray:71    return rules.tree(n, 3, free_axis=2)7273# VOID7475def void_2d(n: int) -> np.ndarray:76    return rules.void(n, 2)7778def void_3d(n: int) -> np.ndarray:79    return rules.void(n, 3)8081# GEOMETRY8283def invert(grid: np.ndarray) -> np.ndarray:84    return 1 - grid8586def rotate(grid: np.ndarray, k: int = 1) -> np.ndarray:87    k = k % 488    if k == 0:89        return grid90    return np.rot90(grid, k=k)9192def combine(grid_1: np.ndarray, grid_2: np.ndarray) -> np.ndarray:93    return np.kron(grid_1, grid_2).astype(np.uint8)9495def magic(grids: List[np.ndarray]) -> np.ndarray:96    if not grids:97        return np.array([[]], dtype=np.uint8)98    result: np.ndarray = grids[0]99    for i in range(1, len(grids)):100        result = combine(result, grids[i])101    return result102103def fractal(grid: np.ndarray, level: int) -> np.ndarray:104    if level == 1:105        return grid106    result = grid107    for _ in range(1, level):108        result = np.kron(result, grid)109    return result.astype(np.uint8)