From 0c0a9a7eb14d95378e0d02a117dea4947b12a32f Mon Sep 17 00:00:00 2001 From: Stefan Harmuth Date: Tue, 30 Nov 2021 12:46:25 +0100 Subject: [PATCH] grid transformations --- grid.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) diff --git a/grid.py b/grid.py index 7e9820c..a124e29 100644 --- a/grid.py +++ b/grid.py @@ -1,12 +1,23 @@ from __future__ import annotations from coordinate import Coordinate -from typing import Union +from enum import Enum +from typing import Union, Any OFF_STATES = [False, 0, None] OFF = False ON = True +class GridTransformation(Enum): + FLIP_HORIZONTALLY = 1 + FLIP_VERTICALLY = 2 + FLIP_DIAGONALLY = 3 + FLIP_DIAGONALLY_REV = 4 + ROTATE_RIGHT = 5 + ROTATE_LEFT = 6 + ROTATE_TWICE = 7 + + class Grid: def __init__(self, default=False): self.__default = default @@ -36,13 +47,19 @@ class Grid: self.__trackBoundaries(pos) self.__grid[pos] = not self.__default - def set(self, pos: Coordinate, value: any): + def set(self, pos: Coordinate, value: Any): if value in OFF_STATES and pos in self.__grid: del self.__grid[pos] elif value not in OFF_STATES: self.__trackBoundaries(pos) self.__grid[pos] = value + def get(self, pos: Coordinate) -> Any: + if pos in self.__grid: + return self.__grid[pos] + else: + return self.__default + def getState(self, pos: Coordinate) -> bool: if pos not in self.__grid: return False @@ -109,3 +126,41 @@ class Grid: neighbour_sum += self.__grid[neighbour] return neighbour_sum + + def flip(self, c1: Coordinate, c2: Coordinate): + buf = self.get(c1) + self.set(c1, self.get(c2)) + self.set(c2, buf) + + def transform(self, mode: GridTransformation): + if mode == GridTransformation.FLIP_HORIZONTALLY: + for x in range(self.minX, (self.maxX - self.minX) // 2 + 1): + for y in range(self.minY, self.maxY + 1): + self.flip(Coordinate(x, y), Coordinate(self.maxX - x, y)) + elif mode == GridTransformation.FLIP_VERTICALLY: + for y in range(self.minY, (self.maxY - self.minY) // 2 + 1): + for x in range(self.minX, self.maxX + 1): + self.flip(Coordinate(x, y), Coordinate(x, self.maxY - y)) + elif mode == GridTransformation.FLIP_DIAGONALLY: + self.transform(GridTransformation.ROTATE_LEFT) + self.transform(GridTransformation.FLIP_HORIZONTALLY) + elif mode == GridTransformation.FLIP_DIAGONALLY_REV: + self.transform(GridTransformation.ROTATE_RIGHT) + self.transform(GridTransformation.FLIP_HORIZONTALLY) + elif mode == GridTransformation.ROTATE_LEFT: + newGrid = Grid() + for x in range(self.maxX, self.minX - 1, -1): + for y in range(self.minY, self.maxY + 1): + newGrid.set(Coordinate(y, self.maxX - x), self.get(Coordinate(x, y))) + + self.__dict__.update(newGrid.__dict__) + elif mode == GridTransformation.ROTATE_RIGHT: + newGrid = Grid() + for x in range(self.minX, self.maxX + 1): + for y in range(self.maxY, self.minY - 1, -1): + newGrid.set(Coordinate(self.maxY - y, x), self.get(Coordinate(x, y))) + + self.__dict__.update(newGrid.__dict__) + elif mode == GridTransformation.ROTATE_TWICE: + self.transform(GridTransformation.ROTATE_RIGHT) + self.transform(GridTransformation.ROTATE_RIGHT)