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)