mirror of
https://github.com/FlightControl-Master/MOOSE.git
synced 2025-10-29 16:58:06 +00:00
xxx
This commit is contained in:
parent
9df6467cd1
commit
7dec189358
@ -3641,7 +3641,7 @@ do -- ZONE_ELASTIC
|
|||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
--- Create a convec hull.
|
--- Create a convex hull.
|
||||||
-- @param #ZONE_ELASTIC self
|
-- @param #ZONE_ELASTIC self
|
||||||
-- @param #table pl Points
|
-- @param #table pl Points
|
||||||
-- @return #table Points
|
-- @return #table Points
|
||||||
|
|||||||
@ -181,7 +181,7 @@ STRATEGO = {
|
|||||||
debug = false,
|
debug = false,
|
||||||
drawzone = false,
|
drawzone = false,
|
||||||
markzone = false,
|
markzone = false,
|
||||||
version = "0.2.11",
|
version = "0.3.1",
|
||||||
portweight = 3,
|
portweight = 3,
|
||||||
POIweight = 1,
|
POIweight = 1,
|
||||||
maxrunways = 3,
|
maxrunways = 3,
|
||||||
@ -803,9 +803,13 @@ end
|
|||||||
-- @param #number Coalition (Optional) Find for this coalition only. E.g. coalition.side.BLUE.
|
-- @param #number Coalition (Optional) Find for this coalition only. E.g. coalition.side.BLUE.
|
||||||
-- @return #table Table of nodes.
|
-- @return #table Table of nodes.
|
||||||
-- @return #number Weight The consolidated weight associated with the nodes.
|
-- @return #number Weight The consolidated weight associated with the nodes.
|
||||||
|
-- @return #number Highest Highest weight found.
|
||||||
|
-- @return #string Name of the node with the highest weight.
|
||||||
function STRATEGO:GetHighestWeightNodes(Coalition)
|
function STRATEGO:GetHighestWeightNodes(Coalition)
|
||||||
self:T(self.lid.."GetHighestWeightNodes")
|
self:T(self.lid.."GetHighestWeightNodes")
|
||||||
local weight = 0
|
local weight = 0
|
||||||
|
local highest = 0
|
||||||
|
local highname = nil
|
||||||
local airbases = {}
|
local airbases = {}
|
||||||
for _name,_data in pairs(self.airbasetable) do
|
for _name,_data in pairs(self.airbasetable) do
|
||||||
local okay = true
|
local okay = true
|
||||||
@ -819,8 +823,12 @@ function STRATEGO:GetHighestWeightNodes(Coalition)
|
|||||||
if not airbases[weight] then airbases[weight]={} end
|
if not airbases[weight] then airbases[weight]={} end
|
||||||
table.insert(airbases[weight],_name)
|
table.insert(airbases[weight],_name)
|
||||||
end
|
end
|
||||||
|
if _data.weight > highest and okay then
|
||||||
|
highest = _data.weight
|
||||||
|
highname = _name
|
||||||
end
|
end
|
||||||
return airbases[weight],weight
|
end
|
||||||
|
return airbases[weight],weight,highest,highname
|
||||||
end
|
end
|
||||||
|
|
||||||
--- [USER] Get a list of the nodes a weight less than the given parameter.
|
--- [USER] Get a list of the nodes a weight less than the given parameter.
|
||||||
@ -1497,6 +1505,139 @@ function STRATEGO:FindAffordableConsolidationTarget()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
--- [INTERNAL] Internal helper function to check for islands, aka Floodtest
|
||||||
|
-- @param #STRATEGO self
|
||||||
|
-- @param #string next Name of the start node
|
||||||
|
-- @param #table filled #table of visited nodes
|
||||||
|
-- @param #table unfilled #table if unvisited nodes
|
||||||
|
-- @return #STRATEGO self
|
||||||
|
function STRATEGO:_FloodNext(next,filled,unfilled)
|
||||||
|
local start = self:FindNeighborNodes(next)
|
||||||
|
for _name,_ in pairs (start) do
|
||||||
|
if filled[_name] ~= true then
|
||||||
|
self:T("Flooding ".._name)
|
||||||
|
filled[_name] = true
|
||||||
|
unfilled[_name] = nil
|
||||||
|
self:_FloodNext(_name,filled,unfilled)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return self
|
||||||
|
end
|
||||||
|
|
||||||
|
--- [INTERNAL] Internal helper function to check for islands, aka Floodtest
|
||||||
|
-- @param #STRATEGO self
|
||||||
|
-- @param #string Start Name of the start node
|
||||||
|
-- @param #table ABTable (Optional) #table of node names to check.
|
||||||
|
-- @return #STRATEGO self
|
||||||
|
function STRATEGO:_FloodFill(Start,ABTable)
|
||||||
|
self:T("Start = "..tostring(Start))
|
||||||
|
if Start == nil then return end
|
||||||
|
local filled = {}
|
||||||
|
local unfilled = {}
|
||||||
|
if ABTable then
|
||||||
|
unfilled = ABTable
|
||||||
|
else
|
||||||
|
for _name,_ in pairs(self.airbasetable) do
|
||||||
|
unfilled[_name] = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
filled[Start] = true
|
||||||
|
unfilled[Start] = nil
|
||||||
|
local start = self:FindNeighborNodes(Start)
|
||||||
|
for _name,_ in pairs (start) do
|
||||||
|
if filled[_name] ~= true then
|
||||||
|
self:T("Flooding ".._name)
|
||||||
|
filled[_name] = true
|
||||||
|
unfilled[_name] = nil
|
||||||
|
self:_FloodNext(_name,filled,unfilled)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return filled, unfilled
|
||||||
|
end
|
||||||
|
|
||||||
|
--- [INTERNAL] Internal helper function to check for islands, aka Floodtest
|
||||||
|
-- @param #STRATEGO self
|
||||||
|
-- @param #boolen connect If true, connect the two resulting islands at the shortest distance if necessary
|
||||||
|
-- @param #boolen draw If true, draw outer vertices of found node networks
|
||||||
|
-- @return #boolean Connected If true, all nodes are in one network
|
||||||
|
-- @return #table Network #table of node names in the network
|
||||||
|
-- @return #table Unconnected #table of node names **not** in the network
|
||||||
|
function STRATEGO:_FloodTest(connect,draw)
|
||||||
|
|
||||||
|
local function GetElastic(bases)
|
||||||
|
local vec2table = {}
|
||||||
|
for _name,_ in pairs(bases) do
|
||||||
|
local coord = self.airbasetable[_name].coord
|
||||||
|
local vec2 = coord:GetVec2()
|
||||||
|
table.insert(vec2table,vec2)
|
||||||
|
end
|
||||||
|
local zone = ZONE_ELASTIC:New("STRATEGO-Floodtest-"..math.random(1,10000),vec2table)
|
||||||
|
return zone
|
||||||
|
end
|
||||||
|
|
||||||
|
local function DrawElastic(filled,drawit)
|
||||||
|
local zone = GetElastic(filled)
|
||||||
|
if drawit then
|
||||||
|
zone:SetColor({1,1,1},1)
|
||||||
|
zone:SetDrawCoalition(-1)
|
||||||
|
zone:Update(1,true) -- draw zone
|
||||||
|
end
|
||||||
|
return zone
|
||||||
|
end
|
||||||
|
|
||||||
|
local _,_,weight,name = self:GetHighestWeightNodes()
|
||||||
|
local filled, unfilled = self:_FloodFill(name)
|
||||||
|
local allin = true
|
||||||
|
if table.length(unfilled) > 0 then
|
||||||
|
MESSAGE:New("There is at least one node island!",15,"STRATEGO"):ToAllIf(self.debug):ToLog()
|
||||||
|
allin = false
|
||||||
|
if self.debug == true then
|
||||||
|
local zone1 = DrawElastic(filled,draw)
|
||||||
|
local zone2 = DrawElastic(unfilled,draw)
|
||||||
|
local vertices1 = zone1:GetVerticiesVec2()
|
||||||
|
local vertices2 = zone2:GetVerticiesVec2()
|
||||||
|
-- get closest vertices
|
||||||
|
local corner1 = nil
|
||||||
|
local corner2 = nil
|
||||||
|
local mindist = math.huge
|
||||||
|
local found = false
|
||||||
|
for _,_edge in pairs(vertices1) do
|
||||||
|
for _,_edge2 in pairs(vertices2) do
|
||||||
|
local dist=UTILS.VecDist2D(_edge,_edge2)
|
||||||
|
if dist < mindist then
|
||||||
|
mindist = dist
|
||||||
|
corner1 = _edge
|
||||||
|
corner2 = _edge2
|
||||||
|
found = true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if found then
|
||||||
|
local Corner = COORDINATE:NewFromVec2(corner1)
|
||||||
|
local Corner2 = COORDINATE:NewFromVec2(corner2)
|
||||||
|
Corner:LineToAll(Corner2,-1,{1,1,1},1,1,true,"Island2Island")
|
||||||
|
local cornername
|
||||||
|
local cornername2
|
||||||
|
for _name,_data in pairs(self.airbasetable) do
|
||||||
|
local zone = _data.zone
|
||||||
|
if zone:IsVec2InZone(corner1) then
|
||||||
|
cornername = _name
|
||||||
|
self:T("Corner1 = ".._name)
|
||||||
|
end
|
||||||
|
if zone:IsVec2InZone(corner2) then
|
||||||
|
cornername2 = _name
|
||||||
|
self:T("Corner2 = ".._name)
|
||||||
|
end
|
||||||
|
if cornername and cornername2 and connect == true then
|
||||||
|
self:AddRoutesManually(cornername,cornername2,Color,Linetype,self.debug)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return allin, filled, unfilled
|
||||||
|
end
|
||||||
|
|
||||||
---------------------------------------------------------------------------------------------------------------
|
---------------------------------------------------------------------------------------------------------------
|
||||||
--
|
--
|
||||||
-- End
|
-- End
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user