Имеем гексагональную доску (см.рисунок) с длиной грани D
Имеем три измерения (направления): красное, синее и зеленое
Имеем номера линий по трем направлениям (конкретные значения не критичны, они могут быть любыми)
Необходимо составить карту зависимостей номера линии в измерении, позиции ячейки в этой линии для каждой ячейки всей доски.
То есть для номера 1 нужно получить данные по трем измерениям: 1:(1,0), 2:(7,0), 3:(1,0)
аналогично к примеру для номера 21: 1:(3,5), 2:(6,3), 3:(10,3)
(3,5) например означает линия 3, ячейка 5.
Для красного измерения все весьма просто:
S = K * D + N + summ(range(1,K-1)) - 2*summ(range(1,K-D))
где
K - номер линии
D - размер доски (меньшая грань)
N - номер ячейки в линии
range - функция, возвращающая диапазон, а если левая граница больше правой, то возвращающая 0
S - номер ячейки для всей доски
Никак не могу сообразить, как вычислить два других измерения?
Ответ
Воспользовался советом @KromStern:
У вас странная координатная сетка. Обычно гексы представляют как 2-мерный массив со смещением каждой нечетной линии на 0,5 в отрисовке и доступом к 6 соседям вместо 8 в логике.
Все получилось значительно проще и нагляднее:
---*-*-*---
--*-*-*-*--
-*-*-*-*-*-
--*-*-*-*--
---*-*-*---
Алгоритм прост:
создаем промежуточный прямоугольный массив по схеме выше
вычисляем формулы для трех измерений: dim1, dim2, dim3
заполняем промежуточный массив
перенумеровываем ключи промежуточного массива, начиная с нуля
Для Python получился следующий код, создающий карту доски:
def dim1( k, n, d ):
y = k
x = abs( k - d + 1) + 2 * n
return [ y, x ]
def dim2( k, n, d ):
t = k-d+1
y = n
if t>0: y+= t
x = abs( 1-d )+2*k-n
if t>0: x-= t
return [ y, x ]
def dim3( k, n, d ):
t1 = k - d + 1
t2 = d - k - 1
y = n
if t2>0: y+=t2
x = k + n
if t1>0: x+=t1
return [ y, x ]
def pushToRes( y, x, d, val, res, dimens ):
ind = y*4*d+x
if ( not ind in res.keys() ): res[ind] = {}
res[ind][ dimens ] = val
res = {}
d= 7
lens = list(range(d,2*d))+list(range(2*d-2,d-1,-1)) # d=3, lens = [3,4,5,4,3]
for i in range( 0, 2*d-1 ):
for j in range( lens[i] ):
d1 = dim1( i, j ,d )
d2 = dim2( i, j ,d )
d3 = dim3( i, j ,d )
pushToRes( d1[0], d1[1], d, [i,j], res, 1 )
pushToRes( d2[0], d2[1], d, [i,j], res, 2 )
pushToRes( d3[0], d3[1], d, [i,j], res, 3 )
print( res )
print( len( res ) ) // контроль, что число ячеек соответствует действительности
x = list(res.keys())
x.sort()
res2 = [ res[i] for i in x ]
print( res2 )
Комментариев нет:
Отправить комментарий