linearMap function

double linearMap(
  1. List<double> xValues,
  2. List<double> yValues,
  3. double x
)

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,
  );
}