Гексагональная матрица (нужен совет)
Модератор: Модераторы разделов
-
brazhe
- Сообщения: 89
Гексагональная матрица
Вот, нужно мне задать элементы на гексагональной решетке --- чтобы у каждого элемента было по 6 ближайших соседей. Посоветуйте, пожалуйста, как это можно сделать 
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
elide
- Бывший модератор
- Сообщения: 2421
- Статус: Übermensch
- ОС: лялих
Re: Гексагональная матрица
это можно сделать с помошью указателей (:
а вообще, можно вопрос по подробней?
а вообще, можно вопрос по подробней?
слава роботам!
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
На самом деле проще и экономичнее всего сделать это через обыкновенные массивы.
Если в квадратичной матрице сдвинуть каждую, скажем, чётную строку на пол-ячейки влево, то получится хексагональная матрица (для полноты картины нужно ещё каждый квадрат-ячейку заменить шестиугольником, но все соседства при этом останутся те же). Как это реализовать через индексы, думаю, из такой картинки вам сразу станет понятно.
Если в квадратичной матрице сдвинуть каждую, скажем, чётную строку на пол-ячейки влево, то получится хексагональная матрица (для полноты картины нужно ещё каждый квадрат-ячейку заменить шестиугольником, но все соседства при этом останутся те же). Как это реализовать через индексы, думаю, из такой картинки вам сразу станет понятно.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
t.t, наверное так и сделаю, спасибо за совет. Правильно ли я понял, что нужно просто в обычном массиве переопределить "соседей" ?
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
flook
- Сообщения: 585
- Статус: Просто flook
Re: Гексагональная матрица
Шикарно!
В каждом из нас спит гений... и с каждым днем все крепче...
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
Ну да. Можно к примеру макрос написать, который будет определять по индексам, являются ли элементы соседями. Если на бумаге это нарисовать -- сразу станет понятно, какая именно там чехарда с индексами; мне рисовать лень, а в уме я всегда с такой фигнёй путаюсь.t.t, наверное так и сделаю, спасибо за совет. Правильно ли я понял, что нужно просто в обычном массиве переопределить "соседей" ?
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
Asgard
- Сообщения: 215
- Статус: North Valfader
Re: Гексагональная матрица
Можно ещё создать массив связных списков. Имхо, это проще для понимания...
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
То есть типа
----------------------------
Node:
link_to_neighbour1
link_to_neighbour2
link_to_neighbour3
link_to_neighbour4
link_to_neighbour5
link_to_neighbour6
cargo
----------------------------
Насоздавать таких штук и перелинковать их, так что ли?
----------------------------
Node:
link_to_neighbour1
link_to_neighbour2
link_to_neighbour3
link_to_neighbour4
link_to_neighbour5
link_to_neighbour6
cargo
----------------------------
Насоздавать таких штук и перелинковать их, так что ли?
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
Честно говоря, не вижу, чем сложен для понимания вариант со сдвигом строк, тем паче, что обёртки над ним можно написать какие душе угодно. А вот во сколько раз массив элементов будет жрать меньше памяти, чем массив связных списков из тех же элементов? При больших размерах массива это может оказаться критично.Можно ещё создать массив связных списков. Имхо, это проще для понимания...
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
Насколько я понял, возможны два варианта сдвига:
Такой: (как описывал t.t)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]
[indent][(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
[(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
[indent][(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
[(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5)]
[indent][(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
И такой:
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]
[indent][(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
[indent][indent][(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
[indent][indent][indent][(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
[indent][indent][indent][indent][(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5)]
[indent][indent][indent][indent][indent][(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
Интересно, какой предпочтительнее?
Такой: (как описывал t.t)
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]
[indent][(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
[(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
[indent][(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
[(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5)]
[indent][(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
И такой:
[(0, 0), (0, 1), (0, 2), (0, 3), (0, 4), (0, 5)]
[indent][(1, 0), (1, 1), (1, 2), (1, 3), (1, 4), (1, 5)]
[indent][indent][(2, 0), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5)]
[indent][indent][indent][(3, 0), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5)]
[indent][indent][indent][indent][(4, 0), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5)]
[indent][indent][indent][indent][indent][(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)]
Интересно, какой предпочтительнее?
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
Предпочтительнее для чего? Просто эти два варианта задают два участка решётки разной формы: первый -- похожий на прямоугольник, второй -- похожий на ромб. Больше никакой разницы между ними нет; а как отразится именно эта разница -- зависит от задачи.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
Ну, просто во втором случае индексы соседей не зависят от четности строки, так что оперировать ими вроде бы должно быть проще?
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
Проще. Но экономия от +i%2 столь незначительна, что её можно и не учитывать.
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
Для машины --- да 
Но вот во втором варианте у граничных элементов по 2 "пустых соседа", а в первом --- вдоль строк по три, а вдоль столбцов --- по два. Наверное, по этому признаку мне больше подойдет "ромбик" --- он симметричнее.
Но вот во втором варианте у граничных элементов по 2 "пустых соседа", а в первом --- вдоль строк по три, а вдоль столбцов --- по два. Наверное, по этому признаку мне больше подойдет "ромбик" --- он симметричнее.
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика
-
t.t
- Бывший модератор
- Сообщения: 7390
- Статус: думающий о вечном
- ОС: Debian, LMDE
Re: Гексагональная матрица
Наверное, "прямоугольник" чаще встречается просто из-за естественной тяги детей индустриальной цивилизации ко всему квадратному 
¡иɯʎdʞ ин ʞɐʞ 'ɐнɔɐdʞǝdu qнεиж
-
brazhe
- Сообщения: 89
Re: Гексагональная матрица
Наверное
Если бы я писал игру с гексагон. картой, то выбрал бы прямоугольный вариант, а так -- мне оно без разницы. А вот бонус в симметрии мне полезней, наверное.
Если бы я писал игру с гексагон. картой, то выбрал бы прямоугольный вариант, а так -- мне оно без разницы. А вот бонус в симметрии мне полезней, наверное.
Ni Ansa
My LJ: Журнал мечтательного биофизика
My LJ: Журнал мечтательного биофизика