79 lines
1.9 KiB
C++
79 lines
1.9 KiB
C++
#ifndef TURN_INSTRUCTIONS_HPP
|
|
#define TURN_INSTRUCTIONS_HPP
|
|
|
|
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
|
|
};
|
|
|
|
struct TurnInstructionsClass
|
|
{
|
|
TurnInstructionsClass() = delete;
|
|
TurnInstructionsClass(const TurnInstructionsClass &) = delete;
|
|
|
|
static inline TurnInstruction GetTurnDirectionOfInstruction(const double angle)
|
|
{
|
|
if (angle >= 23 && angle < 67)
|
|
{
|
|
return TurnInstruction::TurnSharpRight;
|
|
}
|
|
if (angle >= 67 && angle < 113)
|
|
{
|
|
return TurnInstruction::TurnRight;
|
|
}
|
|
if (angle >= 113 && angle < 158)
|
|
{
|
|
return TurnInstruction::TurnSlightRight;
|
|
}
|
|
if (angle >= 158 && angle < 202)
|
|
{
|
|
return TurnInstruction::GoStraight;
|
|
}
|
|
if (angle >= 202 && angle < 248)
|
|
{
|
|
return TurnInstruction::TurnSlightLeft;
|
|
}
|
|
if (angle >= 248 && angle < 292)
|
|
{
|
|
return TurnInstruction::TurnLeft;
|
|
}
|
|
if (angle >= 292 && angle < 336)
|
|
{
|
|
return TurnInstruction::TurnSharpLeft;
|
|
}
|
|
return TurnInstruction::UTurn;
|
|
}
|
|
|
|
static inline bool TurnIsNecessary(const TurnInstruction turn_instruction)
|
|
{
|
|
if (TurnInstruction::NoTurn == turn_instruction ||
|
|
TurnInstruction::StayOnRoundAbout == turn_instruction)
|
|
{
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
};
|
|
|
|
#endif /* TURN_INSTRUCTIONS_HPP */
|