AStarGrid2D
Наследует: RefCounted < Object
Реализация A* для поиска кратчайшего пути между двумя точками на частичной двумерной сетке.
Описание
AStarGrid2D — это вариант AStar2D, который специализирован для частичных 2D-сеток. Он проще в использовании, поскольку не требует ручного создания точек и их соединения. Этот класс также поддерживает несколько типов эвристик, режимы для диагонального перемещения и режим прыжка для ускорения вычислений.
Чтобы использовать AStarGrid2D, вам нужно только задать region сетки, опционально задать cell_size, а затем вызвать метод update():
var astar_grid = AStarGrid2D.new()
astar_grid.region = Rect2i(0, 0, 32, 32)
astar_grid.cell_size = Vector2(16, 16)
astar_grid.update()
print(astar_grid.get_id_path(Vector2i(0, 0), Vector2i(3, 4))) # Prints [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)]
print(astar_grid.get_point_path(Vector2i(0, 0), Vector2i(3, 4))) # Prints [(0, 0), (16, 16), (32, 32), (48, 48), (48, 64)]
AStarGrid2D astarGrid = new AStarGrid2D();
astarGrid.Region = new Rect2I(0, 0, 32, 32);
astarGrid.CellSize = new Vector2I(16, 16);
astarGrid.Update();
GD.Print(astarGrid.GetIdPath(Vector2I.Zero, new Vector2I(3, 4))); // Prints [(0, 0), (1, 1), (2, 2), (3, 3), (3, 4)]
GD.Print(astarGrid.GetPointPath(Vector2I.Zero, new Vector2I(3, 4))); // Prints [(0, 0), (16, 16), (32, 32), (48, 48), (48, 64)]
Чтобы удалить точку из сетки поиска пути, ее необходимо сделать «сплошной» с помощью set_point_solid().
Обучающие материалы
Свойства
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
Методы
_compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const |
|
_estimate_cost(from_id: Vector2i, end_id: Vector2i) virtual const |
|
void |
clear() |
void |
fill_solid_region(region: Rect2i, solid: bool = true) |
void |
fill_weight_scale_region(region: Rect2i, weight_scale: float) |
get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) |
|
get_point_data_in_region(region: Rect2i) const |
|
get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) |
|
get_point_position(id: Vector2i) const |
|
get_point_weight_scale(id: Vector2i) const |
|
is_dirty() const |
|
is_in_bounds(x: int, y: int) const |
|
is_in_boundsv(id: Vector2i) const |
|
is_point_solid(id: Vector2i) const |
|
void |
set_point_solid(id: Vector2i, solid: bool = true) |
void |
set_point_weight_scale(id: Vector2i, weight_scale: float) |
void |
update() |
Перечисления
enum Heuristic: 🔗
Heuristic HEURISTIC_EUCLIDEAN = 0
Евклидова эвристика (Euclidean heuristic), используемая для поиска пути, по следующей формуле:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
result = sqrt(dx * dx + dy * dy)
Примечание: Это также внутренняя эвристика, используемая в AStar3D и AStar2D по умолчанию (с включением возможной координаты оси z).
Heuristic HEURISTIC_MANHATTAN = 1
Manhattan heuristic для использования при поиске пути с использованием следующей формулы:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
result = dx + dy
Примечание: Эта эвристика предназначена для использования с 4-сторонними ортогональными движениями, обеспечиваемыми установкой dialog_mode на DIAGONAL_MODE_NEVER.
Heuristic HEURISTIC_OCTILE = 2
Эвристика Octile, используемая для поиска пути, использует следующую формулу:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
f = sqrt(2) - 1
result = (dx < dy) ? f * dx + dy : f * dy + dx;
Heuristic HEURISTIC_CHEBYSHEV = 3
Chebyshev heuristic для использования при поиске пути с использованием следующей формулы:
dx = abs(to_id.x - from_id.x)
dy = abs(to_id.y - from_id.y)
result = max(dx, dy)
Heuristic HEURISTIC_MAX = 4
Представляет размер перечисления Heuristic.
enum DiagonalMode: 🔗
DiagonalMode DIAGONAL_MODE_ALWAYS = 0
Алгоритм поиска пути будет игнорировать сплошных соседей вокруг целевой ячейки и разрешать проход по диагоналям.
DiagonalMode DIAGONAL_MODE_NEVER = 1
Алгоритм поиска пути будет игнорировать все диагонали, и путь всегда будет ортогональным.
DiagonalMode DIAGONAL_MODE_AT_LEAST_ONE_WALKABLE = 2
Алгоритм поиска пути избегает использования диагоналей, если вокруг соседних ячеек определенного сегмента пути размещено не менее двух препятствий.
DiagonalMode DIAGONAL_MODE_ONLY_IF_NO_OBSTACLES = 3
Алгоритм поиска пути избегает использования диагоналей, если вокруг соседних ячеек определенного сегмента пути размещено какое-либо препятствие.
DiagonalMode DIAGONAL_MODE_MAX = 4
Представляет размер перечисления DiagonalMode.
enum CellShape: 🔗
CellShape CELL_SHAPE_SQUARE = 0
Прямоугольная форма ячеек.
CellShape CELL_SHAPE_ISOMETRIC_RIGHT = 1
Форма ячейки ромба (для изометрического вида). Координаты ячейки, где горизонтальная ось идет вверх-вправо, а вертикальная — вниз-вправо.
CellShape CELL_SHAPE_ISOMETRIC_DOWN = 2
Форма ячейки ромба (для изометрического вида). Координаты ячейки, где горизонтальная ось идет вниз-вправо, а вертикальная — вниз-влево.
CellShape CELL_SHAPE_MAX = 3
Представляет размер перечисления CellShape.
Описания свойств
Форма ячейки. Влияет на то, как позиции размещаются в сетке. Если изменено, необходимо вызвать update() перед поиском следующего пути.
Vector2 cell_size = Vector2(1, 1) 🔗
Размер ячейки точки, который будет применен для расчета результирующей позиции точки, возвращаемой get_point_path(). Если изменено, update() необходимо вызвать перед поиском следующего пути.
Heuristic default_compute_heuristic = 0 🔗
Значение по умолчанию Heuristic, которое будет использоваться для расчета стоимости между двумя точками, если _compute_cost() не был переопределен.
Heuristic default_estimate_heuristic = 0 🔗
Значение по умолчанию Heuristic, которое будет использоваться для расчета стоимости между точкой и конечной точкой, если _estimate_cost() не был переопределен.
DiagonalMode diagonal_mode = 0 🔗
void set_diagonal_mode(value: DiagonalMode)
DiagonalMode get_diagonal_mode()
Конкретный режим DiagonalMode, который заставит путь избегать или принимать указанные диагонали.
bool jumping_enabled = false 🔗
Включает или отключает возможность перехода через промежуточные точки и ускоряет алгоритм поиска.
Примечание: В настоящее время включение отключает учет масштабирования веса при поиске пути.
Vector2 offset = Vector2(0, 0) 🔗
Смещение сетки, которое будет применено для расчета результирующего положения точки, возвращаемого get_point_path(). Если изменено, update() необходимо вызвать перед поиском следующего пути.
Rect2i region = Rect2i(0, 0, 0, 0) 🔗
Область ячеек сетки, доступная для поиска пути. Если изменено, необходимо вызвать update() перед поиском следующего пути.
Vector2i size = Vector2i(0, 0) 🔗
Устарело: Use region instead.
Размер сетки (количество ячеек размером cell_size на каждой оси). Если изменено, необходимо вызвать update() перед поиском следующего пути.
Описания метода
float _compute_cost(from_id: Vector2i, to_id: Vector2i) virtual const 🔗
Вызывается при вычислении стоимости между двумя соединенными точками.
Обратите внимание, что эта функция скрыта по умолчанию в классе AStarGrid2D.
float _estimate_cost(from_id: Vector2i, end_id: Vector2i) virtual const 🔗
Вызывается при оценке стоимости между точкой и конечной точкой пути.
Обратите внимание, что эта функция скрыта по умолчанию в классе AStarGrid2D.
void clear() 🔗
Очищает сетку и устанавливает region на Rect2i(0, 0, 0, 0).
void fill_solid_region(region: Rect2i, solid: bool = true) 🔗
Заполняет указанную region на сетке указанным значением для флага сплошной заливки.
Примечание: Вызов update() не требуется после вызова этой функции.
void fill_weight_scale_region(region: Rect2i, weight_scale: float) 🔗
Заполняет указанную region на сетке указанным значением для весовой шкалы.
Примечание: Вызов update() не требуется после вызова этой функции.
Array[Vector2i] get_id_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗
Возвращает массив с идентификаторами точек, образующих путь, найденный AStar2D между заданными точками. Массив упорядочен от начальной точки до конечной точки пути.
Если параметр from_id point отключен, возвращает пустой массив (даже если from_id == to_id).
Если параметр from_id point не отключен, то нет допустимого пути к цели, и allow_partial_path имеет значение true, возвращает путь к ближайшей к цели точке, до которой можно добраться.
Примечание: Когда allow_partial_path имеет значение true и to_id имеет значение solid, поиск может занять необычно много времени.
Array[Dictionary] get_point_data_in_region(region: Rect2i) const 🔗
Возвращает массив словарей с данными точек (id: Vector2i, position: Vector2, solid: bool, weight_scale: float) в области .
PackedVector2Array get_point_path(from_id: Vector2i, to_id: Vector2i, allow_partial_path: bool = false) 🔗
Возвращает массив точек, находящихся на пути, найденном с помощью AStarGrid2D между заданными точками. Массив упорядочен от начальной точки до конечной точки пути.
Если from_id point отключено, возвращает пустой массив (даже если from_id == to_id).
Если from_id point не отключено, то нет допустимого пути к цели, и allow_partial_path равно true, возвращает путь к точке, ближайшей к цели, до которой можно добраться.
Примечание: Этот метод не является потокобезопасным; его можно использовать только из одного потока одновременно. Рекомендуется использовать Mutex для обеспечения эксклюзивного доступа к одному потоку во избежание состояний гонки.
Кроме того, когда allow_partial_path равно true и to_id равно solid, поиск может занять необычно много времени.
Vector2 get_point_position(id: Vector2i) const 🔗
Возвращает положение точки, связанной с указанным id.
float get_point_weight_scale(id: Vector2i) const 🔗
Возвращает весовую шкалу точки, связанной с указанным id.
Указывает, что параметры сетки были изменены и необходимо вызвать update().
bool is_in_bounds(x: int, y: int) const 🔗
Возвращает true, если x и y являются допустимой координатой сетки (id), т. е. если она находится внутри region. Эквивалентно region.has_point(Vector2i(x, y)).
bool is_in_boundsv(id: Vector2i) const 🔗
Возвращает true, если вектор id является допустимой координатой сетки, т. е. если он находится внутри region. Эквивалентно region.has_point(id).
bool is_point_solid(id: Vector2i) const 🔗
Возвращает true, если точка отключена для поиска пути. По умолчанию все точки включены.
void set_point_solid(id: Vector2i, solid: bool = true) 🔗
Отключает или включает указанную точку для поиска пути. Полезно для создания препятствия. По умолчанию включены все точки.
Примечание: Вызов update() не требуется после вызова этой функции.
void set_point_weight_scale(id: Vector2i, weight_scale: float) 🔗
Устанавливает weight_scale для точки с заданным id. weight_scale умножается на результат _compute_cost() при определении общей стоимости перемещения по сегменту от соседней точки до этой точки.
Примечание: Вызов update() не требуется после вызова этой функции.
void update() 🔗
Обновляет внутреннее состояние сетки в соответствии с параметрами, чтобы подготовить ее к поиску пути. Необходимо вызывать, если параметры, такие как region, cell_size или offset, изменены. is_dirty() вернет true, если это так и это необходимо вызвать.
Примечание: Все данные точек (твердость и шкала веса) будут очищены.