Итак, я делаю эту 2D-Java-игру сверху вниз в этой среде под названием Greenfoot, и я работаю над ИИ для парней, с которыми вы собираетесь сражаться. Я хочу, чтобы они могли реально перемещаться по всему миру, поэтому вскоре я понял, что, помимо всего прочего, мне понадобится поиск пути.
Я сделал два прототипа А *. Один из них основан на сетке, а затем я создал тот, который работает с путевыми точками, поэтому теперь мне нужно найти способ перейти от двумерной «карты» препятствий / зданий к графу узлов, из которых я могу проложить путь. Фактическое нахождение пути выглядит хорошо, только мои открытые и закрытые списки могут использовать более эффективную структуру данных, но я доберусь до этого, если и когда мне понадобится.
Я намерен использовать навигационную сетку по всем причинам, изложенным в этом посте на ai-blog.net . Однако проблема, с которой я столкнулся, заключается в том, что то, что A * считает самым коротким путем от центров / ребер многоугольника, не обязательно является самым коротким путем, если вы проходите через любую часть узла. Чтобы получить лучшее представление, вы можете увидеть вопрос, который я задал на stackoverflow .
Я получил хороший ответ относительно графика видимости. С тех пор я приобрел книгу ( Вычислительная геометрия: алгоритмы и приложения ) и углубился в эту тему, однако все еще поддерживаю навигационную сетку (см. « Управление сложностью » из заметок Амит о поиске пути ). (В качестве примечания, возможно, я мог бы использовать Theta * для преобразования нескольких путевых точек в одну прямую линию, если первая и последняя не закрыты. Или каждый раз, когда я возвращаюсь назад, проверяю путевую точку до последней, чтобы увидеть, могу ли я идти прямо из что к этому)
Поэтому в основном я хочу навигационную сетку, где, как только я проведу ее с помощью алгоритма воронки (например, от Digesting Duck ), я получу истинный кратчайший путь, а не тот, который является кратчайшим путем, следующим только от узла к узлу, но не самый короткий, учитывая, что вы можете пройти через несколько полигонов и пропустить узлы / ребра.
Да, и я также хочу знать, как вы предлагаете хранить информацию о полигонах. Для примера прототипа путевой точки, который я сделал, я просто использовал каждый узел в качестве объекта и сохранял список всех других узлов, на которые вы могли бы перейти с этого узла, я полагаю, что это не будет работать с полигонами? и как я могу сказать, если многоугольник открыт / проходим или это твердый объект? Как мне сохранить, какие узлы составляют многоугольник?
И наконец, для записи: я хочу запрограммировать это самостоятельно с нуля, хотя уже есть другие доступные решения, и я не собираюсь (повторно) использовать этот код ни в чем, кроме этой игры, поэтому не имеет значения, что это неизбежно будет низкого качества.