понедельник, 9 января 2012 г.

Гексагональное разбиение

Великий геометрический смысл
     
      Представим себе два одинаковых круга. Круг номер 1 прочно закреплен в точке пространства, а круг номер 2 ограничен лишь тем, что прикасается кругу номер 1. Другими словами круг 2 свободен кататься по поверхности круга 1 (Рис. 1).

Рис. 1 круг 2 катается по поверхности круга 2

     Сколько же кругов может одновременно кататься по поверхности одного базового круга не пересекаясь друг с другом? Мы не будем формально решать данную задачу, а просто увидим из рисунка 2, что таких кругов может быть шесть, не больше и не меньше.


Рис. 2 Шесть кругов, касающихся седьмого и не пересекающихся друг с другом.

     Удивителен тот факт, что 6 кругов помещаются вплотную друг к другу без зазоров. Т.е. ни один шар не может сдвинуться с места, пока остальные зафиксированы. Иначе обстоят дела в трёхмерном пространстве: максимум 12 шаров могут одновременно соприкасаться с одним тринадцатым, но между ними будут оставаться небольшие зазоры, и по крайней мере некоторые шары будут иметь небольшую свободу для движения.
     Возможно такое свойство пространства позволяет молекулам постоянно находиться в тепловом движении и не заклинивать. Движение продолжается пока мы в трехмерном пространстве, вероятно только в такой геометрии оно и возможно наилучшим образом. Об этом мне рассказал однажды преподаватель теории вероятности. И я согласен с его выводом: мудрость творца впечатляет.

Рис. 3 Гексагональное разбиение (если кто не знает как оно выглядит)

     Вернемся к нашим баранам. Как вы могли заметить на рис. 2 прикасающиеся круги находятся в углах правильного шестиугольника который мы обсуждаем.  Шестиугольники хороши тем, что ими можно замостить плоскость, так же как квадратами и треугольниками. Ни 5тиугольниками ни 7миугольниками ни 8миугольниками плоскость не замостить - так уж устроена наша геометрия (Это не значит, что ими совсем ничего нельзя замостить. Например, додекаэдр - способ мощения сферы 5тиугольниками). Многие периодичные структуры в природе также имеют в основе правильный шестиугольник. Так, например, снежинки всегда имеют симметрию шестиугольника, т.е. 6 основных лучей. И вообще шестиугольник является лучшим выбором из возможных во многих смыслах, в данной статье я постараюсь обосновать свою точку зрения и заразить вас гексоманией. 

Проклятие "корень из двух"

     Рассмотрим случай когда мы разбили поле на квадратные тайлы, и в одном из тайлов находится игровой персонаж. Встает вопрос, какие клетки считать непосредственно соседними по отношению к персонажу. На рис. 4а  и 4б изображены два варианта. Весь вопрос состоит в том включать ли сюда "диагональные" клетки. Они не являются смежными в полном смысле слова, но являются соседними. Позволить ли персонажу непосредственно перемещаться в диагональные клетки или нет? Позволить ли персонажу выполнять атаку в этих направлениях?

Рис. 4 Соседние тайлы

     Если мы позволяем персонажу перемещаться в диагональные тайлы, тогда нужно понимать, что цена таких перемещений несколько больше чем при перемещении в смежные тайлы, а точнее больше в корень из двух раз. Корень из двух иррациональное число, и это постоянно портит жизнь, когда мы пытаемся написать алгоритм поиска пути. Даже если мы решим сделать шаг по диагонали равноценным шагу в смежный тайл, что бывает в некоторых играх, алгоритм поиска пути всё равно должен учитывать корень из двух, чтобы путь получался не только кратчайшим фактически, но и эстетически.
     В настольной игре вообще невозможно учесть корень из двух. Правильно ли оставлять диагональные шаги равными смежным? Нет, иначе персонаж бегущий по прямой и персонаж бегущий зигзагом пробегут дистанцию за равное время, что совсем не соответствует законам реального мира и нарушает эстетичность игры. Иными словами для настольной игры правильнее будет оставить только смежные шаги. Если оставить только смежные шаги в видео игре, это избавило бы нас от многих проблем. Однако отказ от диагональных шагов также лишает нашу игру доли эстетичности (я часто применяю слово эстетичность, и наверное в неправильном смысле, но надеюсь вы меня поймете).
     Чем же хорошо гексагональное разбиение? из рис. 4в видно что все соседние тайлы - есть смежные тайлы т.е. все шаги в соседние тайлы равноценны.

Диагональные шаги на гексогональном поле

     Да, в случае гексагонального разбиения все соседние тайлы являются смежными, но это не значит что нет диагональных тайлов. Диагональными тайлами я называю ближайшие тайлы, находящиеся в направлениях между направлениями, в которых находятся смежные тайлы. Соседними я называю тайлы которые имеют хотя бы одну общую точку с данным тайлом. Рассмотрите внимательно рис. 5 чтобы понять различие между моими определениями соседних, смежных и диагональных тайлов.

Рис. 5 Тайлы: соседние - крестик, смежные - красный, диагональные - розовый.

     На рис. 5б можно видеть, что в случае гексагонального разбиения мы имеем помимо 6 смежных тайлов 6 диагональных. Эти диагональные гексагональные тайлы интересны тем что цена шага до них относится к цене в смежный тайл как 3/2, - а это очень хорошее число.  Если мы положим смежный шаг равный 2 то диагональный будет равен 3, так мы имеем 12 направлений вместо 6ти.

Протиснуться сквозь щель. Стена и дерево.

     Иногда на игровой карте появляется щель, т.е. такая ситуация когда два смежных тайла заблокированы стеной однако остаётся свободным диагональный тайл соответствующий этим смежным (Рис. 6). Перед разработчиком стоит вопрос: а позволить ли персонажу делать шаг через такие щели или запретить? 


Рис. 6 Шаг сквозь щель стен

     Для квадратного разбиения это сложный вопрос, т.к. он опять же касается эстетики игры. Более того, даже если запретить шаг сквозь щель, сам факт наличие таких щелей на игровой карте уже нарушает эстетичность. В случае гексагонального разбиения же (рис. 6б) всё предельно ясно: такой шаг невозможен, и никаких проблем с эстетичностью.


Рис. 7 Шаг сквозь щель деревьев

     В дополнение к данной теме я предлагаю рассмотреть две категории непроходимых тайлов, которые я условно называю "стена" и "дерево". На рис. 6 мы рассмотрели тип стена, тип дерево это стена которая позволяет проход сквозь щель (Рис. 7). Это логично ведь дерево - блокирующий тайл и на него вставать нельзя, но между двух деревьев пройти можно. Другими словами мы запрещаем шаг изображенный на рис. 6б, но разрешаем шаг как на рис. 7. Такое различие на мой взгляд увеличит эстетичность игры.

Дверной проём

     Напоследок скажу немного о тактических особенностях которые я заметил играя в "Наёмники из Краслина". Представим ситуацию когда игрок управляет персонажем, за которым гонится толпа неприятелей. Игрок решает держать оборону в узком месте где его не смогли бы окружить. Оборонять проём можно двумя способами: Непосредственно встать в проём (Рис.8а,в) и встать сразу за проёмом (Рис. 8б,г).

Рис. 8 Оборона дверного проёма. Чёрные стрелки - возможные атаки врага, синие стрелки - возможные манёвры врага.

     Рассмотрим ситуацию на рис. 8а. Одного юнита атакуют сразу трое - т.е. значительный численный перевес на стороне атакующих. Можно запретить атаковать по диагонали, тогда и будет простая битва 1 на 1.
     В ситуации рис. 8б можно сражаться 1 на 1, однако у врага есть аж двойная возможность окружать. Игрок может полностью заблокировать проём тремя юнитами. Хотя конечно можно просто запретить обходить таким образом.
     В ситуации на рис. 8в. мы имеем битву 1 на 2.  
     В ситуации на рис. 8г. битва 1 на 1 и возможность для маневра. Можно заблокировать проход полностью будь у игрока 2 юнита.
     Итог: Квадратное разбиение дает просто битву в проёме 1 на 1.  Чем это плохо? Вы можете встать одним суперсильным юнитом в проходе и по одному вырубать юнитов оппонента (я говорю не о супергеройской РПГ, а о тактическом симуляторе). Если разрешить диагональные действия дверной проём становиться "слишком широким"  - т.е. это уже не узкое место, в котором можно оборонятся 1 юнитом. 
     Гексагональное разбиение предоставляет реальный тактический простор: Вы можете обороняться в проходе одним юнитом против двух, либо двумя против одного, либо одним против одного, но с риском быть окруженным. Разброс между плюсами и минусами не так велик как в квадратном разбиении. Почувствовали ли вы тактическое преимущество гексагонального разбиения так же как и я? 


6 комментариев:

  1. В The Battle for Wesnoth, Fallout 1,2 используется гексагональное представление поля. И для тактической пошаговой игры это очень удобно. Правда вот в цивилизация кажется до последнего использовали квадратное поле, хотя я могу ошибаться и оно появилось раньше.

    В рогаликах кстати в зазоры между стенами по диагонали ходить можно как правило.

    Для меня лично большим достоинством квадратной сетки является то что это легко можно представить в виде двумерного массива. гексагональная карта будет представлена более сложной структурой данных.

    ОтветитьУдалить
  2. Отчего же более сложной?
    Гексагональную карту можно представить двумерным массивом. Наверное напишу об этом позже.

    ОтветитьУдалить
  3. Уж не знаю как у Вас получилось отношение расстояний между центрами "смежнымых" и "диагональных" гексов равным 2/3. К сожалению, от корня ни куда не деться =(

    ОтветитьУдалить
  4. Довольно хорошая статья. Информация о кругах и 2Д/3Д пространстве - новая для меня. Класс!

    ОтветитьУдалить