roadNaturalContinuation
Definition
-- @/lua/vehicle/ai.lua:1280
-- Calculate the edge incident on wp2 which is most similar to the edge wp1->wp2
local function roadNaturalContinuation(wp1, wp2)
local inLaneConfig = getEdgeLaneConfig(wp1, wp2)
local inRadiuswp2, inRadiuswp1 = mapData:getEdgeRadii(wp2, wp1)
local inEdgeDir = vec3(); inEdgeDir:setSub2(mapData:getEdgePositions(wp2, wp1)); inEdgeDir:normalize()
local laneFlow = mapData.graph[wp1][wp2].drivability * 4 * min(inRadiuswp2, inRadiuswp1) / #inLaneConfig
local inLaneCount = numOfLanesInDirection(inLaneConfig, '+')
local inFwdFlow = inLaneCount * laneFlow
local inLaneCountOpposite = (#inLaneConfig - inLaneCount)
local inBackFlow = inLaneCountOpposite * laneFlow
local outEdgeDir, maxOutflow, minNode = vec3(), 0, nil
for k, v in pairs(mapData.graph[wp2]) do
if k ~= wp1 then
local outLaneConfig = getEdgeLaneConfig(wp2, k)
local numOfOutLanes = numOfLanesInDirection(outLaneConfig, '+')
outEdgeDir:setSub2(mapData:getEdgePositions(k, wp2)); outEdgeDir:normalize()
local dirCoef = 0.5 * max(0, 1 + outEdgeDir:dot(inEdgeDir))
local outLaneCountOpposite = (#outLaneConfig - numOfOutLanes)
local outRadiuswp2, outRadiusk = mapData:getEdgeRadii(wp2, k)
if numOfOutLanes == inLaneCount and outLaneCountOpposite == inLaneCountOpposite then
laneFlow = mapData.graph[wp2][k].drivability * 4 * 0.5 * (inRadiuswp2 + outRadiuswp2) / #outLaneConfig
else
laneFlow = mapData.graph[wp2][k].drivability * 4 * min(outRadiuswp2, outRadiusk)/ #outLaneConfig
end
local outFwdFlow = min(inFwdFlow, numOfOutLanes * laneFlow)
local outBackFlow = min(inBackFlow, outLaneCountOpposite * laneFlow)
local outflow = outFwdFlow * (1 + outBackFlow) * dirCoef
if outflow > maxOutflow then
maxOutflow = outflow
minNode = k
end
end
end
return minNode
end
Callers
@/lua/vehicle/ai.lua
if numOfLanesInDirection(getEdgeLaneConfig(wp1, wp2), '+') > 1 then
local minNode = roadNaturalContinuation(wp1, wp2)
local wp3 = route.path[route.lastLaneChangeIdx+1]
local side = mapmgr.rules.rightHandDrive and -1 or 1
local nContinuation = fourthNode and roadNaturalContinuation(fourthNode, nid1)
local dotDir = side*gravityDir:cross(nDir):dot(linkDir)
if tableSize(mapData.graph[wp2]) > 2 then
local minNode = roadNaturalContinuation(wp1, wp2)
if minNode and minNode ~= currentRoute.path[i+2] then