Страницы

Поиск по вопросам

четверг, 20 июня 2019 г.

Карта гексагональной доски

Имеем гексагональную доску (см.рисунок) с длиной грани 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 )

Комментариев нет:

Отправить комментарий