/// <summary> /// Добавление граней и узлов, исходящих из конкретного узла /// </summary> /// <param name="node">Узел для вычисления исходящих граней</param> /// <param name="lines">Набор линий для поиска граней</param> void AddChildEdgesAndNodes(Node node, Line[] lines) { //TODO: Сделать обработку зацикливания foreach (Line line in lines) { if (line.StartPoint.IsEqualTo(node.Point)&&FindNode(line.EndPoint)==null) { AddNode(new Node(line.EndPoint, node.PathCostFromRoot+line.Length)); AddEdge(node, Nodes.Last(), line.ObjectId); } if (line.EndPoint.IsEqualTo(node.Point)&&FindNode(line.StartPoint)==null) { AddNode(new Node(line.StartPoint, node.PathCostFromRoot+line.Length)); AddEdge(node, Nodes.Last(), line.ObjectId); } } }
// G--A--D // | | | // E--B--F--C--H // // BFS: A B D G E F C H // ExpectedDFS: A B E G F C H D // ActualDFS: A B E G F C H D private static void Traverse(Node rootNode) { var stack = new Stack<Node>(); stack.Push(rootNode); rootNode.IsVisited = true; ProcessNode(rootNode); while (stack.Count != 0) { Node n = stack.Peek(); Node child = n.Children.FirstOrDefault(x => !x.IsVisited); if (child == null) { stack.Pop(); } else { child.IsVisited = true; ProcessNode(child); stack.Push(child); } } }
public static string[] Traverse(Node node) { var list = new List<string>(); Traverse(node, list, Enumerable.Empty<Node>()); return list.ToArray(); }
public static List<Node> WhereAreTheExists(Node node) { return node.Children(); }
public static object WhereAreWe(Node node) { return node.Name; }
public void AddNode(Node node) { _children.Add(node); }
private static void ProcessNode(Node node) { Console.Write(node.Name + " "); }
/// <summary> /// Поиск грани до родительского узла /// </summary> /// <param name="node">Узел, для которого ищем родителя</param> /// <returns>Грань, удовлетворяющая условию поиска, либо null, если не найдена</returns> Edge FindEdgeToParent(Node node) { return Edges.FirstOrDefault(n => n.EndNodeIndex == node.Index); }
/// <summary> /// Поиск родительского узла /// </summary> /// <param name="node">Узел, для которого ищем родителя</param> /// <returns>Узел, удовлетворяющий условию поиска, либо null, если не найден</returns> Node FindParent(Node node) { return FindEdgeToParent(node)!=null ? FindNode(FindEdgeToParent(node).BeginNodeIndex) : null; }
/// <summary> /// Поиск граней до дочерних узлов /// </summary> /// <param name="node">Узел, для которого ищем детей</param> /// <returns>Массив граней, удовлетворяющих условиям поиска</returns> Edge[] FindEdgesToChilds(Node node) { return (from Edge edge in Edges where edge.BeginNodeIndex==node.Index select edge).ToArray(); }
/// <summary> /// Поиск дочерних узлов /// </summary> /// <param name="node">Узел, для которого ищем детей</param> /// <returns>Массив узлов, удовлетворяющих условиям поиска</returns> Node[] FindChilds(Node node) { return (from Edge edge in FindEdgesToChilds(node) select FindNode(edge.EndNodeIndex)).ToArray(); }
/// <summary> /// Удаление узла. Этот метод пока не нужен - пропускаем /// </summary> /// <param name="node"></param> void DeleteNode(Node node) { }
/// <summary> /// Добавляет узел /// </summary> /// <param name="node">Узел для добавления. Свойство Index будет переопределено /// в соотвествии с зарегистрированными узлами в графе</param> void AddNode(Node node) { node.Index = Nodes.Count != 0 ? Nodes.Last().Index+1 : 0; Nodes.Add(node); if (FarestNode!=null) { if (node.PathCostFromRoot>FarestNode.PathCostFromRoot) { FarestNode = node; } } }
/// <summary> /// Добавление грани между узлами /// </summary> /// <param name="beginnode">Начальный узел</param> /// <param name="endnode">Конечный узел</param> /// <param name="geometry">Объект, представляющий грань</param> void AddEdge(Node beginnode, Node endnode, ObjectId geometry) { Edges.Add(new Edge(beginnode.Index, endnode.Index, geometry)); }