MCPcopy Create free account
hub / github.com/comaps/comaps / CorrectCandidatesSegmentByOutgoing

Function CorrectCandidatesSegmentByOutgoing

libs/routing/turns_generator.cpp:280–345  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

278}
279
280void 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

Callers 2

GetTurnDirectionBasicFunction · 0.85
GetTurnDirectionMethod · 0.85

Calls 10

CalcOneSegmentTurnAngleFunction · 0.85
ASSERTFunction · 0.85
frontMethod · 0.80
AlmostEqualAbsFunction · 0.50
beginMethod · 0.45
endMethod · 0.45
GetMwmIdMethod · 0.45
GetSegmentIdxMethod · 0.45
IsForwardMethod · 0.45
sizeMethod · 0.45

Tested by

no test coverage detected