public NetworkData(NodeNetworkCopy network, Node from, Node to, Node end1, Node end2) { Network = network; From = from; To = to; End1 = end1; End2 = end2; }
/// <summary> /// Adds a new <see cref="NodeNetworkCopy"/> to all windows so it can be reviewed /// </summary> public void AddNetworkResult(string name, NodeNetworkCopy network, Node from, Node to, Tuple <Node, Node> end) { _networks.Add(name, new NetworkData(network, from, to, end.Item1, end.Item2)); Instance.Dispatcher.Invoke(() => { Instance.ListBoxResults.Items.Add(name); Instance.ListBoxResults.Items.Add(new ListBoxItem { Content = "", IsEnabled = false }); }); }
private static Node FindNextNodeOnBestRoute(ref NodeNetworkCopy network, Node endNode) { var currentNode = network.Nodes.Single(n => n.Equals(endNode)); var previousNode = currentNode; while (currentNode.Value > 0.0) { var connectedNodes = network.Links .Where(l => l.NodeA.Equals(currentNode) || l.NodeB.Equals(currentNode)) .Select(l => l.NodeA.Equals(currentNode) ? l.NodeB : l.NodeA) .ToList(); var bestNode = connectedNodes .OrderBy(n => n.Value) .First(); previousNode = currentNode; currentNode = bestNode; #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult($"DY{_debuggerIndex}#{currentNode.Value}", network, previousNode, currentNode); #endif } return(previousNode); }
private static void AssignNodeValues(ref NodeNetworkCopy network, ref Node startNode) { if (startNode.Value == null) { startNode.Value = 0.0; network.Nodes[network.Nodes.ToList().IndexOf(startNode)].Value = 0.0; } var node = startNode; var connectedLinks = network.Links .Where(l => l.NodeA.Equals(node) || l.NodeB.Equals(node)) .ToList(); foreach (var l in connectedLinks) { var toNode = l.NodeA.Equals(startNode) ? l.NodeB : l.NodeA; if (toNode.Value != null && toNode.Value <= startNode.Value + l.Distance) { continue; } toNode.Value = startNode.Value + l.Distance; AssignNodeValues(ref network, ref toNode); } }
private static Node CalculatePathNextNode(long callerId, ref NodeNetworkCopy network, ref Node startNode, ref Node endNode, Destination endDestination) { var openNodes = new List <ConnectedNode> { new ConnectedNode(endNode) }; var closedNodes = new List <ConnectedNode>(); ConnectedNode lastNode = null; var updateIndex = 0; while (true) { // propogate var thisNode = openNodes.First(); openNodes.Remove(thisNode); closedNodes.Add(thisNode); var neighbours = network.Links .Where(l => l.NodeA.Equals(thisNode) || l.NodeB.Equals(thisNode)) .Select(l => l.NodeA.Equals(thisNode) ? new ConnectedNode(l.NodeB) : new ConnectedNode(l.NodeA)) .ToList(); // calculate var foundEnd = false; foreach (var n in neighbours) { if (closedNodes.SingleOrDefault(cn => cn.Equals(n)) != null) { continue; } if (n.Equals(startNode)) { foundEnd = true; lastNode = n; } n.ConnectedTo = thisNode; n.Value = Math.Sqrt(Math.Pow((n.PositionX - startNode.PositionX), 2) + Math.Pow((n.PositionY - startNode.PositionY), 2)); network.Nodes.Single(nn => nn.Equals(n)).Value = n.Value; #if DEBUG AlgorithmDebuggerWindow.Instance.AddNodeUpdateResult($"AS{_debuggerIndex}${updateIndex++}", network, n, thisNode); #endif openNodes.Add(n); } if (foundEnd) { break; } // sort openNodes = openNodes.OrderBy(n => n.Value).ToList(); // info #if DEBUG AlgorithmDebuggerWindow.Instance.AddNetworkResult($"AS{_debuggerIndex}#{openNodes.First().Value}", network, thisNode, openNodes.First()); #endif } var roadX = (startNode.PositionX - lastNode.ConnectedTo.PositionX) / 2.0 + lastNode.ConnectedTo.PositionX; var roadY = (startNode.PositionY - lastNode.ConnectedTo.PositionY) / 2.0 + lastNode.ConnectedTo.PositionY; var result = new Destination { Location = new Vector(lastNode.ConnectedTo.PositionX, lastNode.ConnectedTo.PositionY), Road = GPSSystem.NearestRoad(new Vector(roadX, roadY)) }; if (_calculationCache.ContainsKey(callerId)) { _calculationCache.Remove(callerId); } _calculationCache.Add(callerId, new Tuple <Destination, List <ConnectedNode> >(endDestination, closedNodes)); // find next node return(lastNode.ConnectedTo); }
public void AddNodeUpdateResult(string name, NodeNetworkCopy network, Node target, Node invoker = null) { _networks.Add(name, new NodeUpdateData(network, target, invoker)); Instance.Dispatcher.Invoke(() => { Instance.ListBoxResults.Items.Add(name); }); }
/// <summary> /// Adds a step of the algorithm to all windows so it can be reviewed /// </summary> public void AddNetworkResult(string name, NodeNetworkCopy network, Node from, Node to) { _networks.Add(name, new AlgoStepData(network, from, to)); Instance.Dispatcher.Invoke(() => { Instance.ListBoxResults.Items.Add(name); }); }
public NodeUpdateData(NodeNetworkCopy network, Node target, Node invoker = null) { Network = network; Target = target; Invoker = invoker; }
public AlgoStepData(NodeNetworkCopy network, Node from, Node to) { Network = network; From = from; To = to; }