Как препятствовать смене направления с AStar - PullRequest
0 голосов
/ 19 февраля 2019

Могу ли я заставить встроенный AStar выбрать кратчайший путь с наименьшим изменением направления ?

В настоящее время я строю свой график следующим образом:

extends GridMap

var _astar = AStar.new()

func _ready():
    var id = 0
    for c in get_used_cells():
        var weight = 1.0
        if _get_cover(c.x, c.y, c.z):
            weight = 9999.0 # impassable tile
        _astar.add_point(id, Vector3(c.x, c.y, c.z), weight)
        id += 1

    for c in get_used_cells():
        var center = _astar.get_closest_point(Vector3(c.x, c.y, c.z))
        var above = _astar.get_closest_point(Vector3(c.x, c.y, c.z + 1))
        var right = _astar.get_closest_point(Vector3(c.x + 1, c.y, c.z))
        assert(id > 0)
        if above >= 0:
            _astar.connect_points(center, above, true)
        if right >= 0:
            _astar.connect_points(center, right, true)

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

jagged path

1 Ответ

0 голосов
/ 20 февраля 2019

Когда вы видите 3 узла, если направление изменяется, то увеличивает значение F последнего узла .

Три узла сообщат вам, что направление изменилось.

...