/// <summary> /// This methods was taken from the exercice level 1 GetLocation. And use a BaseTool method named TrilaterationSolver. /// TODO: search for a best Trilateration Algorithm. /// </summary> /// <param name="allSatellites"></param> /// <returns></returns> public XYCoordinates GetLocation(AllSatellitesData allSatellites) //I took this function from exercice Level 1 but I extend it passing more information in its parameter. { //At the moment it is only calling this BaseTools methods, but it could be an interface to a generic calls with diferents implementations and parameters. XYCoordinates xYCoordinates = BaseTools.TrilaterationSolver(_rebelSatellites.rebelSatellitesPositionList[allSatellites.satellites[0].name], allSatellites.satellites[0].distance, _rebelSatellites.rebelSatellitesPositionList[allSatellites.satellites[1].name], allSatellites.satellites[1].distance, _rebelSatellites.rebelSatellitesPositionList[allSatellites.satellites[2].name], allSatellites.satellites[2].distance); //reformat GetLocation asnwer to match exercice reuirements. Just 1 decimal number. xYCoordinates.xCoord = (float)Math.Round(xYCoordinates.GetCoordinateX(), 1); xYCoordinates.yCoord = (float)Math.Round(xYCoordinates.GetCoordinateY(), 1); return(xYCoordinates); }
public List <List <string> > GetMessagesListFromSatelliteData(AllSatellitesData allSatellitesData) { List <List <string> > messages = new List <List <string> >(); if (allSatellitesData.satellites.Count != _rebelSatellites.rebelSatellitesPositionList.Count) { throw new Exception("Error, the number of satellites must be at least " + _rebelSatellites.rebelSatellitesPositionList.Count); } foreach (SatelliteData satelliteData in allSatellitesData.satellites) { messages.Add(satelliteData.message); } return(messages); }
/// <summary> /// Take the list of distances from every satellite distance attribute given in the request Data /// </summary> /// <param name="topSecretRequestData"></param> /// <returns></returns> public List <float> GetDistancesListFromSatellitesData(AllSatellitesData topSecretRequestData) { List <float> distancesFromSatellites = new List <float>(); if (topSecretRequestData.satellites.Count != _rebelSatellites.rebelSatellitesPositionList.Count) { throw new Exception("Error, the number of satellites must be at least " + _rebelSatellites.rebelSatellitesPositionList.Count); } foreach (SatelliteData satelliteData in topSecretRequestData.satellites) { distancesFromSatellites.Add(satelliteData.distance); } return(distancesFromSatellites); }
/// <summary> /// This main method resolve the required conditions of the topsecret level 2 exercice. /// Ask for the methods created in exercice level 1 GetPosition and GetMessage /// </summary> /// <param name="allSatelites"></param> /// <returns></returns> public TopSecretResponseData GetImperialShipInformation(AllSatellitesData allSatelites) { //use the TopSecret exercice required response Data from the response. TopSecretResponseData topSecretResponseData = new TopSecretResponseData(); //Get Location ShipLocator shipLocator = new ShipLocator(); XYCoordinates shipLocation = shipLocator.GetLocation(allSatelites); topSecretResponseData.position.x = shipLocation.GetCoordinateX(); topSecretResponseData.position.y = shipLocation.GetCoordinateY(); ///Get Message MessageAssembler messageAssembler = new MessageAssembler(); List <List <string> > messagesFromSatellites = messageAssembler.GetMessagesListFromSatelliteData(allSatelites); topSecretResponseData.message = messageAssembler.GetMessage(messagesFromSatellites); return(topSecretResponseData); }