mirror of
https://github.com/kepler155c/opus
synced 2025-01-03 20:30:28 +00:00
GPS ambiguous position fix
This commit is contained in:
parent
b3efbc7438
commit
c1430f6dac
@ -1,3 +1,5 @@
|
||||
local Util = require('opus.util')
|
||||
|
||||
local GPS = { }
|
||||
|
||||
local device = _G.device
|
||||
@ -89,19 +91,17 @@ end
|
||||
-- end stock gps api
|
||||
|
||||
function GPS.trilaterate(tFixes)
|
||||
local pos1, pos2 = trilaterate(tFixes[1], tFixes[2], tFixes[3])
|
||||
|
||||
local attemps = 0
|
||||
for tFixes in Util.permutation(tFixes) do
|
||||
attemps = attemps + 1
|
||||
local pos1, pos2 = trilaterate(tFixes[4], tFixes[3], tFixes[2])
|
||||
if pos2 then
|
||||
pos1, pos2 = narrow(pos1, pos2, tFixes[4])
|
||||
pos1, pos2 = narrow(pos1, pos2, tFixes[1])
|
||||
end
|
||||
if not pos2 then
|
||||
return pos1, attemps
|
||||
end
|
||||
|
||||
if pos1 and pos2 then
|
||||
print("Ambiguous position")
|
||||
print("Could be "..pos1.x..","..pos1.y..","..pos1.z.." or "..pos2.x..","..pos2.y..","..pos2.z )
|
||||
return
|
||||
end
|
||||
|
||||
return pos1
|
||||
end
|
||||
|
||||
return GPS
|
@ -799,4 +799,25 @@ function Util.getOptions(options, args, ignoreInvalid)
|
||||
return true, Util.size(rawOptions)
|
||||
end
|
||||
|
||||
-- https://www.lua.org/pil/9.3.html
|
||||
function Util.permutation(tbl)
|
||||
local function permgen(a, n)
|
||||
if n == 0 then
|
||||
coroutine.yield(a)
|
||||
else
|
||||
for i=1,n do
|
||||
a[n], a[i] = a[i], a[n]
|
||||
permgen(a, n - 1)
|
||||
a[n], a[i] = a[i], a[n]
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local co = coroutine.create(function() permgen(tbl, #tbl) end)
|
||||
return function()
|
||||
local _, res = coroutine.resume(co)
|
||||
return res
|
||||
end
|
||||
end
|
||||
|
||||
return Util
|
||||
|
Loading…
Reference in New Issue
Block a user