linearMap function
Implementation
double linearMap(List<double> xValues, List<double> yValues, double x) {
assert(x >= 0 && x <= 1, 'Invalid progress $x');
var segmentStartIndex = -1;
for (var i = 0; i < xValues.length; i++) {
if (progressInRange(x, xValues[i], xValues[(i + 1) % xValues.length])) {
segmentStartIndex = i;
break;
}
}
if (segmentStartIndex == -1) {
throw StateError('segmentStartIndex not found.');
}
final segmentEndIndex = (segmentStartIndex + 1) % xValues.length;
final segmentSizeX = positiveModulo(
xValues[segmentEndIndex] - xValues[segmentStartIndex],
1,
);
final segmentSizeY = positiveModulo(
yValues[segmentEndIndex] - yValues[segmentStartIndex],
1,
);
final positionInSegment = segmentSizeX < 0.001
? 0.5
: positiveModulo(x - xValues[segmentStartIndex], 1) / segmentSizeX;
return positiveModulo(
yValues[segmentStartIndex] + segmentSizeY * positionInSegment,
1,
);
}