Я написал реализацию алгоритма поиска A *. Проблема в том, что эвристика, которую я сейчас использую, точно работает только с квадратными сетками. Поскольку моя карта изометрическая, эвристика не принимает во внимание фактическое расположение карты и, следовательно, расстояние между ячейками.
Обновление: после тщательного протоколирования и анализа (читаемого как потратить много времени на выяснение банальности) я пришел к выводу, что моя текущая эвристика работает достаточно хорошо, с одним небольшим исключением: конечный результат меняется на противоположный для реального прямого и диагонального движения.
inline int Pathfinder::calculateDistanceEstimate(const CellCoord& coord) const
{
int diagonal = std::min(abs(coord.x-goal->position.x), abs(coord.y-goal->position.y));
int straight = (abs(coord.x-goal->position.x) + abs(coord.y-goal->position.y));
return 14 * diagonal + 10 * (straight - 2 * diagonal);
}
Это означает, что прямое движение, которое действительно стоит в sqrt(2)
раз больше, чем диагональное движение на изометрической карте, рассчитывается как движение по диагонали. Возникает вопрос: как изменить текущую эвристику, чтобы она давала правильные результаты для изометрической компоновки? Простая замена diagonal
на straight
и наоборот не работает.