findNextCoordinates function

String findNextCoordinates(
  1. dynamic progress
)

Implementation

String findNextCoordinates(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>> segments = List<Map<String, dynamic>>.from(points);
  Map<String, dynamic> currentPosition = progress['closestLocationInRoute']
      ['position']; //TODO: Check if that is correct

  // Initializing projectedPoint to a default value
  Map<String, dynamic> projectedPoint = segments[0];
  double minDistance = double.infinity;
  int segmentIndex = -1;

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

    double distance = calculateDistance(currentPosition, P);
    if (distance < minDistance) {
      minDistance = distance;
      projectedPoint = P;
      segmentIndex = i;
    }
  }

  for (int i = segmentIndex + 1; i < segments.length; i++) {
    double distance = calculateDistance(projectedPoint, segments[i]);
    if (distance > ARModeDebugValues.arrowDistanceToSkipNode.value) {
      return jsonEncode(segments[i]["cartesianCoordinate"]);
    } else if (i == segments.length - 1 && // last element
        progress['segments'].length > 1 && // there are more floors
        distance < distanceThresholdToFloorChange) {
      //below distance threshold
      return "floorChange";
    } else if (i == segments.length - 1) {
      return jsonEncode(segments[i]["cartesianCoordinate"]);
    }
  }

  return "";
}