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):
|
||||
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:
|
||||
|
||||
Loading…
Reference in New Issue
Block a user