| 69 | } |
| 70 | |
| 71 | void TrackMatcher::MatchTrack(vector<DataPoint> const & track, vector<MatchedTrack> & matchedTracks) |
| 72 | { |
| 73 | m_pointsCount += track.size(); |
| 74 | |
| 75 | vector<Step> steps; |
| 76 | steps.reserve(track.size()); |
| 77 | for (auto const & routePoint : track) |
| 78 | steps.emplace_back(routePoint); |
| 79 | |
| 80 | for (size_t trackBegin = 0; trackBegin < steps.size();) |
| 81 | { |
| 82 | for (; trackBegin < steps.size(); ++trackBegin) |
| 83 | { |
| 84 | steps[trackBegin].FillCandidatesWithNearbySegments(m_dataSource, *m_graph, *m_vehicleModel, m_mwmId); |
| 85 | if (steps[trackBegin].HasCandidates()) |
| 86 | break; |
| 87 | |
| 88 | ++m_nonMatchedPointsCount; |
| 89 | } |
| 90 | |
| 91 | if (trackBegin >= steps.size()) |
| 92 | break; |
| 93 | |
| 94 | size_t trackEnd = trackBegin; |
| 95 | for (; trackEnd < steps.size() - 1; ++trackEnd) |
| 96 | { |
| 97 | Step & nextStep = steps[trackEnd + 1]; |
| 98 | Step const & prevStep = steps[trackEnd]; |
| 99 | nextStep.FillCandidates(prevStep, *m_graph); |
| 100 | if (!nextStep.HasCandidates()) |
| 101 | break; |
| 102 | } |
| 103 | |
| 104 | steps[trackEnd].ChooseNearestSegment(); |
| 105 | |
| 106 | for (size_t i = trackEnd; i > trackBegin; --i) |
| 107 | steps[i - 1].ChooseSegment(steps[i], *m_graph); |
| 108 | |
| 109 | ++m_tracksCount; |
| 110 | |
| 111 | matchedTracks.push_back({}); |
| 112 | MatchedTrack & matchedTrack = matchedTracks.back(); |
| 113 | for (size_t i = trackBegin; i <= trackEnd; ++i) |
| 114 | { |
| 115 | Step const & step = steps[i]; |
| 116 | matchedTrack.emplace_back(step.GetDataPoint(), step.GetSegment()); |
| 117 | } |
| 118 | |
| 119 | trackBegin = trackEnd + 1; |
| 120 | } |
| 121 | } |
| 122 | |
| 123 | // TrackMatcher::Step ------------------------------------------------------------------------------ |
| 124 | TrackMatcher::Step::Step(DataPoint const & dataPoint) |
no test coverage detected