示例#1
0
        List <Graphs.Vertex> AddLine(List <Graphs.Vertex> vertices, List <Graphs.Edge> edges, List <Graphs.Vertex> previousLine, int n, double r)
        {
            var x = 0.15;
            var y = 0.05;

            if (previousLine != null)
            {
                x = previousLine[0].X + r / 2;
                y = previousLine[0].Y + r * Math.Sqrt(3) / 2.0;
            }

            var line = new List <Graphs.Vertex>();

            for (int j = 0; j < n; j++)
            {
                var v = new Graphs.Vertex(x + r * j, y);

                vertices.Add(v);
                line.Add(v);

                if (j > 0)
                {
                    edges.Add(new Graphs.Edge(v, line[j - 1]));
                }

                if (previousLine != null)
                {
                    edges.Add(new Graphs.Edge(v, previousLine[j]));
                    if (j + 1 < n)
                    {
                        edges.Add(new Graphs.Edge(v, previousLine[j + 1]));
                    }
                }
            }

            return(line);
        }
示例#2
0
        private void ReleaseEdge(object sender, MouseButtonEventArgs args)
        {
            Contract.Assert(!args.Handled);
            Contract.Assert(sender != null);
            Contract.Assert(_source != null);

            var vertex = sender as Vertex;

            if (vertex != null)
            {
                String sourceName = (String)_source.GetValue(NameProperty),
                       sinkName   = (String)vertex.GetValue(NameProperty);

                if (GetValue(GraphProperty) is DirectedWeightedGraph)
                {
                    var           g      = (DirectedWeightedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new DirectedWeightedEdge(source, sink, 0); // нужно сделать вызов диалога задания веса
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }

                if (GetValue(GraphProperty) is DirectedGraph)
                {
                    var           g      = (DirectedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new DirectedEdge(source, sink);
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }

                if (GetValue(GraphProperty) is UndirectedGraph)
                {
                    var           g      = (UndirectedGraph)GetValue(GraphProperty);
                    Graphs.Vertex source = g.Vertices.Single(v => v.Name == sourceName),
                                  sink   = g.Vertices.Single(v => v.Name == sinkName);
                    var e  = new UndirectedEdge(source, sink);
                    var ed = g[source, sink];
                    if (ed == null)
                    {
                        g.AddEdge(e);
                    }
                    else
                    {
                        g.RemoveEdge(ed);
                    }
                }
            }

            LayoutRoot.Children.Remove(_arrow);
            _arrow = null;
            LayoutRoot.MouseMove -= DirectEdge;
            foreach (var v in LayoutRoot.Children)
            {
                v.MouseLeftButtonUp -= ReleaseEdge;
            }
            LayoutRoot.ReleaseMouseCapture();
        }