/// <summary> /// Indique si le graphe est dans le chemin choisi du 2ème graphe /// </summary> /// <returns></returns> protected bool inSelectedPathSecond() { CustomNodeMerged merged_source = (CustomNodeMerged)source; CustomNodeMerged merged_dest = (CustomNodeMerged)dest; return(merged_source.in_selected_path_second && merged_dest.in_selected_path_second && inSecondGraph); }
/// <summary> /// Indique si le graphe est dans le chemin choisi du 1er graphe /// </summary> /// <returns></returns> protected bool inSelectedPathFirst() { CustomNodeMerged merged_source = (CustomNodeMerged)source; CustomNodeMerged merged_dest = (CustomNodeMerged)dest; return(merged_source.in_selected_path && merged_dest.in_selected_path && inFirstGraph); }
/// <summary> /// Ajoute tous les arcs du noeuds passé en paramètre dans le graphe courrant /// Est utilisé par le constructeur du graph de fusion /// /// TODO : Ajouté aussi les predécesseurs, pour l'instant n'ajoute que les successeurs /// </summary> /// <param name="source">Noeud dont on souhaite ajouter tous les arcs</param> /// <param name="second_graph">Boolean qui indique si l'arc provient deu deuxième graphe</param> private void addMergedEdges(CustomNode source, bool second_graph) { CustomNodeMerged insertedNode = nodes[source.id]; // On ajoute les arcs partant du noeuds (via les successeurs) foreach (CustomEdge edge in source.successors.Values) { if (!insertedNode.successors.ContainsKey(edge.dest.id)) { CustomNodeMerged sourceNode = nodes[edge.source.id]; CustomNodeMerged destNode = nodes[edge.dest.id]; insertedNode.successors.Add(edge.dest.id, new CustomEdgeMerged() { name = edge.name, source = sourceNode, dest = destNode }); } CustomEdgeMerged insertedEdge = (CustomEdgeMerged)insertedNode.successors[edge.dest.id]; if (second_graph) { insertedEdge.inSecondGraph = true; } else { insertedEdge.inFirstGraph = true; } } }
/// <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">Afficher les nom des arcs 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(new Color(255, 255, 210, 210), Color.Red, realValueMax(), realValueMin()); ColorMap cmap_first = new ColorMap(new Color(255, 230, 255, 230), Color.Green, firstHeuristicMax(), firstheuristicMin()); ColorMap cmap_second = new ColorMap(new Color(255, 240, 240, 255), Color.Blue, secondHeuristicMax(), secondHeuristicMin()); foreach (CustomNodeMerged source in nodes.Values) { foreach (CustomEdge link in source.successors.Values) { CustomNodeMerged dest = (CustomNodeMerged)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; source.styleNodeMerged(msagl_source_node, cmap, cmap_first, cmap_second); dest.styleNodeMerged(msagl_dest_node, cmap, cmap_first, cmap_second); // 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> /// Indique si l'arc est dans le chemin final de n'importe quel graphe /// </summary> /// <returns>Booleen</returns> protected override bool inSelectedPath() { CustomNodeMerged merged_source = (CustomNodeMerged)source; CustomNodeMerged merged_dest = (CustomNodeMerged)dest; return((merged_source.in_selected_path && merged_dest.in_selected_path && inFirstGraph) || (merged_source.in_selected_path_second && merged_dest.in_selected_path_second && inSecondGraph)); }
/// <summary> /// Indique si cet arc est dans le chemin choisi des 2 graphes /// </summary> /// <returns>Booleen</returns> protected bool selectedPathBothGraph() { CustomNodeMerged merged_source = (CustomNodeMerged)source; CustomNodeMerged merged_dest = (CustomNodeMerged)dest; return(inBothGraph() && merged_source.in_selected_path && merged_dest.in_selected_path && merged_source.in_selected_path_second && merged_dest.in_selected_path_second); }
/// <summary> /// Ajoute le noeud passé en paramètre dans le graphe courrant /// Est utilisé par le constructeur du graph de fusion /// </summary> /// <param name="node">Node à ajouter au gaphe courrant</param> /// <param name="second_graph">Boolean qui indique si c'est un noeuds du second graphe</param> private void addMergedNode(CustomNode node, bool second_graph) { if (!nodes.ContainsKey(node.id)) { nodes.Add(node.id, new CustomNodeMerged(node.id)); } CustomNodeMerged insertedNode = nodes[node.id]; insertedNode.initFromNode(node, second_graph); // Si c'est le premier noeud qu'on ajoute, c'est la racine if (nodes.Values.Count == 1) { root = insertedNode; } }
/// <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">Afficher les nom des arcs dans la visualisation</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(new Color(255, 255, 210, 210), Color.Red, realValueMax(), realValueMin()); ColorMap cmap_first = new ColorMap(new Color(255, 230, 255, 230), Color.Green, firstHeuristicMax(), firstheuristicMin()); ColorMap cmap_second = new ColorMap(new Color(255, 240, 240, 255), Color.Blue, secondHeuristicMax(), secondHeuristicMin()); 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 <CustomNodeMerged, int> > queue = new Queue <Tuple <CustomNodeMerged, int> >(); queue.Enqueue(new Tuple <CustomNodeMerged, int>(root, 0)); while (queue.Any()) { Tuple <CustomNodeMerged, int> tuple = queue.Dequeue(); CustomNodeMerged 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); if (profondeur == group_level) { actu.styleNodeMergedGrouped(msagl_source_node, cmap, cmap_first, cmap_second); } else { actu.styleNodeMerged(msagl_source_node, cmap, cmap_first, cmap_second); } foreach (CustomEdge edge in actu.successors.Values) { CustomNodeMerged dest = (CustomNodeMerged)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.inSelectedPath() || 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.inSelectedPath()) { next_profondeur = 0; } queue.Enqueue(new Tuple <CustomNodeMerged, int>(dest, next_profondeur)); } } } return(graph); }