Ниже приведено определение частичного класса для карты 2D изометрических плит, которые будут отображаться с использованием пиглета.Как ускорить итерацию через этот преобразованный массив numpy?
class Map(object):
origin = 0
drytile = tile.dry
wettile = tile.wet
def __init__(self, left=8, right=8):
self.grid = np.array(([None] * left, [None] * right), dtype=object)
self._setup_grid()
def __iter__(self):
"""return tiles in the order in which they should be rendered"""
# get number of diagonals
ndiags = (np.max(self.grid.shape) * 2) -\
(1 + (np.max(self.grid.shape) - np.min(self.grid.shape)))
# get iterator to go through diagonals in back-to-front order
offsets = xrange(-(ndiags/2), ndiags/2 + 1)
# iterate in render order
for off in offsets:
for tile in np.flipud(self.grid).diagonal(off)[::-1]:
yield tile
Эти плитки должны быть оказаны назад к фронту, в соответствии с этой схемой:
В моем определении класса, происхождение относится к самой верхней плитки (плитки a
) , поэтому размер left
, определенный в классе, представляет собой вектор вдоль [a b d g]
, а размер right
представляет собой вектор вдоль [a c f j]
.
Это критически важная часть моего приложения, поскольку я намерен отображать большое количество фрагментов. Есть ли более быстрый способ итерации через плитки в указанном порядке? Может ли исключить помощь вложенного цикла?
Большое спасибо!
Вы говорите о 'np.flipud (self.grid) .diagonal (off) [:: - 1]' statement? Если это так, мне не сразу становится очевидным, как упорядочить массив. Есть ли у вас какие-либо предложения? – blz