findNextCoordinatesV2 function

String findNextCoordinatesV2(
  1. dynamic progress
)

Implementation

String findNextCoordinatesV2(dynamic progress) {
  if (progress['segments'] == null ||
      progress['segments'][0] == null ||
      progress['segments'][0]['points'] == null) {
    debugPrint("findNextCoordinates: There are no segment points ");
    return "";
  }
  dynamic points = progress['segments'][0]['points']; //points in current floor
  List<Map<String, dynamic>> pathPoints =
      List<Map<String, dynamic>>.from(points);
  Map<String, dynamic> currentPosition = progress['closestLocationInRoute']
      ['position']; //TODO: Check if that is correct

  // Project current position on path
  Map<String, dynamic> projectedPoint = pathPoints[0];
  double minDistance = double.infinity;
  int segmentIndex = -1;

  for (int i = 0; i < pathPoints.length - 1; i++) {
    Map<String, dynamic> A = pathPoints[i];
    Map<String, dynamic> B = pathPoints[i + 1];
    Map<String, dynamic> P = projectPointOnSegment(currentPosition, A, B);

    double distance = calculateDistance(currentPosition, P);
    if (distance < minDistance) {
      minDistance = distance;
      projectedPoint = P;
      segmentIndex = i + 1; // from p to segment index is the first segment
    }
  }

  ////
  // Calculate the distance to skip
  double distanceToSkip = ARModeDebugValues.arrowDistanceToSkipNode.value;
  double accumulatedDistance = calculateDistance(
      projectedPoint, pathPoints[segmentIndex]); // remaining of first segment

  for (int i = segmentIndex + 1; i < pathPoints.length; i++) {
    Map<String, dynamic> A = pathPoints[i - 1];
    Map<String, dynamic> B = pathPoints[i];
    double segmentDistance = calculateDistance(A, B);
    accumulatedDistance += segmentDistance;

    if (accumulatedDistance >= distanceToSkip) {
      // Interpolate between A and B to find the exact position
      double distanceWithinSegment =
          distanceToSkip - (accumulatedDistance - segmentDistance);
      double interpolationFactor = distanceWithinSegment / segmentDistance;

      // Interpolated position
      double x = A['cartesianCoordinate']['x'] +
          interpolationFactor *
              (B['cartesianCoordinate']['x'] - A['cartesianCoordinate']['x']);
      double y = A['cartesianCoordinate']['y'] +
          interpolationFactor *
              (B['cartesianCoordinate']['y'] - A['cartesianCoordinate']['y']);

      return jsonEncode({'x': x, 'y': y});
    } else if (i == pathPoints.length - 1 && // last element
        progress['segments'].length > 1 && // there are more floors
        accumulatedDistance < distanceThresholdToFloorChange) {
      //below distance threshold
      return "floorChange";
    } else if (i == pathPoints.length - 1) {
      // Last element
      return jsonEncode(pathPoints[i]["cartesianCoordinate"]);
    }
  }

  return "";
}