findNextCoordinates function
String
findNextCoordinates(
- 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 "";
}