| 278 | } |
| 279 | |
| 280 | void CorrectCandidatesSegmentByOutgoing(TurnInfo const & turnInfo, Segment const & firstOutgoingSeg, |
| 281 | TurnCandidates & nodes) |
| 282 | { |
| 283 | double const turnAngle = CalcOneSegmentTurnAngle(turnInfo); |
| 284 | auto const IsFirstOutgoingSeg = [&firstOutgoingSeg](TurnCandidate const & turnCandidate) |
| 285 | { return turnCandidate.m_segment == firstOutgoingSeg; }; |
| 286 | auto & candidates = nodes.candidates; |
| 287 | auto it = find_if(candidates.begin(), candidates.end(), IsFirstOutgoingSeg); |
| 288 | if (it == candidates.end()) |
| 289 | { |
| 290 | // firstOutgoingSeg not found. Try to match by angle. |
| 291 | auto const DoesAngleMatch = [&turnAngle](TurnCandidate const & candidate) |
| 292 | { |
| 293 | return (AlmostEqualAbs(candidate.m_angle, turnAngle, 0.001) || |
| 294 | fabs(candidate.m_angle) + fabs(turnAngle) > 359.999); |
| 295 | }; |
| 296 | auto it = find_if(candidates.begin(), candidates.end(), DoesAngleMatch); |
| 297 | if (it != candidates.end()) |
| 298 | { |
| 299 | // Match by angle. Update candidate's segment. |
| 300 | ASSERT(it->m_segment.GetMwmId() != firstOutgoingSeg.GetMwmId(), ()); |
| 301 | ASSERT(it->m_segment.GetSegmentIdx() == firstOutgoingSeg.GetSegmentIdx(), ()); |
| 302 | ASSERT(it->m_segment.IsForward() == firstOutgoingSeg.IsForward(), ()); |
| 303 | it->m_segment = firstOutgoingSeg; |
| 304 | } |
| 305 | else if (nodes.isCandidatesAngleValid) |
| 306 | { |
| 307 | // Typically all candidates are from one mwm, and missed one (firstOutgoingSegment) from another. |
| 308 | LOG(LWARNING, ("Can't match any candidate with firstOutgoingSegment but isCandidatesAngleValid == true.")); |
| 309 | } |
| 310 | else |
| 311 | { |
| 312 | LOG(LWARNING, ("Can't match any candidate with firstOutgoingSegment and isCandidatesAngleValid == false")); |
| 313 | if (candidates.size() == 1) |
| 314 | { |
| 315 | auto & c = candidates.front(); |
| 316 | ASSERT(c.m_segment.GetMwmId() != firstOutgoingSeg.GetMwmId(), ()); |
| 317 | ASSERT(c.m_segment.GetSegmentIdx() == firstOutgoingSeg.GetSegmentIdx(), ()); |
| 318 | ASSERT(c.m_segment.IsForward() == firstOutgoingSeg.IsForward(), ()); |
| 319 | c.m_segment = firstOutgoingSeg; |
| 320 | c.m_angle = turnAngle; |
| 321 | nodes.isCandidatesAngleValid = true; |
| 322 | LOG(LWARNING, ("but since candidates.size() == 1, this was fixed.")); |
| 323 | } |
| 324 | else |
| 325 | LOG(LWARNING, ("and since candidates.size() > 1, this can't be fixed.")); |
| 326 | } |
| 327 | } |
| 328 | else // firstOutgoingSeg is found. |
| 329 | if (nodes.isCandidatesAngleValid) |
| 330 | { |
| 331 | #ifdef DEBUG |
| 332 | double constexpr eps = 0.001; |
| 333 | double const diff = fabs(it->m_angle - turnAngle); |
| 334 | ASSERT(diff < eps || fabs(diff - 360) < eps, (it->m_angle, turnAngle)); |
| 335 | #endif |
| 336 | } |
| 337 | else |
no test coverage detected