sample method
Fraction means distance along the route, independent of sampling density.
Implementation
ResolvedPathSample sample(double fraction) {
if (!fraction.isFinite || fraction < 0 || fraction > 1) {
throw RangeError.range(fraction, 0, 1, 'fraction');
}
if (points.length == 1) {
return ResolvedPathSample(
position: points.single,
tangent: DiagramPoint.zero,
fraction: fraction,
);
}
if (fraction == 1) {
final delta = points.last - points[points.length - 2];
return ResolvedPathSample(
position: points.last,
tangent: delta * (1 / delta.magnitude),
fraction: fraction,
);
}
final distance = fraction * length;
var low = 1;
var high = points.length - 1;
while (low < high) {
final middle = (low + high) ~/ 2;
if (_distances[middle] < distance) {
low = middle + 1;
} else {
high = middle;
}
}
final start = points[low - 1];
final delta = points[low] - start;
final segmentLength = _distances[low] - _distances[low - 1];
return ResolvedPathSample(
position:
start + delta * ((distance - _distances[low - 1]) / segmentLength),
tangent: delta * (1 / segmentLength),
fraction: fraction,
);
}