Квадратные или шестигранные сетки лучше для поиска пути?

17

Есть ли существенная разница между использованием квадратной или гексагональной сетки для области поиска алгоритмом поиска пути? Другими словами, лучше квадрат или шестиугольник, и если да, то почему.

Эдвин Эрл Росс
источник
4
Я думаю, вы должны использовать все, что подходит для вашего игрового процесса;)
Эндрю Рассел

Ответы:

19

Основное соображение при принятии решения о том, следует ли использовать квадратные и шестнадцатеричные сетки, не должно заключаться в простоте реализации ИИ - алгоритмы поиска по ширине и по глубине практически одинаковы, независимо от того, какой у вас график.

Скорее, это проблема игрового процесса, которую должны учитывать разработчики игр. Квадратные сетки более доступны для массового рынка (шестигранные доски имеют тенденцию выглядеть «вызывающе»), и в мире элементов управления вверх / вниз / влево / вправо гораздо удобнее перемещаться по квадратам, чем гексам с точки зрения пользовательского интерфейса. Квадратные сетки также имеют тенденцию немного ограничивать движение; предполагая ортогональное движение (а не диагональное), нужно пройти 4 шага, чтобы обойти препятствие площадью в один квадрат, по сравнению с 3 шагами в шестигранной сетке. С точки зрения программирования, гексы также немного легче реализовать, но речь идет не об алгоритмах поиска, а о том, что квадратная сетка равна двумерному массиву, но гекс-сетка на самом деле не отображается на стандартную структуру данных.

Недостатком квадратных сеток является то, что движение никогда не кажется правильным. Движение по диагонали должно брать sqrt (2) очков движения, но на практике это либо 1 движение (что дает ощущение, что ходьба по диагонали быстрая, и редко бывает причина ходить ортогонально), либо 2 движения (что делает движение по диагонали слишком медленным ). С гекс-сетками расстояние перемещения намного более интуитивно понятно, так как оно всегда одинаково от одного гекса до другого, независимо от того, какой путь вы выберете.

Ян Шрайбер
источник
4
+1. Это дизайнерское решение, а не решение AI. Если вы хотите использовать гексагональные сетки, то сетка со смещенными квадратами, например www-cs-students.stanford.edu/~amitp/game-programming/grids/…, может быть менее пугающей для случайных игроков, и она математически эквивалентна шестиугольникам. Кроме того, это удобное представление в памяти.
2
+1 за предложение «Квадратные сетки более доступны для массового рынка (шестнадцатеричные доски имеют тенденцию выглядеть« вызывающе »)»: D
Корнел Киселевич
Эдвин не спрашивает, что лучше в игре на основе сетки. Он спрашивает, что лучше для ИИ использовать квадрат или шестиугольники. Мир и сам игровой процесс не должны ограничиваться только теми узлами, которые ищет ИИ.
AttackingHobo
Я реализовал пошаговые стратегии с шестигранной и квадратной сетками, и нет абсолютно никакой разницы в необходимости определения пути. Я даже переключил одну игру с шестнадцатеричной карты на квадратную карту, и (кроме рендеринга) единственное изменение, которое я должен был сделать, - это метод MapLocation :: GetDistance (), который вычисляет расстояние между двумя секторами. Мне просто пришлось скорректировать вычисления, чтобы иметь дело с небольшим смещением каждой строки. В обоих случаях вы можете использовать одно и то же представление в памяти. Итак, как уже говорили другие, это действительно проблема дизайна.
Майк Штробель
4
Кроме того, гексы могут быть сопоставлены с 2-мерным массивом. Изобразите квадратную сетку, затем сдвиньте каждый четный столбец на полшага вниз. Теперь у вас есть квадратная сетка со смещением, которая изоморфна шестигранной сетке.
Асмор
3

Я ни в коем случае не эксперт ИИ, но разница должна быть незначительной. Квадратные сетки немного быстрее (4 соединения на узел вместо 6), но это не является ограничивающим фактором в алгоритмическом времени выполнения. В зависимости от того, какой алгоритм вы планируете использовать, код может быть немного сложнее для шестнадцатеричной сетки, так как вычислить координаты немного сложнее, и сложнее использовать тот тип ярлыков квадри / октре, которые, я считаю, часто используется в поиске пути.

Но для простого мира, такого как уровень игры с пошаговой стратегией, разница между двумя макетами не должна иметь большого значения; квадратная сетка будет немного проще и быстрее.

Грегори Эйвери-Вейр
источник
5
«Квадратные сетки немного быстрее (4 соединения на узел вместо 6)» - если только вы не можете путешествовать по диагонали, в этом случае это 8 соединений против 6.
Ян Шрайбер
Touche. Вы совершенно правы; конечно, диагональные связи были бы вероятны.
Грегори Эйвери-Вейр
3

Есть одно практическое различие, которое я могу обдумать в отношении планирования пути. Перемещение от центра шестнадцатеричной ячейки до одного из ее соседей всегда на одном и том же расстоянии, тогда как, если вы разрешаете диагональное перемещение, это не верно для квадратов.

Clodéric
источник
0

Это руководство по шестиугольникам удивительно. Часть о поиске пути содержит интерактивный пример и некоторую информацию о том, как адаптировать поиск по квадрату.

Если вы используете основанный на графике поиск путей, такой как алгоритм A * или Дейкстры или Флойд-Варшалл, поиск путей в гекс-сетках не отличается от поиска путей в квадратных сетках.

  • Соседи. Пример кода, который я предоставляю в руководстве по нахождению пути, вызывает graph.neighbors для получения соседей местоположения. Для этого используйте функцию в разделе соседей. Отфильтруйте соседей, которые непроходимы.
  • Эвристический. Пример кода для A * использует эвристическую функцию, которая дает расстояние между двумя местоположениями. Используйте формулу расстояния, масштабированную в соответствии с затратами на перемещение. Например, если ваша стоимость передвижения равна 5 за гекс, умножьте расстояние на 5.
отметка
источник