Нужна помощь в модификации алгоритма поиска пути
Я делаю бота, который умеет обегать динамично появляющиеся преграды. В параллельных потоках должны выполнятся алгоритм поиска пути и следование по нему. Беда в асинхронной работе двух потоков. На поиск пути затрачивается время и по истечению которого после 1-го обновления маршрута получается так, что персонаж следует по старому пути, а после его замены разворачивается на 360 т.к. алгоритм поиска пути отталкивается от координат бота в определённое время и за время пока алгоритм рассчитывает путь бот успевает пробежать некоторое расстояние по старому маршруту.
главный поток:
main_thread = lua_thread.create_suspended(function()
while true do
if cyclogramm == 1 then
targetPoint = endPoint
pathFinder_thread:run()
repeat wait(0) until pathUpdate
::mark::
pathUpdate = false
if #path > 0 then
for i, v in pairs(path) do
if pathUpdate then goto mark end
go_to_point(v, true)
end
pathFinder_thread:terminate()
break
else
wait(0)
goto mark
end
end
wait(0)
end
reset()
end)
поток с алгоритмом:
pathFinder_thread = lua_thread.create_suspended(function()
while true do
local mx, my, mz = getCharCoordinates(playerPed)
local activePoint = {math.floor(mx), math.floor(my)}
local open_list = {}
local closed_list = {}
local _path = {}
while true do
wait(0)
for i, v in pairs(map[activePoint[1]][activePoint[2]]) do
if check_table(v, closed_list) and isLineOfSightClear(activePoint[1], activePoint[2], mz, v[1], v[2], mz, true, true, true, true, false) then
local weight = get_dist1(v, targetPoint) + get_dist2({mx, my}, v)
table.insert(open_list, {v, weight})
end
end
if #open_list > 0 then
table.insert(closed_list, activePoint)
activePoint = get_nearest_point(open_list)
table.insert(_path, activePoint)
open_list = {}
if activePoint[1] == targetPoint[1] and activePoint[2] == targetPoint[2] then
break
end
end
end
path = _path
pathUpdate = true
wait(2000)
end
end)
Ответы (1 шт):
Пусть построенный путь это ломанная линия в пространстве.
После того как путь найден, нужно найти точку, которая на пути соответствует положению текущему.
Десяти первых частей должно быть достаточно. Соответственно взять расстояние до первых десяти отрезков, где меньшее там и есть точка старта нового пути.