fixes assignment for basic turn types / invalid ramp assignment
This commit is contained in:
parent
e00bda37a5
commit
9e95d1f1fd
@ -99,14 +99,6 @@ std::vector<TurnCandidate> handleRoundabouts(const NodeID from,
|
|||||||
std::vector<TurnCandidate> turn_candidates,
|
std::vector<TurnCandidate> turn_candidates,
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph);
|
const util::NodeBasedDynamicGraph &node_based_graph);
|
||||||
|
|
||||||
// A Basic junction is a junction not requiring special treatment. It cannot contain anything
|
|
||||||
// but streets of lesser priority than trunks and ramps (of any type). No roundabouts or motorway
|
|
||||||
// like types.
|
|
||||||
bool isBasicJunction(const NodeID from,
|
|
||||||
const EdgeID via_edge,
|
|
||||||
const std::vector<TurnCandidate> &turn_candidates,
|
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph);
|
|
||||||
|
|
||||||
// Indicates a Junction containing a motoryway
|
// Indicates a Junction containing a motoryway
|
||||||
bool isMotorwayJunction(const NodeID from,
|
bool isMotorwayJunction(const NodeID from,
|
||||||
const EdgeID via_edge,
|
const EdgeID via_edge,
|
||||||
@ -121,7 +113,8 @@ TurnType findBasicTurnType(const NodeID from,
|
|||||||
|
|
||||||
// Get the Instruction for an obvious turn
|
// Get the Instruction for an obvious turn
|
||||||
// Instruction will be a silent instruction
|
// Instruction will be a silent instruction
|
||||||
TurnInstruction getInstructionForObvious(const NodeID from,
|
TurnInstruction getInstructionForObvious(const std::size_t number_of_candidates,
|
||||||
|
const NodeID from,
|
||||||
const EdgeID via_edge,
|
const EdgeID via_edge,
|
||||||
const TurnCandidate &candidate,
|
const TurnCandidate &candidate,
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph);
|
const util::NodeBasedDynamicGraph &node_based_graph);
|
||||||
|
@ -101,27 +101,27 @@ std::vector<TurnCandidate> getTurns(const NodeID from,
|
|||||||
node_based_graph);
|
node_based_graph);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (detail::isBasicJunction(from, via_edge, turn_candidates, node_based_graph) &&
|
if (turn_candidates.size() <= 4) // TODO change when larger junctions are handled
|
||||||
turn_candidates.size() <= 4) // TODO change when larger junctions are handled
|
|
||||||
{
|
{
|
||||||
if (turn_candidates.size() == 1)
|
if (turn_candidates.size() == 1)
|
||||||
{
|
{
|
||||||
turn_candidates = detail::handleOneWayTurn(from, via_edge, std::move(turn_candidates),
|
turn_candidates = detail::handleOneWayTurn(from, via_edge, std::move(turn_candidates),
|
||||||
node_based_graph);
|
node_based_graph);
|
||||||
}
|
}
|
||||||
if (turn_candidates.size() == 2)
|
else if (turn_candidates.size() == 2)
|
||||||
{
|
{
|
||||||
turn_candidates = detail::handleTwoWayTurn(from, via_edge, std::move(turn_candidates),
|
turn_candidates = detail::handleTwoWayTurn(from, via_edge, std::move(turn_candidates),
|
||||||
node_based_graph);
|
node_based_graph);
|
||||||
}
|
}
|
||||||
if (turn_candidates.size() == 3)
|
else if (turn_candidates.size() == 3)
|
||||||
{
|
{
|
||||||
detail::handleThreeWayTurn(from, via_edge, std::move(turn_candidates),
|
turn_candidates = detail::handleThreeWayTurn(from, via_edge, std::move(turn_candidates),
|
||||||
node_based_graph);
|
node_based_graph);
|
||||||
}
|
}
|
||||||
if (turn_candidates.size() == 4)
|
else if (turn_candidates.size() == 4)
|
||||||
{
|
{
|
||||||
detail::handleFourWayTurn(from, via_edge, std::move(turn_candidates), node_based_graph);
|
turn_candidates = detail::handleFourWayTurn(from, via_edge, std::move(turn_candidates),
|
||||||
|
node_based_graph);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -295,7 +295,8 @@ fallbackTurnAssignmentMotorway(std::vector<TurnCandidate> turn_candidates,
|
|||||||
candidate.instruction = {type, DirectionModifier::Straight};
|
candidate.instruction = {type, DirectionModifier::Straight};
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
candidate.instruction = {type, candidate.angle > STRAIGHT_ANGLE
|
candidate.instruction = {type,
|
||||||
|
candidate.angle > STRAIGHT_ANGLE
|
||||||
? DirectionModifier::SlightLeft
|
? DirectionModifier::SlightLeft
|
||||||
: DirectionModifier::SlightRight};
|
: DirectionModifier::SlightRight};
|
||||||
}
|
}
|
||||||
@ -431,8 +432,8 @@ std::vector<TurnCandidate> handleFromMotorway(const NodeID from,
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(!isRampClass(turn_candidates[1].eid, node_based_graph));
|
BOOST_ASSERT(!isRampClass(turn_candidates[1].eid, node_based_graph));
|
||||||
|
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
noTurnOrNewName(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -477,8 +478,8 @@ std::vector<TurnCandidate> handleFromMotorway(const NodeID from,
|
|||||||
{
|
{
|
||||||
if (exiting_motorways == 2 && turn_candidates.size() == 2)
|
if (exiting_motorways == 2 && turn_candidates.size() == 2)
|
||||||
{
|
{
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
util::SimpleLogger().Write(logWARNING)
|
util::SimpleLogger().Write(logWARNING)
|
||||||
<< "Disabled U-Turn on a freeway at "
|
<< "Disabled U-Turn on a freeway at "
|
||||||
<< localizer(node_based_graph.GetTarget(via_edge));
|
<< localizer(node_based_graph.GetTarget(via_edge));
|
||||||
@ -542,9 +543,8 @@ std::vector<TurnCandidate> handleFromMotorway(const NodeID from,
|
|||||||
auto coord = localizer(node_based_graph.GetTarget(via_edge));
|
auto coord = localizer(node_based_graph.GetTarget(via_edge));
|
||||||
util::SimpleLogger().Write(logWARNING)
|
util::SimpleLogger().Write(logWARNING)
|
||||||
<< "Found motorway junction with more than "
|
<< "Found motorway junction with more than "
|
||||||
"2 exiting motorways or additional ramps at "
|
"2 exiting motorways or additional ramps at " << std::setprecision(12)
|
||||||
<< std::setprecision(12) << toFloating(coord.lat) << " "
|
<< toFloating(coord.lat) << " " << toFloating(coord.lon);
|
||||||
<< toFloating(coord.lon);
|
|
||||||
fallbackTurnAssignmentMotorway(turn_candidates, node_based_graph);
|
fallbackTurnAssignmentMotorway(turn_candidates, node_based_graph);
|
||||||
}
|
}
|
||||||
} // done for more than one highway exit
|
} // done for more than one highway exit
|
||||||
@ -572,8 +572,8 @@ std::vector<TurnCandidate> handleMotorwayRamp(const NodeID from,
|
|||||||
BOOST_ASSERT(!turn_candidates[0].valid);
|
BOOST_ASSERT(!turn_candidates[0].valid);
|
||||||
BOOST_ASSERT(isMotorwayClass(turn_candidates[1].eid, node_based_graph));
|
BOOST_ASSERT(isMotorwayClass(turn_candidates[1].eid, node_based_graph));
|
||||||
|
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
noTurnOrNewName(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
}
|
}
|
||||||
else if (turn_candidates.size() == 3)
|
else if (turn_candidates.size() == 3)
|
||||||
{
|
{
|
||||||
@ -604,7 +604,8 @@ std::vector<TurnCandidate> handleMotorwayRamp(const NodeID from,
|
|||||||
}
|
}
|
||||||
else // passing by the end of a motorway
|
else // passing by the end of a motorway
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction =
|
||||||
noTurnOrNewName(from, via_edge, turn_candidates[1], node_based_graph);
|
getInstructionForObvious(turn_candidates.size(), from, via_edge,
|
||||||
|
turn_candidates[1], node_based_graph);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -622,7 +623,8 @@ std::vector<TurnCandidate> handleMotorwayRamp(const NodeID from,
|
|||||||
}
|
}
|
||||||
else // passing the end of a highway
|
else // passing the end of a highway
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction =
|
||||||
noTurnOrNewName(from, via_edge, turn_candidates[1], node_based_graph);
|
getInstructionForObvious(turn_candidates.size(), from, via_edge,
|
||||||
|
turn_candidates[1], node_based_graph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -680,8 +682,8 @@ std::vector<TurnCandidate> handleMotorwayRamp(const NodeID from,
|
|||||||
}
|
}
|
||||||
else if (isMotorwayClass(edge_data.road_classification.road_class))
|
else if (isMotorwayClass(edge_data.road_classification.road_class))
|
||||||
{
|
{
|
||||||
candidate.instruction = {TurnType::Merge, passed_highway_entry
|
candidate.instruction = {TurnType::Merge,
|
||||||
? DirectionModifier::SlightRight
|
passed_highway_entry ? DirectionModifier::SlightRight
|
||||||
: DirectionModifier::SlightLeft};
|
: DirectionModifier::SlightLeft};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@ -732,42 +734,6 @@ handleMotorwayJunction(const NodeID from,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBasicJunction(const NodeID from,
|
|
||||||
const EdgeID via_edge,
|
|
||||||
const std::vector<TurnCandidate> &turn_candidates,
|
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph)
|
|
||||||
{
|
|
||||||
(void)from, (void)turn_candidates;
|
|
||||||
|
|
||||||
for (const auto &candidate : turn_candidates)
|
|
||||||
{
|
|
||||||
const auto &out_data = node_based_graph.GetEdgeData(candidate.eid);
|
|
||||||
|
|
||||||
if (out_data.road_classification.road_class == FunctionalRoadClass::MOTORWAY ||
|
|
||||||
out_data.road_classification.road_class == FunctionalRoadClass::TRUNK)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const auto &in_data = node_based_graph.GetEdgeData(via_edge);
|
|
||||||
return in_data.road_classification.road_class != FunctionalRoadClass::MOTORWAY &&
|
|
||||||
in_data.road_classification.road_class != FunctionalRoadClass::TRUNK;
|
|
||||||
/*
|
|
||||||
bool on_ramp = false;
|
|
||||||
if (isRampClass(in_data.road_classification.road_class))
|
|
||||||
on_ramp = true;
|
|
||||||
|
|
||||||
std::size_t ramp_count = 0;
|
|
||||||
for (const auto &candidate : turn_candidates)
|
|
||||||
{
|
|
||||||
const auto &out_data = node_based_graph.GetEdgeData(candidate.eid);
|
|
||||||
if (isRampClass(out_data.road_classification.road_class))
|
|
||||||
ramp_count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (on_ramp && ramp_count == turn_candidates.size()) || (!on_ramp && ramp_count == 0);
|
|
||||||
*/
|
|
||||||
}
|
|
||||||
|
|
||||||
bool isMotorwayJunction(const NodeID from,
|
bool isMotorwayJunction(const NodeID from,
|
||||||
const EdgeID via_edge,
|
const EdgeID via_edge,
|
||||||
const std::vector<TurnCandidate> &turn_candidates,
|
const std::vector<TurnCandidate> &turn_candidates,
|
||||||
@ -831,41 +797,34 @@ TurnType findBasicTurnType(const NodeID from,
|
|||||||
return TurnType::Turn;
|
return TurnType::Turn;
|
||||||
}
|
}
|
||||||
|
|
||||||
TurnInstruction noTurnOrNewName(const NodeID from,
|
TurnInstruction getInstructionForObvious(const std::size_t num_candidates,
|
||||||
|
const NodeID from,
|
||||||
const EdgeID via_edge,
|
const EdgeID via_edge,
|
||||||
const TurnCandidate &candidate,
|
const TurnCandidate &candidate,
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph)
|
const util::NodeBasedDynamicGraph &node_based_graph)
|
||||||
{
|
{
|
||||||
|
const auto type = findBasicTurnType(from, via_edge, candidate, node_based_graph);
|
||||||
(void)from;
|
if (type == TurnType::Ramp)
|
||||||
const auto &in_data = node_based_graph.GetEdgeData(via_edge);
|
|
||||||
const auto &out_data = node_based_graph.GetEdgeData(candidate.eid);
|
|
||||||
if (in_data.name_id == out_data.name_id)
|
|
||||||
{
|
{
|
||||||
if (angularDeviation(candidate.angle, 0) > 0.01)
|
return {TurnType::Ramp, getTurnDirection(candidate.angle)};
|
||||||
return TurnInstruction::SUPPRESSED(getTurnDirection(candidate.angle));
|
}
|
||||||
|
|
||||||
|
if (angularDeviation(candidate.angle, 0) < 0.01)
|
||||||
|
{
|
||||||
return {TurnType::Turn, DirectionModifier::UTurn};
|
return {TurnType::Turn, DirectionModifier::UTurn};
|
||||||
}
|
}
|
||||||
else
|
if (type == TurnType::Turn)
|
||||||
{
|
{
|
||||||
return {TurnType::NewName, getTurnDirection(candidate.angle)};
|
return {TurnType::NewName, getTurnDirection(candidate.angle)};
|
||||||
}
|
}
|
||||||
}
|
BOOST_ASSERT(type == TurnType::Continue);
|
||||||
|
if (num_candidates > 2)
|
||||||
TurnInstruction getInstructionForObvious(const NodeID from,
|
|
||||||
const EdgeID via_edge,
|
|
||||||
const TurnCandidate &candidate,
|
|
||||||
const util::NodeBasedDynamicGraph &node_based_graph)
|
|
||||||
{
|
|
||||||
|
|
||||||
if (findBasicTurnType(from, via_edge, candidate, node_based_graph) == TurnType::Turn)
|
|
||||||
{
|
{
|
||||||
return noTurnOrNewName(from, via_edge, candidate, node_based_graph);
|
return {TurnType::Suppressed, getTurnDirection(candidate.angle)};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return {TurnType::Ramp, getTurnDirection(candidate.angle)};
|
return {TurnType::NoTurn, getTurnDirection(candidate.angle)};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -899,8 +858,11 @@ std::vector<TurnCandidate> handleTwoWayTurn(const NodeID from,
|
|||||||
{
|
{
|
||||||
BOOST_ASSERT(turn_candidates[0].angle < 0.001);
|
BOOST_ASSERT(turn_candidates[0].angle < 0.001);
|
||||||
|
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
|
|
||||||
|
if (turn_candidates[1].instruction.type == TurnType::Suppressed)
|
||||||
|
turn_candidates[1].instruction.type = TurnType::NoTurn;
|
||||||
|
|
||||||
#if PRINT_DEBUG_CANDIDATES
|
#if PRINT_DEBUG_CANDIDATES
|
||||||
std::cout << "Basic Two Turns Candidates:\n";
|
std::cout << "Basic Two Turns Candidates:\n";
|
||||||
@ -942,10 +904,13 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph))
|
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph))
|
||||||
{
|
{
|
||||||
if (angularDeviation(turn_candidates[1].angle, STRAIGHT_ANGLE) <
|
if (angularDeviation(turn_candidates[1].angle, STRAIGHT_ANGLE) <
|
||||||
MAXIMAL_ALLOWED_NO_TURN_DEVIATION)
|
MAXIMAL_ALLOWED_NO_TURN_DEVIATION &&
|
||||||
|
angularDeviation(turn_candidates[2].angle, STRAIGHT_ANGLE) >
|
||||||
|
FUZZY_ANGLE_DIFFERENCE)
|
||||||
{
|
{
|
||||||
turn_candidates[1].instruction = getInstructionForObvious(
|
turn_candidates[1].instruction =
|
||||||
from, via_edge, turn_candidates[1], node_based_graph);
|
getInstructionForObvious(turn_candidates.size(), from, via_edge,
|
||||||
|
turn_candidates[1], node_based_graph);
|
||||||
if (turn_candidates[1].instruction.type == TurnType::Turn)
|
if (turn_candidates[1].instruction.type == TurnType::Turn)
|
||||||
turn_candidates[1].instruction = {TurnType::Fork,
|
turn_candidates[1].instruction = {TurnType::Fork,
|
||||||
DirectionModifier::SlightRight};
|
DirectionModifier::SlightRight};
|
||||||
@ -961,10 +926,13 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
findBasicTurnType(from, via_edge, turn_candidates[2], node_based_graph))
|
findBasicTurnType(from, via_edge, turn_candidates[2], node_based_graph))
|
||||||
{
|
{
|
||||||
if (angularDeviation(turn_candidates[2].angle, STRAIGHT_ANGLE) <
|
if (angularDeviation(turn_candidates[2].angle, STRAIGHT_ANGLE) <
|
||||||
MAXIMAL_ALLOWED_NO_TURN_DEVIATION)
|
MAXIMAL_ALLOWED_NO_TURN_DEVIATION &&
|
||||||
|
angularDeviation(turn_candidates[1].angle, STRAIGHT_ANGLE) >
|
||||||
|
FUZZY_ANGLE_DIFFERENCE)
|
||||||
{
|
{
|
||||||
turn_candidates[2].instruction = getInstructionForObvious(
|
turn_candidates[2].instruction =
|
||||||
from, via_edge, turn_candidates[2], node_based_graph);
|
getInstructionForObvious(turn_candidates.size(), from, via_edge,
|
||||||
|
turn_candidates[2], node_based_graph);
|
||||||
if (turn_candidates[2].instruction.type == TurnType::Turn)
|
if (turn_candidates[2].instruction.type == TurnType::Turn)
|
||||||
turn_candidates[2].instruction = {TurnType::Fork,
|
turn_candidates[2].instruction = {TurnType::Fork,
|
||||||
DirectionModifier::SlightRight};
|
DirectionModifier::SlightRight};
|
||||||
@ -980,19 +948,20 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (turn_candidates[1].valid)
|
if (turn_candidates[1].valid)
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
if (turn_candidates[2].valid)
|
if (turn_candidates[2].valid)
|
||||||
turn_candidates[2].instruction =
|
turn_candidates[2].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[2], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[2], node_based_graph);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// T Intersection
|
/* T Intersection
|
||||||
//
|
|
||||||
// OOOOOOO T OOOOOOOO
|
OOOOOOO T OOOOOOOO
|
||||||
// I
|
I
|
||||||
// I
|
I
|
||||||
// I
|
I
|
||||||
|
*/
|
||||||
else if (angularDeviation(turn_candidates[1].angle, 90) < NARROW_TURN_ANGLE &&
|
else if (angularDeviation(turn_candidates[1].angle, 90) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[2].angle, 270) < NARROW_TURN_ANGLE &&
|
angularDeviation(turn_candidates[2].angle, 270) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
||||||
@ -1015,11 +984,12 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
turn_candidates[2].instruction = {TurnType::Ramp, DirectionModifier::Left};
|
turn_candidates[2].instruction = {TurnType::Ramp, DirectionModifier::Left};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// T Intersection, Cross left
|
/* T Intersection, Cross left
|
||||||
// O
|
O
|
||||||
// O
|
O
|
||||||
// O
|
O
|
||||||
// IIIIIIII - OOOOOOOOOO
|
IIIIIIII - OOOOOOOOOO
|
||||||
|
*/
|
||||||
else if (angularDeviation(turn_candidates[1].angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE &&
|
else if (angularDeviation(turn_candidates[1].angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[2].angle, 270) < NARROW_TURN_ANGLE &&
|
angularDeviation(turn_candidates[2].angle, 270) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
||||||
@ -1029,8 +999,8 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
{
|
{
|
||||||
if (TurnType::Ramp !=
|
if (TurnType::Ramp !=
|
||||||
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph))
|
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph))
|
||||||
turn_candidates[1].instruction =
|
turn_candidates[1].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[1], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[1], node_based_graph);
|
||||||
else
|
else
|
||||||
turn_candidates[1].instruction = {TurnType::Ramp, DirectionModifier::Straight};
|
turn_candidates[1].instruction = {TurnType::Ramp, DirectionModifier::Straight};
|
||||||
}
|
}
|
||||||
@ -1041,20 +1011,21 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
DirectionModifier::Left};
|
DirectionModifier::Left};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// T Intersection, Cross right
|
/* T Intersection, Cross right
|
||||||
//
|
|
||||||
// IIIIIIII T OOOOOOOOOO
|
IIIIIIII T OOOOOOOOOO
|
||||||
// O
|
O
|
||||||
// O
|
O
|
||||||
// O
|
O
|
||||||
|
*/
|
||||||
else if (angularDeviation(turn_candidates[2].angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE &&
|
else if (angularDeviation(turn_candidates[2].angle, STRAIGHT_ANGLE) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[1].angle, 90) < NARROW_TURN_ANGLE &&
|
angularDeviation(turn_candidates[1].angle, 90) < NARROW_TURN_ANGLE &&
|
||||||
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
angularDeviation(turn_candidates[1].angle, turn_candidates[2].angle) >
|
||||||
NARROW_TURN_ANGLE)
|
NARROW_TURN_ANGLE)
|
||||||
{
|
{
|
||||||
if (turn_candidates[2].valid)
|
if (turn_candidates[2].valid)
|
||||||
turn_candidates[2].instruction =
|
turn_candidates[2].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[2], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[2], node_based_graph);
|
||||||
if (turn_candidates[1].valid)
|
if (turn_candidates[1].valid)
|
||||||
turn_candidates[1].instruction = {
|
turn_candidates[1].instruction = {
|
||||||
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph),
|
findBasicTurnType(from, via_edge, turn_candidates[1], node_based_graph),
|
||||||
@ -1065,8 +1036,8 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
node_based_graph.GetEdgeData(turn_candidates[1].eid).name_id ==
|
node_based_graph.GetEdgeData(turn_candidates[1].eid).name_id ==
|
||||||
node_based_graph.GetEdgeData(turn_candidates[2].eid).name_id)
|
node_based_graph.GetEdgeData(turn_candidates[2].eid).name_id)
|
||||||
{
|
{
|
||||||
const auto findTurn = [isObviousOfTwo](const TurnCandidate turn,
|
const auto findTurn = [isObviousOfTwo](const TurnCandidate turn, const TurnCandidate other)
|
||||||
const TurnCandidate other) -> TurnInstruction
|
-> TurnInstruction
|
||||||
{
|
{
|
||||||
return {isObviousOfTwo(turn, other) ? TurnType::Merge : TurnType::Turn,
|
return {isObviousOfTwo(turn, other) ? TurnType::Merge : TurnType::Turn,
|
||||||
getTurnDirection(turn.angle)};
|
getTurnDirection(turn.angle)};
|
||||||
@ -1151,7 +1122,7 @@ std::vector<TurnCandidate> handleThreeWayTurn(const NodeID from,
|
|||||||
// TODO handle obviousness, Handle Merges
|
// TODO handle obviousness, Handle Merges
|
||||||
|
|
||||||
#if PRINT_DEBUG_CANDIDATES
|
#if PRINT_DEBUG_CANDIDATES
|
||||||
std::cout << "Basic Turn Candidates:\n";
|
std::cout << "Basic Three Turn Candidates:\n";
|
||||||
for (auto tc : turn_candidates)
|
for (auto tc : turn_candidates)
|
||||||
std::cout << "\t" << tc.toString() << " "
|
std::cout << "\t" << tc.toString() << " "
|
||||||
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
||||||
@ -1179,8 +1150,8 @@ std::vector<TurnCandidate> handleFourWayTurn(const NodeID from,
|
|||||||
turn_candidates[1].instruction = {type, DirectionModifier::Right};
|
turn_candidates[1].instruction = {type, DirectionModifier::Right};
|
||||||
}
|
}
|
||||||
{ // Straight
|
{ // Straight
|
||||||
turn_candidates[2].instruction =
|
turn_candidates[2].instruction = getInstructionForObvious(
|
||||||
getInstructionForObvious(from, via_edge, turn_candidates[2], node_based_graph);
|
turn_candidates.size(), from, via_edge, turn_candidates[2], node_based_graph);
|
||||||
}
|
}
|
||||||
{ // Left
|
{ // Left
|
||||||
const auto type =
|
const auto type =
|
||||||
@ -1244,7 +1215,7 @@ std::vector<TurnCandidate> handleFourWayTurn(const NodeID from,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if PRINT_DEBUG_CANDIDATES
|
#if PRINT_DEBUG_CANDIDATES
|
||||||
std::cout << "Basic Turn Candidates:\n";
|
std::cout << "Basic Four Turn Candidates:\n";
|
||||||
for (auto tc : turn_candidates)
|
for (auto tc : turn_candidates)
|
||||||
std::cout << "\t" << tc.toString() << " "
|
std::cout << "\t" << tc.toString() << " "
|
||||||
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
||||||
@ -1262,7 +1233,7 @@ std::vector<TurnCandidate> handleComplexTurn(const NodeID from,
|
|||||||
(void)via_edge; // FIXME unused
|
(void)via_edge; // FIXME unused
|
||||||
(void)node_based_graph; // FIXME unused
|
(void)node_based_graph; // FIXME unused
|
||||||
#if PRINT_DEBUG_CANDIDATES
|
#if PRINT_DEBUG_CANDIDATES
|
||||||
std::cout << "Basic Turn Candidates:\n";
|
std::cout << "Basic Complex Turn Candidates:\n";
|
||||||
for (auto tc : turn_candidates)
|
for (auto tc : turn_candidates)
|
||||||
std::cout << "\t" << tc.toString() << " "
|
std::cout << "\t" << tc.toString() << " "
|
||||||
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
||||||
@ -1562,8 +1533,8 @@ bool isObviousChoice(const EdgeID via_eid,
|
|||||||
|
|
||||||
const auto &candidate_to_the_right = turn_candidates[getRight(turn_index)];
|
const auto &candidate_to_the_right = turn_candidates[getRight(turn_index)];
|
||||||
|
|
||||||
const auto hasValidRatio = [&](const TurnCandidate &left, const TurnCandidate ¢er,
|
const auto hasValidRatio =
|
||||||
const TurnCandidate &right)
|
[&](const TurnCandidate &left, const TurnCandidate ¢er, const TurnCandidate &right)
|
||||||
{
|
{
|
||||||
auto angle_left = (left.angle > 180) ? angularDeviation(left.angle, STRAIGHT_ANGLE) : 180;
|
auto angle_left = (left.angle > 180) ? angularDeviation(left.angle, STRAIGHT_ANGLE) : 180;
|
||||||
auto angle_right =
|
auto angle_right =
|
||||||
@ -1895,9 +1866,8 @@ std::vector<TurnCandidate> mergeSegregatedRoads(const NodeID from_node,
|
|||||||
std::cout << "Second: " << second_data.name_id << " " << second_data.travel_mode << " "
|
std::cout << "Second: " << second_data.name_id << " " << second_data.travel_mode << " "
|
||||||
<< second_data.road_classification.road_class << " "
|
<< second_data.road_classification.road_class << " "
|
||||||
<< turn_candidates[second].angle << " " << second_data.reversed << std::endl;
|
<< turn_candidates[second].angle << " " << second_data.reversed << std::endl;
|
||||||
std::cout << "Deviation: "
|
std::cout << "Deviation: " << angularDeviation(turn_candidates[first].angle,
|
||||||
<< angularDeviation(turn_candidates[first].angle, turn_candidates[second].angle)
|
turn_candidates[second].angle) << std::endl;
|
||||||
<< std::endl;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return first_data.name_id != INVALID_NAME_ID && first_data.name_id == second_data.name_id &&
|
return first_data.name_id != INVALID_NAME_ID && first_data.name_id == second_data.name_id &&
|
||||||
@ -2035,7 +2005,13 @@ std::vector<TurnCandidate> handleConflicts(const NodeID from,
|
|||||||
left.instruction.direction_modifier == right.instruction.direction_modifier;
|
left.instruction.direction_modifier == right.instruction.direction_modifier;
|
||||||
};
|
};
|
||||||
(void)isConflict; // FIXME
|
(void)isConflict; // FIXME
|
||||||
|
#if PRINT_DEBUG_CANDIDATES
|
||||||
|
std::cout << "Post Conflict Resolution Candidates:\n";
|
||||||
|
for (auto tc : turn_candidates)
|
||||||
|
std::cout << "\t" << tc.toString() << " "
|
||||||
|
<< (int)node_based_graph.GetEdgeData(tc.eid).road_classification.road_class
|
||||||
|
<< " name: " << node_based_graph.GetEdgeData(tc.eid).name_id << std::endl;
|
||||||
|
#endif
|
||||||
return turn_candidates;
|
return turn_candidates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2047,7 +2023,8 @@ void assignFork(const EdgeID via_edge,
|
|||||||
const auto &in_data = node_based_graph.GetEdgeData(via_edge);
|
const auto &in_data = node_based_graph.GetEdgeData(via_edge);
|
||||||
{ // left fork
|
{ // left fork
|
||||||
const auto &out_data = node_based_graph.GetEdgeData(left.eid);
|
const auto &out_data = node_based_graph.GetEdgeData(left.eid);
|
||||||
if (angularDeviation(left.angle, 180) < MAXIMAL_ALLOWED_NO_TURN_DEVIATION)
|
if (angularDeviation(left.angle, STRAIGHT_ANGLE) < MAXIMAL_ALLOWED_NO_TURN_DEVIATION &&
|
||||||
|
angularDeviation(right.angle, STRAIGHT_ANGLE) > FUZZY_ANGLE_DIFFERENCE)
|
||||||
{
|
{
|
||||||
if (requiresAnnouncedment(in_data, out_data))
|
if (requiresAnnouncedment(in_data, out_data))
|
||||||
{
|
{
|
||||||
@ -2065,7 +2042,8 @@ void assignFork(const EdgeID via_edge,
|
|||||||
}
|
}
|
||||||
{ // right fork
|
{ // right fork
|
||||||
const auto &out_data = node_based_graph.GetEdgeData(right.eid);
|
const auto &out_data = node_based_graph.GetEdgeData(right.eid);
|
||||||
if (angularDeviation(right.angle, 180) < MAXIMAL_ALLOWED_NO_TURN_DEVIATION)
|
if (angularDeviation(right.angle, STRAIGHT_ANGLE) < MAXIMAL_ALLOWED_NO_TURN_DEVIATION &&
|
||||||
|
angularDeviation(left.angle, STRAIGHT_ANGLE) > FUZZY_ANGLE_DIFFERENCE)
|
||||||
{
|
{
|
||||||
if (requiresAnnouncedment(in_data, out_data))
|
if (requiresAnnouncedment(in_data, out_data))
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user