from typing import Iterable, List
from gym_gridverse.geometry import Area, Position
from gym_gridverse.grid import Grid
from gym_gridverse.grid_object import GridObjectFactory, Wall
[docs]def draw_wall_boundary(grid: Grid) -> List[Position]:
"""draw boundary of walls on grid"""
return draw_room(grid, grid.area, Wall)
[docs]def draw_room(
grid: Grid, area: Area, factory: GridObjectFactory
) -> List[Position]:
"""use factory-created grid-objects to draw room boundary on grid"""
return draw_area(grid, area, factory, fill=False)
[docs]def draw_room_grid(
grid: Grid, ys: Iterable[int], xs: Iterable[int], factory: GridObjectFactory
) -> List[Position]:
"""use factory-created grid-objects to draw a grid of rooms on grid"""
y_range = range(min(ys), max(ys) + 1)
x_range = range(min(xs), max(xs) + 1)
# draw horizontal lines
positions = draw_cartesian_product(grid, ys, x_range, factory)
# fill in remaining vertical lines
ys_remaining = [y for y in y_range if y not in ys]
positions += draw_cartesian_product(grid, ys_remaining, xs, factory)
return positions
[docs]def draw_area(
grid: Grid, area: Area, factory: GridObjectFactory, *, fill: bool
) -> List[Position]:
"""use factory-created grid-objects to draw area on grid"""
positions = list(area.positions('all' if fill else 'border'))
for pos in positions:
grid[pos] = factory()
return positions
[docs]def draw_line_horizontal(
grid: Grid, y: int, xs: Iterable[int], factory: GridObjectFactory
) -> List[Position]:
"""use factory-created grid-objects to draw horizontal line on grid"""
return draw_cartesian_product(grid, [y], xs, factory)
[docs]def draw_line_vertical(
grid: Grid, ys: Iterable[int], x: int, factory: GridObjectFactory
) -> List[Position]:
"""use factory-created grid-objects to draw vertical line on grid"""
return draw_cartesian_product(grid, ys, [x], factory)
[docs]def draw_cartesian_product(
grid: Grid, ys: Iterable[int], xs: Iterable[int], factory: GridObjectFactory
) -> List[Position]:
"""use factory-created grid-objects to draw on grid"""
positions = [Position(y, x) for y in ys for x in xs]
for position in positions:
grid[position] = factory()
return positions