added timeEstimate and distanceBetweenPoints functions

This commit is contained in:
Fennel Kora 2024-04-13 18:42:16 -04:00
parent 27d69cecd5
commit 3cfdcacfd6

View file

@ -1,11 +1,11 @@
public class Route {
private double[] currentLocation; //Lat-Long coordinates for current location
private double[][][] routeSequences; //3D array of lat-long pairs + speed that form a route sequence, with multiple sequences stored
private double[][][] routeSequences; //3D array for routes. 1st dim selects route, 2nd dim selects route point, 3rd dim selects lat/long/speed/tolls (indices 0-2)
private int routeSelected;
private boolean tollsFlag; //stores user setting for whether to avoid tolls
private boolean hwyFlag; //stores user preference for whether to avoid major highways
public long timeEstimate; //time estimate in seconds
public float tollsAmount; //stores toll amount if toll roads are used
public double[] timeEstimate; //time estimate in seconds
public float[] tollsAmount; //stores toll amount if toll roads are used
public Destination currentDestination; //uses user-created class Destination
private void updateCurrentLocation() {
@ -21,11 +21,67 @@ public class Route {
updateCurrentLocation();
HelperFunctions apiCallToRouting = new HelperFunctions();
routeSequences[0] = apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationCoordinates(), tollsFlag, hwyFlag); //route option 1
timeEstimate[0] = estimateTime(routeSequences[0]);
estimateTolls(routeSequences[0]);
routeSequences[1] = apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationCoordinates(), tollsFlag, hwyFlag); //route option 2
timeEstimate[1] = estimateTime(routeSequences[1]);
estimateTolls(routeSequences[1]);
routeSequences[2] = apiCallToRouting.routingAPI(currentLocation, currentDestination.getDestinationCoordinates(), tollsFlag, hwyFlag); //route option 3
timeEstimate[2] = estimateTime(routeSequences[1]);
estimateTolls(routeSequences[1]);
}
public void selectRoute() {
public int enumRoutes() {
return routeSequences.length;
}
public void selectRoute(int userSelection) {
routeSelected = userSelection;
}
public void estimateTolls(double[][] route) {
}
public double estimateTime(double[][] route) {
//calculates distances between route segments, divided by speed in MPH
//the API would return expected speed due to traffic conditions as part of the speed (index 2) in the route array
double runningTime = 0;
//steps through subsequence route points to get distances, calculates time based on speed estimate, and accumulates on runningTime
for (int i = 0; i < route.length; i++) {
runningTime += distanceBetweenPoints(route[i], route[i+1]) / route[i][2];
}
return runningTime;
}
private double distanceBetweenPoints(double[] pointA, double[] pointB) {
/**
* Code excerpt by StackOverflow user Dommer, adapted for this application's use
* https://stackoverflow.com/questions/3694380/calculating-distance-between-two-points-using-latitude-longitude/3694410#3694410
*
* Calculate distance between two points in latitude and longitude taking
* into account height difference. If you are not interested in height
* difference pass 0.0. Uses Haversine method as its base.
*
* lat1, lon1 Start point lat2, lon2 End point el1 Start altitude in miles
* el2 End altitude in miles
* @returns Distance
*/
final int R = 6371; // Radius of the earth
int el1 = 0, el2 = 0;
double latDistance = Math.toRadians(pointA[0] - pointB[0]);
double lonDistance = Math.toRadians(pointA[1] - pointB[1]);
double a = Math.sin(latDistance / 2) * Math.sin(latDistance / 2)
+ Math.cos(Math.toRadians(pointA[0])) * Math.cos(Math.toRadians(pointB[0]))
* Math.sin(lonDistance / 2) * Math.sin(lonDistance / 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double distance = R * c * 0.6213711922; // convert to miles
double height = el1 - el2;
distance = Math.pow(distance, 2) + Math.pow(height, 2);
return Math.sqrt(distance);
}
}