TheBird

variations.py

4.7 kB · python · 147 lines

1import copy2from mrlypy.core.state import choice, bool3from mrlypy.two import Cell2d, carpet_2d4import mrlypy.tile5from mrlypy.tile import Tile, build, random_design, random_rotation6from mrlypy.tile.enums import Design, Group7from config import MAX_CANVAS, MAX_MASK, MAX_TILE, MIN_CANVAS, MIN_MASK, MIN_TILE8from enums import Path9from models import Task1011def setup_grid(tile: Tile, max_canvas: int) -> Tile:12    print(f"Setting up grid for tile")13    possible_grid_sizes = []14    base_size = tile.max_unit_size15    for i in [1, 3, 5, 7, 9, 11]:16        if base_size * i <= max_canvas:17            possible_grid_sizes.append(i)18    if not possible_grid_sizes:19        possible_grid_sizes = [1]20    print(f"Possible grid sizes: {possible_grid_sizes}")21    tile.grid_size = choice(possible_grid_sizes)22    print(f"Chosen grid size: {tile.grid_size}")23    tile.grid_unit_width = tile.unit_width * tile.grid_size24    tile.grid_unit_height = tile.unit_height * tile.grid_size25    return tile2627def setup_tile(task: Task) -> Task:28    print(f"Setting up tile for variation: {task.key}")29    tile_config = mrlypy.tile.Config(30        min_size=MIN_TILE,31        max_size=MAX_TILE32    )33    tile = mrlypy.tile.create(tile_config)34    tile = setup_grid(tile, MAX_CANVAS)35    tile = build(tile)36    task.tile = tile37    return task3839def setup_canvas(task: Task) -> Task:40    print(f"Setting up canvas for variation: {task.key}")41    initial_size = task.tile.max_grid_unit_size42    possible_sizes = []43    for i in [1, 3, 5, 7, 9, 11]:44        size = initial_size * i45        if MIN_CANVAS <= size <= MAX_CANVAS:46            possible_sizes.append(i)47    if not possible_sizes:48        possible_sizes = [1]49    print(f"Possible canvas sizes: {possible_sizes}")50    task.canvas_size = choice(possible_sizes)51    print(f"Chosen canvas size: {task.canvas_size}")52    task.canvas_unit_width = task.canvas_size * task.tile.grid_unit_width53    task.canvas_unit_height = task.canvas_size * task.tile.grid_unit_height54    return task5556def pop_center(cell: Cell2d) -> Cell2d:57    center_index = cell.types.shape[0] // 258    cell.types[center_index, center_index] = 059    return cell6061def copy_mask(tile: Tile) -> Tile:62    t = copy.deepcopy(tile)63    if bool():64        t.invert = not t.invert65        t.cell.invert()66    return t6768def simple_mask() -> Tile:69    tile = Tile()70    tile.group = Group.GENERAL71    tile.design = [random_design()]72    tile.number = [3]73    tile.level = [1]74    tile.rotation = [random_rotation(tile.design[0])]75    tile.invert = bool() if tile.design[0] == Design.TREE else False76    tile = build(tile)77    pop_center(tile.cell)78    size = tile.number[0]79    tile.unit_width = size80    tile.unit_height = size81    tile.grid_size = 182    tile.grid_unit_width = size83    tile.grid_unit_height = size84    return tile8586def basic_mask(min_size: int, max_size: int) -> Tile:87    tile_config = mrlypy.tile.Config(groups=[Group.GENERAL, Group.FRACTAL, Group.MAGIC], min_size=min_size, max_size=max_size)88    tile = mrlypy.tile.create(tile_config)89    tile = build(tile)90    return tile9192def moore_mask() -> Tile:93    print(f"Setting up Moore mask")94    tile = Tile()95    tile.group = Group.GENERAL96    tile.design = [Design.CARPET]97    tile.number = [3]98    tile.level = [1]99    tile.cell = carpet_2d(3)100    size = tile.number[0]101    tile.unit_width = size102    tile.unit_height = size103    tile.grid_size = 1104    tile.grid_unit_width = size105    tile.grid_unit_height = size106    return tile107108def setup_mask(task: Task) -> Task:109    print(f"Setting up mask for variation: {task.key}")110    paths = [Path.SIMPLE, Path.BASIC]111    tile_size = task.tile.max_unit_size112    max_mask = min(MAX_MASK, task.canvas_unit_width, task.canvas_unit_height)113    print(f"Tile size: {tile_size}, max mask: {max_mask}")114    if MIN_MASK <= tile_size <= max_mask:115        paths.append(Path.COPY)116    print(f"Possible paths: {[p.value for p in paths]}")117    path = choice(paths)118    print(f"Chosen path: {path}")119    match path:120        case Path.SIMPLE:121            task.mask = simple_mask()122        case Path.BASIC:123            task.mask = basic_mask(MIN_MASK, max_mask)124        case Path.COPY:125            task.mask = copy_mask(task.tile)126    task.path = path127    task.mask.cell = pop_center(task.mask.cell)128    return task129130def setup_variations(task: Task) -> Task:131    print(f"Setting up variations for variation: {task.key}")132    task = setup_tile(task)133    task = setup_canvas(task)134    task = setup_mask(task)135    return task136137def tile_from_grid(grid: Cell2d) -> Tile:138    h, w = grid.types.shape139    tile = Tile()140    tile.cell = grid141    tile.unit_width = w142    tile.unit_height = h143    tile.grid_size = 1144    tile.grid_unit_width = w145    tile.grid_unit_height = h146    tile.invert = False147    return tile