/// <summary> /// Retourne un Graph MSAGL comprenant tous les noeuds du graph, ou seulement les noeuds visités /// Le Graph MSAGL peut ensuite être affiché dans la vue /// </summary> /// <param name="only_visited">Inclure seulement les noeuds visité dans le visuel</param> /// <param name="edge_name">Indique si l'on doit afficher le nom de l'arc dans la visualisation</param> /// <returns>Graph MSAGL pouvant être afficher dans la vue</returns> private Graph getVisualGraphClassic(bool only_visited, bool edge_name) { Graph graph = new Graph(); ColorMap cmap = new ColorMap(Color.Yellow, Color.Red, heuristicMax(), heuristicMin()); foreach (CustomNode source in nodes.Values) { foreach (CustomEdge link in source.successors.Values) { CustomNode dest = link.dest; // Si l'on ne veut afficher que les noeuds visités if (only_visited && !dest.isVisited()) { continue; } Edge msagl_edge = graph.AddEdge(source.id, dest.id); Node msagl_source_node = msagl_edge.SourceNode; Node msagl_dest_node = msagl_edge.TargetNode; // On change le style des noeuds de départs et d'arrivés source.styleNode(msagl_source_node, cmap); dest.styleNode(msagl_dest_node, cmap); // On change le style de l'arc en fonction des noeuds de départs et d'arrivés link.styleEdge(msagl_edge, edge_name); } } return(graph); }
/// <summary> /// Retourne un Graph MSAGL avec les noeuds qui ne sont pas dans selected_path groupés /// </summary> /// <param name="only_visited">Inclure seulement les noeuds visité dans le visuel</param> /// <param name="edge_name">Booléen qui indique si on doit afficher le nom de l'arc</param> /// <param name="group_level">A partir de quel niveau de profondeur du selected path on doit grouper les noeuds</param> /// <returns>Graph MSAGL pouvant être afficher dans la vue</returns> private Graph getVisualGraphGrouped(bool only_visited, bool edge_name, int group_level) { Graph graph = new Graph(); ColorMap cmap = new ColorMap(Color.Yellow, Color.Red, heuristicMax(), heuristicMin()); HashSet <string> visited = new HashSet <string>(); // Parcours en largeur du graph pour afficher seulement les noeuds à un certains niveau de distance du selected path // Les autres noeuds sont groupés en un seul noeuds // L'entier dans le tuple correspond au niveau de distance du selected path Queue <Tuple <CustomNode, int> > queue = new Queue <Tuple <CustomNode, int> >(); queue.Enqueue(new Tuple <CustomNode, int>(root, 0)); while (queue.Any()) { Tuple <CustomNode, int> tuple = queue.Dequeue(); CustomNode actu = tuple.Item1; int profondeur = tuple.Item2; if (visited.Contains(actu.id)) { continue; } visited.Add(actu.id); Node msagl_source_node = graph.AddNode(actu.id); actu.styleNode(msagl_source_node, cmap, profondeur == group_level); foreach (CustomEdge edge in actu.successors.Values) { CustomNode dest = edge.dest; if (only_visited && !dest.isVisited()) { continue; } // On ajoute que les noeuds du selected path ou avec un profondeur inférieur à la profondeur max if (dest.in_selected_path || profondeur < group_level) { Edge msagl_edge = graph.AddEdge(actu.id, dest.id); edge.styleEdge(msagl_edge, edge_name); int next_profondeur = profondeur + 1; if (dest.in_selected_path) { next_profondeur = 0; } queue.Enqueue(new Tuple <CustomNode, int>(dest, next_profondeur)); } } } return(graph); }