implement Chebyshev/Chessboard distance algorithm
This commit is contained in:
parent
3c855e6749
commit
0b8a477184
@ -7,8 +7,10 @@ from typing import Union, List, Optional
|
|||||||
|
|
||||||
class DistanceAlgorithm(Enum):
|
class DistanceAlgorithm(Enum):
|
||||||
MANHATTAN = 0
|
MANHATTAN = 0
|
||||||
PYTHAGORAS = 1
|
EUCLIDEAN = 1
|
||||||
|
PYTHAGOREAN = 1
|
||||||
|
CHEBYSHEV = 2
|
||||||
|
CHESSBOARD = 2
|
||||||
|
|
||||||
@dataclass(frozen=True, order=True)
|
@dataclass(frozen=True, order=True)
|
||||||
class Coordinate:
|
class Coordinate:
|
||||||
@ -16,7 +18,7 @@ class Coordinate:
|
|||||||
y: int
|
y: int
|
||||||
z: Optional[int] = None
|
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]:
|
includeDiagonals: bool = False) -> Union[int, float]:
|
||||||
"""
|
"""
|
||||||
Get distance to target Coordinate
|
Get distance to target Coordinate
|
||||||
@ -31,11 +33,16 @@ class Coordinate:
|
|||||||
assert isinstance(mode, DistanceAlgorithm)
|
assert isinstance(mode, DistanceAlgorithm)
|
||||||
assert isinstance(includeDiagonals, bool)
|
assert isinstance(includeDiagonals, bool)
|
||||||
|
|
||||||
if mode == DistanceAlgorithm.PYTHAGORAS:
|
if mode == DistanceAlgorithm.EUCLIDEAN:
|
||||||
if self.z is None:
|
if self.z is None:
|
||||||
return sqrt(abs(self.x - target.x) ** 2 + abs(self.y - target.y) ** 2)
|
return sqrt(abs(self.x - target.x) ** 2 + abs(self.y - target.y) ** 2)
|
||||||
else:
|
else:
|
||||||
return sqrt(abs(self.x - target.x) ** 2 + abs(self.y - target.y) ** 2 + abs(self.z - target.z) ** 2)
|
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:
|
elif mode == DistanceAlgorithm.MANHATTAN:
|
||||||
if not includeDiagonals:
|
if not includeDiagonals:
|
||||||
if self.z is None:
|
if self.z is None:
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user