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); }
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(); }