implement Chebyshev/Chessboard distance algorithm

This commit is contained in:
Stefan Harmuth 2021-12-13 07:39:08 +01:00
parent 3c855e6749
commit 0b8a477184

View File

@ -7,8 +7,10 @@ from typing import Union, List, Optional
class DistanceAlgorithm(Enum):
MANHATTAN = 0
PYTHAGORAS = 1
EUCLIDEAN = 1
PYTHAGOREAN = 1
CHEBYSHEV = 2
CHESSBOARD = 2
@dataclass(frozen=True, order=True)
class Coordinate:
@ -16,7 +18,7 @@ class Coordinate:
y: int
z: Optional[int] = None
def getDistanceTo(self, target: Coordinate, mode: DistanceAlgorithm = DistanceAlgorithm.PYTHAGORAS,
def getDistanceTo(self, target: Coordinate, mode: DistanceAlgorithm = DistanceAlgorithm.EUCLIDEAN,
includeDiagonals: bool = False) -> Union[int, float]:
"""
Get distance to target Coordinate
@ -31,11 +33,16 @@ class Coordinate:
assert isinstance(mode, DistanceAlgorithm)
assert isinstance(includeDiagonals, bool)
if mode == DistanceAlgorithm.PYTHAGORAS:
if mode == DistanceAlgorithm.EUCLIDEAN:
if self.z is None:
return sqrt(abs(self.x - target.x) ** 2 + abs(self.y - target.y) ** 2)
else:
return sqrt(abs(self.x - target.x) ** 2 + abs(self.y - target.y) ** 2 + abs(self.z - target.z) ** 2)
elif mode == DistanceAlgorithm.CHEBYSHEV:
if self.z is None:
return max(abs(target.x - self.x), abs(target.y - self.y))
else:
return max(abs(target.x - self.x), abs(target.y - self.y), abs(target.z - self.z))
elif mode == DistanceAlgorithm.MANHATTAN:
if not includeDiagonals:
if self.z is None: