diff --git a/tools/coordinate.py b/tools/coordinate.py index 0871fe4..32092cc 100644 --- a/tools/coordinate.py +++ b/tools/coordinate.py @@ -1,9 +1,8 @@ from __future__ import annotations -from dataclasses import dataclass from enum import Enum from math import gcd, sqrt, inf, atan2, degrees from .math import round_half_up -from typing import Union, List, Optional +from typing import Union, List class DistanceAlgorithm(Enum): @@ -14,11 +13,24 @@ class DistanceAlgorithm(Enum): CHESSBOARD = 2 -@dataclass(frozen=True) -class Coordinate: - x: int - y: int - z: Optional[int] = None +class Coordinate(tuple): + def __new__(cls, x: int, y: int, z: int = None) -> Coordinate: + return tuple.__new__(Coordinate, (x, y, z)) + + @property + def x(self): + return self[0] + + @property + def y(self): + return self[1] + + @property + def z(self): + return self[2] + + def is3D(self) -> bool: + return self.z is not None def getDistanceTo(self, target: Coordinate, algorithm: DistanceAlgorithm = DistanceAlgorithm.EUCLIDEAN, includeDiagonals: bool = False) -> Union[int, float]: @@ -156,7 +168,11 @@ class Coordinate: step_x = diff.x // steps step_y = diff.y // steps step_z = diff.z // steps - return [self.__class__(self.x + step_x * i, self.y + step_y * i, self.z + step_z * i) for i in range(steps + 1)] + return [ + self.__class__(self.x + step_x * i, self.y + step_y * i, self.z + step_z * i) + for i + in range(steps + 1) + ] def reverse(self) -> Coordinate: if self.z is None: @@ -191,11 +207,6 @@ class Coordinate: def __truediv__(self, other): return self // other - def __eq__(self, other): - if not isinstance(other, Coordinate): - return False - return self.x == other.x and self.y == other.y and self.z == other.z - def __gt__(self, other): if self.z is None: return self.x > other.x and self.y > other.y