Added closest waypoint function
This commit is contained in:
parent
5316df08a5
commit
e271e49374
@ -8,6 +8,7 @@ using EFB.Sessions;
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using EFB.Models;
|
using EFB.Models;
|
||||||
using EFB.MongoData;
|
using EFB.MongoData;
|
||||||
|
using EFB.Models.Route;
|
||||||
|
|
||||||
namespace EFB.Controllers
|
namespace EFB.Controllers
|
||||||
{
|
{
|
||||||
@ -30,13 +31,47 @@ namespace EFB.Controllers
|
|||||||
//Retrieve the user's latest sim position and construct it into FlightsimModel
|
//Retrieve the user's latest sim position and construct it into FlightsimModel
|
||||||
if (user.Route == null) return RedirectToAction("Index", "Route");
|
if (user.Route == null) return RedirectToAction("Index", "Route");
|
||||||
|
|
||||||
SimPositionModel latestPosition = await Mongo.GetLatestData(user.EMail);
|
SimPositionModel latestPositionModel = await Mongo.GetLatestData(user.EMail);
|
||||||
|
|
||||||
RouteModel route = await RouteModel.StringToRoute(user.Departure, user.Arrival, user.Cruise, user.Route);
|
RouteModel route = await RouteModel.StringToRoute(user.Departure, user.Arrival, user.Cruise, user.Route);
|
||||||
|
IWaypoint closest = DetermineClosest(route, latestPositionModel.LatestPosition);
|
||||||
|
|
||||||
return View(new FlightsimModel(latestPosition, null));
|
return View(new FlightsimModel(latestPositionModel, closest));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IWaypoint DetermineClosest(RouteModel route, SimPosition currentPosition){
|
||||||
|
IWaypoint closest = null;
|
||||||
|
float closestDistance = float.MaxValue;
|
||||||
|
//Assuming that we are on the earth for simplicity
|
||||||
|
IWaypoint waypoint = route.Departure;
|
||||||
|
while (waypoint.Next != null)
|
||||||
|
{
|
||||||
|
int earthRadius = 6371;
|
||||||
|
float distanceLat = DegreesToRadians(waypoint.Latitude - currentPosition.Latitude);
|
||||||
|
float distanceLon = DegreesToRadians(waypoint.Longitude - currentPosition.Longitude);
|
||||||
|
|
||||||
|
float latitude1 = DegreesToRadians(currentPosition.Latitude);
|
||||||
|
float latitude2 = DegreesToRadians(waypoint.Latitude);
|
||||||
|
|
||||||
|
var a = Math.Sin(distanceLat/2) * Math.Sin(distanceLat/2) + Math.Sin(distanceLon/2) * Math.Sin(distanceLon/2) * Math.Cos(latitude1) * Math.Cos(latitude2);
|
||||||
|
var c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1-a));
|
||||||
|
|
||||||
|
float distance = (float)(earthRadius * c);
|
||||||
|
|
||||||
|
if (distance < closestDistance)
|
||||||
|
{
|
||||||
|
closest = waypoint;
|
||||||
|
closestDistance = distance;
|
||||||
|
}
|
||||||
|
waypoint = waypoint.Next;
|
||||||
|
}
|
||||||
|
return closest;
|
||||||
|
}
|
||||||
|
private float DegreesToRadians(float degrees){
|
||||||
|
return (float)(degrees * Math.PI / 180);
|
||||||
|
}
|
||||||
|
|
||||||
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)]
|
||||||
public IActionResult Error()
|
public IActionResult Error()
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user