131 {
132 double start_length = src_node->Length();
133 double end_length = dest_node->Length();
134
135 static constexpr double kEpsilon = 1e-2;
136 const double start_s_adjusted =
137 (start_s > start_length && start_s - start_length <= kEpsilon)
138 ? start_length
139 : start_s;
140 const double end_s_adjusted =
141 (end_s > end_length && end_s - end_length <= kEpsilon) ? end_length
142 : end_s;
143
144 if (start_s_adjusted < 0.0 || start_s_adjusted > start_length) {
145 AERROR <<
"Illegal start_s: " << start_s <<
", length: " << start_length;
146 return;
147 }
148 if (end_s_adjusted < 0.0 || end_s_adjusted > end_length) {
149 AERROR <<
"Illegal end_s: " << end_s <<
", length: " << end_length;
150 return;
151 }
152
153 double start_cut_s = MoveSBackward(start_s_adjusted, 0.0);
154 range_manager->Add(src_node, start_cut_s, start_cut_s);
155 AddBlackMapFromOutParallel(src_node, start_cut_s / start_length,
156 range_manager);
157
158 double end_cut_s = MoveSForward(end_s_adjusted, end_length);
159 range_manager->Add(dest_node, end_cut_s, end_cut_s);
160 AddBlackMapFromInParallel(dest_node, end_cut_s / end_length, range_manager);
161 range_manager->SortAndMerge();
162}