using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using EFB.Sessions; using Microsoft.Extensions.Logging; using EFB.Models; using EFB.MongoData; using EFB.Models.Route; namespace EFB.Controllers { //[Route("[controller]")] public class FlightsimController : Controller { private readonly ILogger _logger; public FlightsimController(ILogger logger) { _logger = logger; } public async Task Index() { //Retrieve and Check current user status UserModel user = HttpContext.Session.GetObject("User"); if(user == null) return RedirectToAction("Index", "Home"); //Retrieve the user's latest sim position and construct it into FlightsimModel if (user.Route == null) return RedirectToAction("Index", "Route"); SimPositionModel latestPositionModel = await Mongo.GetLatestData(user.EMail); RouteModel route = await RouteModel.StringToRoute(user.Departure, user.Arrival, user.Cruise, user.Route); IWaypoint closest = DetermineClosest(route, latestPositionModel.LatestPosition); 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)] public IActionResult Error() { return View("Error!"); } } }