| 300 | } |
| 301 | |
| 302 | bool ScoreCandidatePathsGetter::GetBearingScore(BearingPointsSelector const & pointsSelector, |
| 303 | ScoreCandidatePathsGetter::Link const & part, |
| 304 | m2::PointD const & bearStartPoint, uint32_t requiredBearing, |
| 305 | Score & score) |
| 306 | { |
| 307 | auto const bearEndPoint = pointsSelector.GetEndPoint(part.m_edge, part.m_distanceM); |
| 308 | |
| 309 | auto const bearingDeg = scpg::BearingInDeg(bearStartPoint, bearEndPoint); |
| 310 | double const requiredBearingDeg = scpg::ToAngleInDeg(requiredBearing); |
| 311 | double const angleDeviationDeg = scpg::DifferenceInDeg(bearingDeg, requiredBearingDeg); |
| 312 | |
| 313 | // If the bearing according to osm segments (|bearingDeg|) is significantly different |
| 314 | // from the bearing set in openlr (|requiredBearingDeg|) the candidate should be skipped. |
| 315 | double constexpr kMinAngleDeviationDeg = 50.0; |
| 316 | if (angleDeviationDeg > kMinAngleDeviationDeg) |
| 317 | return false; |
| 318 | |
| 319 | double constexpr kMaxScoreForBearing = 60.0; |
| 320 | double constexpr kAngleDeviationFactor = 1.0 / 4.3; |
| 321 | score = static_cast<Score>(kMaxScoreForBearing / (1.0 + angleDeviationDeg * kAngleDeviationFactor)); |
| 322 | |
| 323 | return true; |
| 324 | } |
| 325 | } // namespace openlr |
nothing calls this directly
no test coverage detected