better dealing with boundaries
getting circles (mind the FIXME)
This commit is contained in:
parent
c5428a4ea5
commit
987a5bab28
@ -59,6 +59,38 @@ class Coordinate:
|
|||||||
o_dist = max(dist) - min(dist)
|
o_dist = max(dist) - min(dist)
|
||||||
return 1.7 * d_steps + o_dist + 1.4 * min(dist)
|
return 1.7 * d_steps + o_dist + 1.4 * min(dist)
|
||||||
|
|
||||||
|
def inBoundaries(self, minX: int, minY: int, maxX: int, maxY: int, minZ: int = -inf, maxZ: int = inf) -> bool:
|
||||||
|
if self.z is None:
|
||||||
|
return minX <= self.x <= maxX and minY <= self.y <= maxY
|
||||||
|
else:
|
||||||
|
return minX <= self.x <= maxX and minY <= self.y <= maxY and minZ <= self.z <= maxZ
|
||||||
|
|
||||||
|
def getCircle(self, radius: int = 1, includeDiagonal: bool = True, minX: int = -inf, minY: int = -inf,
|
||||||
|
maxX: int = inf, maxY: int = inf, minZ: int = -inf, maxZ: int = inf) -> list[Coordinate]:
|
||||||
|
# FIXME: includeDiagonal == True returns way too few coordinates
|
||||||
|
ret = []
|
||||||
|
if self.z is None: # mode 2D
|
||||||
|
for x in range(self.x - radius * 2, self.x + radius * 2 + 1):
|
||||||
|
for y in range(self.y - radius * 2, self.y + radius * 2 + 1):
|
||||||
|
target = Coordinate(x, y)
|
||||||
|
if not target.inBoundaries(minX, minY, maxX, maxY):
|
||||||
|
continue
|
||||||
|
dist = self.getDistanceTo(target, DistanceAlgorithm.MANHATTAN, includeDiagonals=includeDiagonal)
|
||||||
|
if dist == radius:
|
||||||
|
ret.append(target)
|
||||||
|
else:
|
||||||
|
for x in range(self.x - radius * 2, self.x + radius * 2 + 1):
|
||||||
|
for y in range(self.y - radius * 2, self.y + radius * 2 + 1):
|
||||||
|
for z in range(self.z - radius * 2, self.z + radius * 2 + 1):
|
||||||
|
target = Coordinate(x, y)
|
||||||
|
if not target.inBoundaries(minX, minY, maxX, maxY, minZ, maxZ):
|
||||||
|
continue
|
||||||
|
dist = self.getDistanceTo(target, DistanceAlgorithm.MANHATTAN, includeDiagonals=includeDiagonal)
|
||||||
|
if dist == radius:
|
||||||
|
ret.append(target)
|
||||||
|
|
||||||
|
return ret
|
||||||
|
|
||||||
def getNeighbours(self, includeDiagonal: bool = True, minX: int = -inf, minY: int = -inf,
|
def getNeighbours(self, includeDiagonal: bool = True, minX: int = -inf, minY: int = -inf,
|
||||||
maxX: int = inf, maxY: int = inf, minZ: int = -inf, maxZ: int = inf) -> list[Coordinate]:
|
maxX: int = inf, maxY: int = inf, minZ: int = -inf, maxZ: int = inf) -> list[Coordinate]:
|
||||||
"""
|
"""
|
||||||
|
|||||||
@ -3,6 +3,7 @@ from .coordinate import Coordinate, DistanceAlgorithm, Shape
|
|||||||
from .types import Numeric
|
from .types import Numeric
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
from heapq import heappop, heappush
|
from heapq import heappop, heappush
|
||||||
|
from math import inf
|
||||||
from typing import Any, Dict, List, Union
|
from typing import Any, Dict, List, Union
|
||||||
|
|
||||||
OFF = False
|
OFF = False
|
||||||
@ -58,6 +59,12 @@ class Grid:
|
|||||||
self.minZ = pos.z if pos.z < self.minZ else self.minZ
|
self.minZ = pos.z if pos.z < self.minZ else self.minZ
|
||||||
self.maxZ = pos.z if pos.z > self.maxZ else self.maxZ
|
self.maxZ = pos.z if pos.z > self.maxZ else self.maxZ
|
||||||
|
|
||||||
|
def getBoundaries(self) -> (int, int, int, int, int, int):
|
||||||
|
if self.mode3D:
|
||||||
|
return self.minX, self.minY, self.maxX, self.maxY, self.minZ, self.maxZ
|
||||||
|
else:
|
||||||
|
return self.minX, self.minY, self.maxX, self.maxY, -inf, inf
|
||||||
|
|
||||||
def rangeX(self, pad: int = 0, reverse=False):
|
def rangeX(self, pad: int = 0, reverse=False):
|
||||||
if reverse:
|
if reverse:
|
||||||
return range(self.maxX + pad, self.minX - pad - 1, -1)
|
return range(self.maxX + pad, self.minX - pad - 1, -1)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user