Ejemplo n.º 1
0
        private static IBidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge> BuildHierarchicalGraph(IUndirectedGraph <Cluster <Variety>, ClusterEdge <Variety> > tree)
        {
            var graph = new BidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge>();
            var root  = new HierarchicalGraphVertex(0);

            graph.AddVertex(root);
            GenerateHierarchicalVertices(graph, root, tree, null, tree.GetCenter());
            return(graph);
        }
Ejemplo n.º 2
0
        private void HighlightSubtree(HierarchicalGraphVertex vertex, bool highlight)
        {
            if (vertex.IsCluster)
            {
                Line line = _clusterVertices[vertex];
                line.Stroke = highlight ? Brushes.Blue : Brushes.Black;
            }
            else
            {
                Border border = _varietyVertices[vertex];
                border.BorderBrush = highlight ? Brushes.Blue : Brushes.Transparent;
            }

            foreach (HierarchicalGraphEdge edge in Graph.OutEdges(vertex))
            {
                Line line = _edges[edge];
                line.Stroke = highlight ? Brushes.Blue : Brushes.Black;
                HighlightSubtree(edge.Target, highlight);
            }
        }
Ejemplo n.º 3
0
        private static IBidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge> BuildHierarchicalGraph(IUndirectedGraph <Cluster <Variety>, ClusterEdge <Variety> > tree)
        {
            var graph = new BidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge>();
            var root  = new HierarchicalGraphVertex(0);

            graph.AddVertex(root);
            if (tree.VertexCount > 2)
            {
                GenerateHierarchicalVertices(graph, root, tree, null, tree.GetCenter());
            }
            else
            {
                foreach (Cluster <Variety> cluster in tree.Vertices)
                {
                    GenerateHierarchicalVertices(graph, root, tree, null, cluster);
                }
            }

            return(graph);
        }
Ejemplo n.º 4
0
        private IEnumerable <HierarchicalGraphEdge> GetEdges(HierarchicalGraphVertex vertex)
        {
            IEnumerable <HierarchicalGraphEdge> inEdges;

            if (Graph.TryGetInEdges(vertex, out inEdges))
            {
                foreach (HierarchicalGraphEdge edge in inEdges)
                {
                    yield return(edge);
                }
            }

            IEnumerable <HierarchicalGraphEdge> outEdges;

            if (Graph.TryGetOutEdges(vertex, out outEdges))
            {
                foreach (HierarchicalGraphEdge edge in outEdges)
                {
                    yield return(edge);
                }
            }
        }
Ejemplo n.º 5
0
 private static void GenerateHierarchicalVertices(BidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge> graph, HierarchicalGraphVertex vertex,
                                                  IUndirectedGraph <Cluster <Variety>, ClusterEdge <Variety> > tree, Cluster <Variety> parent, Cluster <Variety> cluster)
 {
     foreach (ClusterEdge <Variety> edge in tree.AdjacentEdges(cluster).Where(e => e.GetOtherVertex(cluster) != parent))
     {
         Cluster <Variety> target = edge.GetOtherVertex(cluster);
         double            depth  = vertex.Depth + edge.Length;
         var newVertex            = target.DataObjects.Count == 1 ? new HierarchicalGraphVertex(target.DataObjects.First(), depth) : new HierarchicalGraphVertex(depth);
         graph.AddVertex(newVertex);
         graph.AddEdge(new HierarchicalGraphEdge(vertex, newVertex, edge.Length));
         GenerateHierarchicalVertices(graph, newVertex, tree, cluster, target);
     }
 }
Ejemplo n.º 6
0
 private static void GenerateHierarchicalVertices(BidirectionalGraph <HierarchicalGraphVertex, HierarchicalGraphEdge> graph, HierarchicalGraphVertex vertex,
                                                  IBidirectionalGraph <Cluster <Variety>, ClusterEdge <Variety> > tree, Cluster <Variety> cluster)
 {
     foreach (ClusterEdge <Variety> edge in tree.OutEdges(cluster))
     {
         double depth     = vertex.Depth + edge.Length;
         var    newVertex = edge.Target.DataObjects.Count == 1 ? new HierarchicalGraphVertex(edge.Target.DataObjects.First(), depth) : new HierarchicalGraphVertex(depth);
         graph.AddVertex(newVertex);
         graph.AddEdge(new HierarchicalGraphEdge(vertex, newVertex, edge.Length));
         GenerateHierarchicalVertices(graph, newVertex, tree, edge.Target);
     }
 }
Ejemplo n.º 7
0
        private void ProcessVertex(Dictionary <HierarchicalGraphVertex, Point> positions, double tickWidth, double maxDepth, HierarchicalGraphVertex vertex)
        {
            double miny  = double.MaxValue;
            double maxy  = 0;
            double minx  = double.MaxValue;
            double maxx  = 0;
            int    count = 0;

            foreach (HierarchicalGraphEdge edge in GetEdges(vertex))
            {
                Point p;
                if (!positions.TryGetValue(edge.GetOtherVertex(vertex), out p))
                {
                    continue;
                }

                miny = Math.Min(p.Y, miny);
                maxy = Math.Max(p.Y, maxy);

                minx = Math.Min(p.X, minx);
                maxx = Math.Max(p.X, maxx);
                count++;
            }

            if (count >= Graph.Degree(vertex) - 1)
            {
                //double x = originx + (tickWidth * (((offset + vertex.Depth) * 100) / maxDepth));
                double tx = 0;
                if (maxDepth > 0)
                {
                    tx = tickWidth * ((vertex.Depth * 100) / maxDepth);
                }
                double x = OriginX + tx;
                double y = (maxy + miny) / 2;

                var vertexLine = new Line {
                    X1 = x, Y1 = miny - 1, X2 = x, Y2 = maxy + 1, Stroke = Brushes.Black, StrokeThickness = 2, DataContext = vertex
                };
                vertexLine.MouseEnter += vertexLine_MouseEnter;
                vertexLine.MouseLeave += vertexLine_MouseLeave;
                Children.Add(vertexLine);
                _clusterVertices[vertex] = vertexLine;

                foreach (HierarchicalGraphEdge edge in GetEdges(vertex))
                {
                    Point p;
                    if (!positions.TryGetValue(edge.GetOtherVertex(vertex), out p))
                    {
                        continue;
                    }
                    var edgeLine = new Line {
                        X1 = p.X - 1, Y1 = p.Y, X2 = x + 1, Y2 = p.Y, Stroke = Brushes.Black, StrokeThickness = 2, DataContext = edge, ToolTip = string.Format("{0:p}", edge.Length)
                    };
                    edgeLine.MouseEnter += edgeLine_MouseEnter;
                    edgeLine.MouseLeave += edgeLine_OnMouseLeave;
                    Children.Add(edgeLine);
                    _edges[edge] = edgeLine;
                }

                positions[vertex] = new Point(x, y);
            }
        }