public Destination Calculate(long callerId, Destination carDestination, Destination endDestination) { var network = NodeNetwork.NodeNetwork.GetInstance(); var startNode = new Node(GPSSystem.FindIntersection(carDestination.Location).Location); var endNodes = AlgorithmTools.IntersectionTupleToNodeTuple( AlgorithmTools.GetIntersectionOrderForRoadSide(endDestination.Road, endDestination.Location)); if (startNode.Equals(endNodes.Item1)) { #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult(_debuggerIndex++.ToString(), network, startNode, endNodes.Item2, endNodes); #endif return(endDestination); } AssignNodeValues(ref network, ref startNode); var nextNode = FindNextNodeOnBestRoute(ref network, endNodes.Item1); #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult("DY" + _debuggerIndex++, network, startNode, nextNode, endNodes); #endif var roadX = (startNode.PositionX - nextNode.PositionX) / 2.0 + nextNode.PositionX; var roadY = (startNode.PositionY - nextNode.PositionY) / 2.0 + nextNode.PositionY; return(new Destination { Location = new Vector(nextNode.PositionX, nextNode.PositionY), Road = GPSSystem.NearestRoad(new Vector(roadX, roadY)) }); }
public Destination Calculate(long callerId, Destination carDestination, Destination endDestination) { var network = NodeNetwork.NodeNetwork.GetInstance(); var startNode = new Node(GPSSystem.FindIntersection(carDestination.Location).Location); var endNodes = AlgorithmTools.IntersectionTupleToNodeTuple( AlgorithmTools.GetIntersectionOrderForRoadSide(endDestination.Road, endDestination.Location)); Node nextNode; double roadX, roadY; if (startNode.Equals(endNodes.Item1)) { #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult(_debuggerIndex++.ToString(), network, startNode, endNodes.Item2, endNodes); #endif return(endDestination); } if (_calculationCache.ContainsKey(callerId)) { var tuple = _calculationCache[callerId]; if (tuple.Item1.Equals(endDestination)) { var path = tuple.Item2; var thisNode = path.Single(n => n.Equals(startNode)); nextNode = thisNode.ConnectedTo; #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult(_debuggerIndex++.ToString(), network, startNode, nextNode, endNodes); #endif roadX = (startNode.PositionX - nextNode.PositionX) / 2.0 + nextNode.PositionX; roadY = (startNode.PositionY - nextNode.PositionY) / 2.0 + nextNode.PositionY; return(new Destination { Location = new Vector(nextNode.PositionX, nextNode.PositionY), Road = GPSSystem.NearestRoad(new Vector(roadX, roadY)) }); } _calculationCache.Remove(callerId); } var endNode = endNodes.Item1; nextNode = CalculatePathNextNode(callerId, ref network, ref startNode, ref endNode, endDestination); #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult("AS" + _debuggerIndex++, network, startNode, nextNode, endNodes); #endif roadX = (startNode.PositionX - nextNode.PositionX) / 2.0 + nextNode.PositionX; roadY = (startNode.PositionY - nextNode.PositionY) / 2.0 + nextNode.PositionY; return(new Destination { Location = new Vector(nextNode.PositionX, nextNode.PositionY), Road = GPSSystem.NearestRoad(new Vector(roadX, roadY)) }); }