osrm-backend/include/extractor/turn_instructions.hpp

87 lines
2.0 KiB
C++
Raw Normal View History

#ifndef TURN_INSTRUCTIONS_HPP
#define TURN_INSTRUCTIONS_HPP
2016-01-05 10:51:13 -05:00
namespace osrm
{
namespace extractor
{
enum class TurnInstruction : unsigned char
{
NoTurn = 0,
GoStraight,
TurnSlightRight,
TurnRight,
TurnSharpRight,
UTurn,
TurnSharpLeft,
TurnLeft,
TurnSlightLeft,
ReachViaLocation,
HeadOn,
EnterRoundAbout,
LeaveRoundAbout,
StayOnRoundAbout,
StartAtEndOfStreet,
ReachedYourDestination,
EnterAgainstAllowedDirection,
LeaveAgainstAllowedDirection,
InverseAccessRestrictionFlag = 127,
AccessRestrictionFlag = 128,
AccessRestrictionPenalty = 129
};
2014-05-07 12:39:16 -04:00
struct TurnInstructionsClass
{
TurnInstructionsClass() = delete;
TurnInstructionsClass(const TurnInstructionsClass &) = delete;
static inline TurnInstruction GetTurnDirectionOfInstruction(const double angle)
2014-05-07 12:39:16 -04:00
{
if (angle >= 23 && angle < 67)
{
return TurnInstruction::TurnSharpRight;
}
2014-05-07 12:39:16 -04:00
if (angle >= 67 && angle < 113)
{
return TurnInstruction::TurnRight;
}
2014-05-07 12:39:16 -04:00
if (angle >= 113 && angle < 158)
{
return TurnInstruction::TurnSlightRight;
}
2014-05-07 12:39:16 -04:00
if (angle >= 158 && angle < 202)
{
return TurnInstruction::GoStraight;
}
2014-05-07 12:39:16 -04:00
if (angle >= 202 && angle < 248)
{
return TurnInstruction::TurnSlightLeft;
}
2014-05-07 12:39:16 -04:00
if (angle >= 248 && angle < 292)
{
return TurnInstruction::TurnLeft;
}
2014-05-07 12:39:16 -04:00
if (angle >= 292 && angle < 336)
{
return TurnInstruction::TurnSharpLeft;
}
return TurnInstruction::UTurn;
}
static inline bool TurnIsNecessary(const TurnInstruction turn_instruction)
2014-05-07 12:39:16 -04:00
{
if (TurnInstruction::NoTurn == turn_instruction ||
TurnInstruction::StayOnRoundAbout == turn_instruction)
2014-05-20 09:37:18 -04:00
{
return false;
2014-05-20 09:37:18 -04:00
}
return true;
}
};
2016-01-05 10:51:13 -05:00
}
}
#endif /* TURN_INSTRUCTIONS_HPP */