示例#1
0
 /// <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);
                }
            }
        }
示例#3
0
 public static string[] Traverse(Node node)
 {
     var list = new List<string>();
     Traverse(node, list, Enumerable.Empty<Node>());
     return list.ToArray();
 }
示例#4
0
 public static List<Node> WhereAreTheExists(Node node)
 {
     return node.Children();
 }
示例#5
0
 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 + " ");
 }
示例#8
0
 /// <summary>
 /// Поиск грани до родительского узла
 /// </summary>
 /// <param name="node">Узел, для которого ищем родителя</param>
 /// <returns>Грань, удовлетворяющая условию поиска, либо null, если не найдена</returns>
 Edge FindEdgeToParent(Node node)
 {
     return Edges.FirstOrDefault(n => n.EndNodeIndex == node.Index);
 }
示例#9
0
 /// <summary>
 /// Поиск родительского узла
 /// </summary>
 /// <param name="node">Узел, для которого ищем родителя</param>
 /// <returns>Узел, удовлетворяющий условию поиска, либо null, если не найден</returns>
 Node FindParent(Node node)
 {
     return FindEdgeToParent(node)!=null ? FindNode(FindEdgeToParent(node).BeginNodeIndex) : null;
 }
示例#10
0
 /// <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();
 }
示例#11
0
 /// <summary>
 /// Поиск дочерних узлов
 /// </summary>
 /// <param name="node">Узел, для которого ищем детей</param>
 /// <returns>Массив узлов, удовлетворяющих условиям поиска</returns>
 Node[] FindChilds(Node node)
 {
     return
         (from Edge edge in FindEdgesToChilds(node)
          select FindNode(edge.EndNodeIndex)).ToArray();
 }
示例#12
0
 /// <summary>
 /// Удаление узла. Этот метод пока не нужен - пропускаем
 /// </summary>
 /// <param name="node"></param>
 void DeleteNode(Node node)
 {
 }
示例#13
0
 /// <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;
         }
     }
 }
示例#14
0
 /// <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));
 }