mirror of
https://github.com/kepler155c/opus
synced 2024-12-28 17:40:26 +00:00
67 lines
2.0 KiB
Lua
67 lines
2.0 KiB
Lua
--- The Path class.
|
|
-- The `path` class is a structure which represents a path (ordered set of nodes) from a start location to a goal.
|
|
-- An instance from this class would be a result of a request addressed to `Pathfinder:getPath`.
|
|
--
|
|
-- This module is internally used by the library on purpose.
|
|
-- It should normally not be used explicitely, yet it remains fully accessible.
|
|
--
|
|
|
|
if (...) then
|
|
|
|
local t_remove = table.remove
|
|
|
|
local Path = {}
|
|
Path.__index = Path
|
|
|
|
function Path:new()
|
|
return setmetatable({_nodes = {}}, Path)
|
|
end
|
|
|
|
--- Iterates on each single `node` along a `path`. At each step of iteration,
|
|
-- returns the `node` plus a count value. Aliased as @{Path:nodes}
|
|
-- @usage
|
|
-- for node, count in p:iter() do
|
|
-- ...
|
|
-- end
|
|
function Path:nodes()
|
|
local i = 1
|
|
return function()
|
|
if self._nodes[i] then
|
|
i = i+1
|
|
return self._nodes[i-1],i-1
|
|
end
|
|
end
|
|
end
|
|
|
|
--- `Path` compression modifier. Given a `path`, eliminates useless nodes to return a lighter `path`
|
|
-- consisting of straight moves. Does the opposite of @{Path:fill}
|
|
-- @class function
|
|
-- @treturn path self (the calling `path` itself, can be chained)
|
|
-- @see Path:fill
|
|
-- @usage p:filter()
|
|
function Path:filter()
|
|
local i = 2
|
|
local xi,yi,zi,dx,dy,dz, olddx, olddy, olddz
|
|
xi,yi,zi = self._nodes[i].x, self._nodes[i].y, self._nodes[i].z
|
|
dx, dy,dz = xi - self._nodes[i-1].x, yi-self._nodes[i-1].y, zi-self._nodes[i-1].z
|
|
while true do
|
|
olddx, olddy, olddz = dx, dy, dz
|
|
if self._nodes[i+1] then
|
|
i = i+1
|
|
xi, yi, zi = self._nodes[i].x, self._nodes[i].y, self._nodes[i].z
|
|
dx, dy, dz = xi - self._nodes[i-1].x, yi - self._nodes[i-1].y, zi - self._nodes[i-1].z
|
|
if olddx == dx and olddy == dy and olddz == dz then
|
|
t_remove(self._nodes, i-1)
|
|
i = i - 1
|
|
end
|
|
else break end
|
|
end
|
|
return self
|
|
end
|
|
|
|
return setmetatable(Path,
|
|
{__call = function(_,...)
|
|
return Path:new(...)
|
|
end
|
|
})
|
|
end |