136 const Range &searchSrcRange,
140 std::optional<Range> squeezeRange = std::nullopt)
142 Range leftSideParamRange = searchParamRange;
143 Range rightSideParamRange = searchParamRange;
146 leftSideParamRange = {searchParamRange.
start, searchParamRange.
start};
152 qreal currentSplitParam = leftSideParamRange.
mid();
153 Range currentSplitSrcRange = func(currentSplitParam);
160 if (!forwardDistance ||
qFuzzyIsNull(*forwardDistance)) {
161 leftSideParamRange.
end = currentSplitParam;
162 rightSideParamRange.
start = std::max(currentSplitParam, rightSideParamRange.
start);
163 }
else if (*forwardDistance > 0) {
165 leftSideParamRange.
start = currentSplitParam;
166 rightSideParamRange.
start = std::max(currentSplitParam, rightSideParamRange.
start);
167 }
else if (*forwardDistance < 0) {
169 rightSideParamRange.
end = currentSplitParam;
170 leftSideParamRange.
end = currentSplitParam;
173 if (forwardDistance && std::abs(*forwardDistance) < srcPrecision) {
180 rightSideParamRange = {searchParamRange.
end, searchParamRange.
end};
186 qreal currentSplitParam = rightSideParamRange.
mid();
187 Range currentSplitSrcRange = func(currentSplitParam);
195 if (!forwardDistance ||
qFuzzyIsNull(*forwardDistance)) {
196 rightSideParamRange.
start = currentSplitParam;
197 }
else if (*forwardDistance > 0) {
198 rightSideParamRange.
start = currentSplitParam;
199 }
else if (*forwardDistance < 0) {
200 rightSideParamRange.
end = currentSplitParam;
203 if (forwardDistance && std::abs(*forwardDistance) < srcPrecision) {
209 return std::make_pair(
Range{leftSideParamRange.
start, rightSideParamRange.
end},