/// <summary> /// Return the transformed curve /// </summary> /// <param name="transformation"></param> /// <returns>the transformed curve</returns> public ICurve Transform(PlaneTransformation transformation) { Curve c = new Curve(segs.Count); foreach (ICurve s in segs) c.AddSegment(s.Transform(transformation)); return c; }
/// <summary> /// transforms the graph by the given matrix /// </summary> /// <param name="matrix">the matrix</param> public void Transform(PlaneTransformation matrix) { foreach (var node in Nodes) { node.Transform(matrix); } foreach (var edge in Edges) { edge.Transform(matrix); } // #if DEBUG && TEST_MSAGL // if (DebugCurves != null) // foreach (var dc in DebugCurves) // dc.Curve = dc.Curve.Transform(matrix); // #endif UpdateBoundingBox(); }
static internal GeometryGraph CreateAndLayoutGraph() { GeometryGraph graph = new GeometryGraph(); double width = 40; double height = 10; foreach (string id in "0 1 2 3 4 5 6 A B C D E F G a b c d e".Split(' ')) { DrawingUtilsForSamples.AddNode(id, graph, width, height); } graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("B"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("C"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("D"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("E"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("E"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("0"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("1"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("2"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("3"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("4"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("5"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("6"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("a"), graph.FindNodeByUserData("b"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("b"), graph.FindNodeByUserData("c"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("c"), graph.FindNodeByUserData("d"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("d"), graph.FindNodeByUserData("e"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("C"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("E"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("F"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("G"), graph.FindNodeByUserData("a"))); var settings = new SugiyamaLayoutSettings { Transformation = PlaneTransformation.Rotation(Math.PI / 2), EdgeRoutingSettings = { EdgeRoutingMode = EdgeRoutingMode.Spline } }; var layout = new LayeredLayout(graph, settings); layout.Run(); return(graph); }
static void TransformEdgeCurve(PlaneTransformation transformation, Edge e) { if (e.Curve != null) { e.Curve = e.Curve.Transform(transformation); var eg = e.EdgeGeometry; if (eg.SourceArrowhead != null) { eg.SourceArrowhead.TipPosition = transformation * eg.SourceArrowhead.TipPosition; } if (eg.TargetArrowhead != null) { eg.TargetArrowhead.TipPosition = transformation * eg.TargetArrowhead.TipPosition; } TransformUnderlyingPolyline(e, transformation); } }
private static void DumpScatterPlotOfDelaunayFacesAreaChange(string graphName, HashSet <Tuple <int, int, int> > proximityTriangles, GeometryGraph geomGraphOld, GeometryGraph geomGraph, string nameAddon) { Graph scatterPlot = new Graph(); for (int i = 0; i < proximityTriangles.Count; i++) { scatterPlot.AddNode(i.ToString()); } scatterPlot.CreateGeometryGraph(); int k = 0; foreach (var triangle in proximityTriangles) { Point a = geomGraphOld.Nodes[triangle.Item1].Center; Point b = geomGraphOld.Nodes[triangle.Item2].Center; Point c = geomGraphOld.Nodes[triangle.Item3].Center; Point d = geomGraph.Nodes[triangle.Item1].Center; Point e = geomGraph.Nodes[triangle.Item2].Center; Point f = geomGraph.Nodes[triangle.Item3].Center; double signOld = Point.SignedDoubledTriangleArea(a, b, c); double signNew = Point.SignedDoubledTriangleArea(d, e, f); var node = scatterPlot.FindNode(k.ToString()); k++; node.GeometryNode.BoundaryCurve = CurveFactory.CreateCircle(1, new Point(signOld, signNew)); if (signNew < 0) { node.Attr.FillColor = node.Attr.Color = Color.Red; } } scatterPlot.GeometryGraph.UpdateBoundingBox(); double w = scatterPlot.GeometryGraph.BoundingBox.Width; double h = scatterPlot.GeometryGraph.BoundingBox.Height; PlaneTransformation p = new PlaneTransformation( 200 / w, 0, 0, 0, 200 / h, 0); scatterPlot.GeometryGraph.Transform(p); scatterPlot.GeometryGraph.UpdateBoundingBox(); SvgGraphWriter.Write(scatterPlot, "cdt_area_change_" + graphName + nameAddon + ".svg"); }
private void RunLayout() { settings = settings ?? new SugiyamaLayoutSettings { Transformation = PlaneTransformation.Rotation(0 * Math.PI / 2), PackingMethod = PackingMethod.Columns, EdgeRoutingSettings = { Padding = 100, }, GroupSplit = 10, }; settings.EdgeRoutingSettings.EdgeRoutingMode = mode; var layout = new LayeredLayout(graph, settings); layout.Run(); }
private void SetGraphTransform() { //instead of setting transormation for graphics we are going to transform the geometry graph, just to test that GeometryGraph.Transform() works RectangleF clientRectangle = ClientRectangle; var gr = geometryGraph.BoundingBox; if (clientRectangle.Height > 1 && clientRectangle.Width > 1) { var scale = Math.Min(clientRectangle.Width * 0.9 / gr.Width, clientRectangle.Height * 0.9 / gr.Height); var g0 = (gr.Left + gr.Right) / 2; var g1 = (gr.Top + gr.Bottom) / 2; var c0 = (clientRectangle.Left + clientRectangle.Right) / 2; var c1 = (clientRectangle.Top + clientRectangle.Bottom) / 2; var dx = c0 - scale * g0; var dy = c1 - scale * g1; var planeTransformation = new PlaneTransformation(scale, 0, dx, 0, scale, dy); geometryGraph.Transform(planeTransformation); } }
public override void AfterVisitTree() { LayoutSettings = new SugiyamaLayoutSettings { Transformation = PlaneTransformation.Rotation(System.Math.PI), EdgeRoutingSettings = { EdgeRoutingMode = EdgeRoutingMode.Spline }, MinNodeHeight = 10, MinNodeWidth = 20, }; //LayoutSettings.NodeSeparation *= 2; Graph.LayoutAlgorithmSettings = LayoutSettings; foreach (Node n in Graph.Nodes) { Graph.GeometryGraph.Nodes.Add( new GeometryNode(CurveFactory.CreateRectangle(20, 10, new GeometryPoint()), n)); } foreach (Edge e in Graph.Edges) { GeometryNode source = Graph.FindGeometryNode(e.SourceNode.Id); GeometryNode target = Graph.FindGeometryNode(e.TargetNode.Id); Graph.GeometryGraph.Edges.Add(new GeometryEdge(source, target)); } Graph.GeometryGraph.UpdateBoundingBox(); using (Bitmap bmp = new Bitmap(1200, 1200, PixelFormat.Format32bppPArgb)) using (Graphics g = Graphics.FromImage(bmp)) { Rectangle rect = new Rectangle(0, 0, 1200, 1200); g.Clear(System.Drawing.Color.White); GraphDiagramUtil.SetGraphTransform(Graph.GeometryGraph, rect, g); LayeredLayout layout = new LayeredLayout(Graph.GeometryGraph, LayoutSettings); layout.Run(); GraphDiagramUtil.DrawFromGraph(rect, Graph.GeometryGraph, g); bmp.Save("graph.bmp", ImageFormat.Bmp); } }
/// <summary> /// transforms the graph by the given matrix /// </summary> /// <param name="matrix">the matrix</param> public void Transform(PlaneTransformation matrix) { foreach (var node in Nodes) { node.Transform(matrix); } foreach (var edge in Edges) { edge.Transform(matrix); } #if TEST_MSAGL && TEST_MSAGL if (DebugCurves != null) { foreach (var dc in DebugCurves) { dc.Curve = dc.Curve.Transform(matrix); } } #endif UpdateBoundingBox(); }
private static void DisplayGraph(Graph graph) { var settings = graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings; settings.Transformation = PlaneTransformation.Rotation(Math.PI / 2); Form form = new Form(); form.Width = 1024; form.Height = 768; GViewer viewer = new GViewer(); viewer.Graph = graph; form.SuspendLayout(); viewer.Dock = DockStyle.Fill; form.Controls.Add(viewer); form.ResumeLayout(); form.ShowDialog(); }
static internal GeometryGraph CreateAndLayoutGraph() { GeometryGraph graph = new GeometryGraph(); double width = 40; double height = 10; foreach (string id in "0 1 2 3 4 5 6 A B C D E F G a b c d e".Split(' ')) { AddNode(id, graph, width, height); } graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("B"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("C"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("D"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("E"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("E"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("0"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("1"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("2"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("3"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("4"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("5"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("6"), graph.FindNodeByUserData("F"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("a"), graph.FindNodeByUserData("b"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("b"), graph.FindNodeByUserData("c"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("c"), graph.FindNodeByUserData("d"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("d"), graph.FindNodeByUserData("e"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("A"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("B"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("C"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("D"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("E"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("F"), graph.FindNodeByUserData("a"))); graph.Edges.Add(new Edge(graph.FindNodeByUserData("G"), graph.FindNodeByUserData("a"))); var settings = new SugiyamaLayoutSettings(); settings.Transformation = PlaneTransformation.Rotation(Math.PI / 2); settings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.Spline; var layout = new LayeredLayout(graph, settings); layout.Run(); return(graph); // double w = 40; // double h = 10; // GeometryGraph graph = new GeometryGraph(); //columns // var col0 = new[] { "a", "b", "c" }; // var col1 = new[] { "d", "e", "f", "g" }; // var col2 = new[] { "k", "l", "m", "n" }; // var col3 = new[] { "w", "y", "z" }; // // var settings = new SugiyamaLayoutSettings(); // // foreach (var id in col0) // AddNode(id, graph, w, h); // foreach (var id in col1) // AddNode(id, graph, w, h); // foreach (var id in col2) // AddNode(id, graph, w, h); // foreach (var id in col3) // AddNode(id, graph, w, h); // //pinning columns // settings.PinNodesToSameLayer(col0.Select(s=>graph.FindNodeByUserData(s)).ToArray()); // settings.PinNodesToSameLayer(col1.Select(s => graph.FindNodeByUserData(s)).ToArray()); // settings.PinNodesToSameLayer(col2.Select(s => graph.FindNodeByUserData(s)).ToArray()); // settings.PinNodesToSameLayer(col3.Select(s => graph.FindNodeByUserData(s)).ToArray()); // // AddEdgesBetweenColumns(col0, col1, graph); // AddEdgesBetweenColumns(col1, col2, graph); // AddEdgesBetweenColumns(col2, col3, graph); //rotate layer to columns // graph.Transformation = PlaneTransformation.Rotation(Math.PI / 2); // settings.NodeSeparation = 5; // settings.LayerSeparation = 100; // var ll = new LayeredLayout(graph, settings); // ll.Run(); // return graph; }
int ProcessDotFile(string inputFile) { Graph graph; int i = CreateGraphFromDotFile(inputFile, out graph); graph.Attr.LayerDirection = GetLayerDirection(); if (i != 0) { return(i); } if (argsParser.OptionIsUsed("-nolayout") && GeometryIsPresent(graph)) { double nodeScale; bool scaling = argsParser.GetDoubleOptionValue("-scaleNodesBy", out nodeScale); if (scaling) { foreach (var node in graph.GeometryGraph.Nodes) { node.BoundaryCurve = node.BoundaryCurve.Transform(PlaneTransformation.ScaleAroundCenterTransformation(nodeScale, node.Center)); } graph.GeometryGraph.UpdateBoundingBox(); } double nodeLineWidth; if (argsParser.GetDoubleOptionValue("-nblw", out nodeLineWidth)) { foreach (var node in graph.Nodes) { node.Attr.LineWidth = nodeLineWidth; } graph.GeometryGraph.UpdateBoundingBox(); } } else { PrepareForOutput(graph); } var outputFile = Path.ChangeExtension(inputFile, ".svg"); string outputDir = argsParser.GetStringOptionValue(OutputDirOption); if (outputDir != null) { var name = Path.GetFileName(outputFile); if (name != null) { outputFile = Path.Combine(outputDir, name); } } SetConsolasFontAndSize(graph, 11); if (argsParser.OptionIsUsed(NoLabelsOption)) { RemoveLabelsFromGraph(graph); } using (var stream = File.Create(outputFile)) { var svgWriter = new SvgGraphWriter(stream, graph) { BlackAndWhite = argsParser.OptionIsUsed("-bw"), NodeSanitizer = AntiXss.HtmlAttributeEncode, AttrSanitizer = AntiXss.HtmlAttributeEncode, Precision = precision, AllowedToWriteUri = !argsParser.OptionIsUsed(NoUrls), IgnoreEdges = argsParser.OptionIsUsed("-noedges") }; svgWriter.Write(); DumpFileToConsole(outputFile); } if (msaglOutput) { outputFile = SetMsaglOutputFileName(inputFile); var geomGraph = graph.GeometryGraph; WriteGeomGraph(outputFile, geomGraph); } return(0); }
///<summary> ///</summary> ///<param name="transformation"></param> public void Transform(PlaneTransformation transformation) { BoundaryCurve = BoundaryCurve.Transform(transformation); }
private void Graph_GraphLayoutStarting(object sender, EventArgs e) { // I'd like to just call RemoveAllConstraints here, but it doesn't work. if (LayeredLayoutButton.IsChecked.Value) { Graph.Graph.LayoutAlgorithmSettings = new SugiyamaLayoutSettings(); var settings = Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings; if (InitialNodesButton.IsChecked.Value && InitialNodes != null) { // Declare all initial nodes to be above every other node. foreach (DNode nc in InitialNodes) { foreach (DNode nc2 in Graph.Nodes().Where(ec => !InitialNodes.Contains(ec as DNode))) { settings.AddUpDownConstraint(nc.GeometryNode, nc2.GeometryNode); } } } if (AspectRatioButton.IsChecked.Value && GraphContainer.ActualHeight != 0.0 && GraphContainer.ActualWidth != 0.0) { settings.AspectRatio = HorizontalLayoutButton.IsChecked.Value ? GraphContainer.ActualHeight / GraphContainer.ActualWidth : GraphContainer.ActualWidth / GraphContainer.ActualHeight; } if (HorizontalLayoutButton.IsChecked.Value) { (Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI / 2); } else { (Graph.Graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI); } settings.EdgeRoutingSettings.EdgeRoutingMode = (EdgeRoutingMode)typeof(EdgeRoutingMode).GetField((EdgeRoutingComboBox.SelectedItem as ComboBoxItem).Tag.ToString()).GetValue(null); int separation = 5; Int32.TryParse(BundlingSeparationTextBox.Text, out separation); settings.EdgeRoutingSettings.BundlingSettings = new BundlingSettings() { EdgeSeparation = separation }; } else { Graph.Graph.LayoutAlgorithmSettings = new MdsLayoutSettings(); var settings = Graph.Graph.LayoutAlgorithmSettings as MdsLayoutSettings; settings.ScaleX = 100.0; settings.ScaleY = 100.0; } }
public void GenerateTechs() { foreach (var instance in _ringInstances) { instance.ReturnToPool(); } _ringInstances.Clear(); foreach (var instance in _techInstances) { instance.ReturnToPool(); } _techInstances.Clear(); foreach (var instance in _linkInstances) { instance.ReturnToPool(); } _linkInstances.Clear(); foreach (var instance in _arrowInstances) { instance.ReturnToPool(); } _arrowInstances.Clear(); var graph = new GeometryGraph(); var settings = new SugiyamaLayoutSettings(); if (TestMode) { for (int i = 0; i < TechCount; i++) { var node = NewNode(i); graph.Nodes.Add(node); if (i > SeedTechs) { graph.Edges.Add(new Edge(graph.Nodes[Random.Range(max(0, i - RollingWindowSize), i - 1)], node)); } } foreach (var vertex in graph.Nodes.Where(v => !graph.Edges.Any(e => e.Source == v || e.Target == v))) { graph.Edges.Add(new Edge(vertex, graph.Nodes[Random.Range(0, TechCount - 1)])); } } else { var nodeMap = new Dictionary <BlueprintData, Node>(); foreach (var blueprint in Blueprints) { var node = NewNode(blueprint); nodeMap[blueprint] = node; graph.Nodes.Add(node); } foreach (var targetBlueprint in Blueprints) { foreach (var sourceBlueprint in Blueprints.Where(sb => targetBlueprint.Dependencies.Any(dep => sb.ID == dep))) { var edge = new Edge(nodeMap[sourceBlueprint], nodeMap[targetBlueprint]); graph.Edges.Add(edge); var splitName = sourceBlueprint.Name.Split(' '); if (splitName.Length > 1) { var nameStart = string.Join(" ", splitName.Take(splitName.Length - 1)); if (targetBlueprint.Name.StartsWith(nameStart)) { edge.Weight *= 10; } } } } } settings.BrandesThreshold = 9999; var islands = graph.GetClusteredConnectedComponents(); var islandMap = graph.Nodes.ToDictionary(n => n, n => islands.Find(c => c.Nodes.Any(cn => cn.UserData == n))); if (TestMode) { foreach (var island in islands) { foreach (var node in island.Nodes) { var region = GetRegion(island, node, DependencyAncestorDepth, DependencyDepth); while (Random.value < MultipleDependencyProbability && region.Count > 0) { var dependency = region[Random.Range(0, region.Count)]; graph.Edges.Add(new Edge(dependency.UserData as Node, node.UserData as Node)); region.Remove(dependency); } } } } var islandsBySize = islands.OrderByDescending(i => i.Nodes.Count); var largestIsland = islandsBySize.First(); foreach (var island in islandsBySize.Skip(1)) { settings.VerticalConstraints.SameLayerConstraints.Insert(new Tuple <Node, Node>( largestIsland.Nodes[Random.Range(0, largestIsland.Nodes.Count)].UserData as Node, island.Nodes[Random.Range(0, island.Nodes.Count)].UserData as Node)); } settings.PackingMethod = PackingMethod; settings.Transformation = PlaneTransformation.Rotation(PI); var layout = new LayeredLayout(graph, settings); layout.Run(); var positions = graph.Nodes.ToDictionary(n => n, n => (float2)n.Center); var islandCenters = islands.ToDictionary(i => i, i => i.Nodes.Aggregate(float2(0, 0), (total, v) => total + positions[v.UserData as Node]) / i.Nodes.Count); Rect bounds = Rect.MinMaxRect( positions.Values.Min(v => v.x), positions.Values.Min(v => v.y), positions.Values.Max(v => v.x), positions.Values.Max(v => v.y)); var tiers = Mathf.RoundToInt(graph.Nodes.Max(n => Rect.PointToNormalized(bounds, n.Center).y) / graph.Nodes.Min(n => { var normalized = Rect.PointToNormalized(bounds, n.Center); return(normalized.y > .001f ? normalized.y : 1); })); // var islandsBySize = islands.OrderByDescending(i => i.Nodes.Count); // var largestIsland = islandsBySize.First(); // foreach(var island in islandsBySize.Skip(1)) // settings.AddSameLayerNeighbors(largestIsland.Nodes.RandomElement().UserData as Node, island.Nodes.RandomElement().UserData as Node); // // layout = new LayeredLayout(graph, settings); // layout.Run(); positions = graph.Nodes.ToDictionary(n => n, n => (float2)n.Center); islandCenters = islands.ToDictionary(i => i, i => i.Nodes.Aggregate(float2(0, 0), (total, v) => total + positions[v.UserData as Node]) / i.Nodes.Count); bounds = Rect.MinMaxRect( positions.Values.Min(v => v.x), positions.Values.Min(v => v.y), positions.Values.Max(v => v.x), positions.Values.Max(v => v.y)); Debug.Log($"Generated {tiers} tiers of techs!"); var islandColors = islandCenters.ToDictionary( i => i.Key, i => Color.HSVToRGB(lerp(HueMin, HueMax, Rect.PointToNormalized(bounds, i.Value).x), Saturation, Brightness)); var islandFillMaterials = islandColors.ToDictionary(i => i.Key, i => { var mat = new Material(TechFillMaterial); var col = i.Value; col.a = FillOpacity; mat.SetColor("_TintColor", col); return(mat); }); var islandGlowMaterials = islandColors.ToDictionary(i => i.Key, i => { var mat = new Material(TechGlowMaterial); var col = i.Value; col.a = GlowOpacity; mat.SetColor("_TintColor", col); return(mat); }); var islandArrowMaterials = islandColors.ToDictionary(i => i.Key, i => { var mat = new Material(TechArrowMaterial); var col = i.Value; col.a = 1; mat.SetColor("_TintColor", col); return(mat); }); var islandLinkMaterials = islandColors.ToDictionary(i => i.Key, i => { var mat = new Material(TechLinkMaterial); var col = i.Value; col.a = 1; mat.SetColor("_TintColor", col); return(mat); }); if (Radial) { positions = positions.ToDictionary( kvp => kvp.Key, kvp => { var normalized = Rect.PointToNormalized(bounds, kvp.Value); var rads = normalized.x * (PI * 2 - PaddingRadians) + PaddingRadians / 2; return(float2(sin(rads), -cos(rads)) * ((normalized.y * tiers + StartTier + .5f) * LayerDistance) * Scale); }); } else { positions = positions.ToDictionary( kvp => kvp.Key, kvp => { var normalized = Rect.PointToNormalized(bounds, kvp.Value); return(float2( normalized.x * LayerDistance * tiers * (bounds.width / bounds.height), (normalized.y * tiers / 2 + StartTier + .5f) * LayerDistance)); }); } foreach (var vertex in graph.Nodes.Where(positions.ContainsKey)) { var tech = Tech.Instantiate <TechNode>(); tech.transform.position = (Vector2)positions[vertex]; tech.Label.text = $"{(TestMode ? ((int) vertex.UserData).ToString() : ((BlueprintData) vertex.UserData).ID.ToString().Substring(0,2))}"; var gradient = tech.Label.colorGradient; gradient.bottomLeft = gradient.bottomRight = islandColors[islandMap[vertex]]; tech.Label.colorGradient = gradient; tech.Icon.material.SetTexture("_MainTex", _icons[Random.Range(0, _icons.Length - 1)]); tech.Fill.material = islandFillMaterials[islandMap[vertex]]; tech.Glow.material = islandGlowMaterials[islandMap[vertex]]; if (!TestMode) { tech.Fill.GetComponent <ClickableCollider>().OnClick += (collider, data) => { PropertiesPanel.Clear(); var blueprint = (BlueprintData)vertex.UserData; PropertiesPanel.Title.text = blueprint.Name; PropertiesPanel.AddProperty("Research Time", () => $"{blueprint.ResearchTime:0.##} MH"); PropertiesPanel.AddProperty("Produces", () => $"{Context.Cache.Get<ItemData>(blueprint.Item).Name}"); PropertiesPanel.AddProperty("Production Quality", () => $"{Mathf.RoundToInt(blueprint.Quality * 100)}%"); PropertiesPanel.AddProperty("Production Time", () => $"{blueprint.ProductionTime:0.##} MH"); var ingredientsList = PropertiesPanel.AddList("Ingredients"); foreach (var ingredient in blueprint.Ingredients) { var ingredientData = Context.Cache.Get <ItemData>(ingredient.Key); ingredientsList.AddProperty(ingredientData.Name, () => ingredient.Value.ToString()); } ingredientsList.SetExpanded(true, true); var dependenciesList = PropertiesPanel.AddList("Dependencies"); foreach (var dependency in blueprint.Dependencies) { var dependencyBlueprint = Context.Cache.Get <BlueprintData>(dependency); dependenciesList.AddProperty(dependencyBlueprint.Name); } dependenciesList.SetExpanded(true, true); var descendantsList = PropertiesPanel.AddList("Descendants"); foreach (var descendant in Blueprints.Where(bp => bp.Dependencies.Any(dep => blueprint.ID == dep))) { descendantsList.AddProperty(descendant.Name); } descendantsList.SetExpanded(true, true); } } ; _techInstances.Add(tech.GetComponent <Prototype>()); } foreach (var edge in graph.Edges) { var link = RadialLink.Instantiate <LineRenderer>(); link.material = islandLinkMaterials[islandMap[edge.Source]]; link.positionCount = LinkPoints; var p1r = length(positions[edge.Source]); var p2r = length(positions[edge.Target]); var p1a = (atan2(positions[edge.Source].y, positions[edge.Source].x) + PI * 2.5f) % (PI * 2); var p2a = (atan2(positions[edge.Target].y, positions[edge.Target].x) + PI * 2.5f) % (PI * 2); var p1 = float2(sin(p1a) * p1r, -cos(p1a) * p1r); var p2 = float2(sin(p2a) * p2r, -cos(p2a) * p2r); var dist = length(p2 - p1); var distProp = (dist - LinkTargetDistance) / dist; var dir = new float2(); var lastPos = new float2(); link.SetPositions(Enumerable.Range(0, LinkPoints).Select(i => { var lerp = (float)i / (LinkPoints - 1) * distProp; var angle = math.lerp(p1a, p2a, (lerp)); var radius = math.lerp(p1r, p2r, lerp); var pos = Radial ? float2(sin(angle) * radius, -cos(angle) * radius) : math.lerp(positions[edge.Source], positions[edge.Target], lerp); dir = normalize(pos - lastPos); lastPos = pos; return((Vector3)float3(lastPos, LinkDepth)); }).ToArray()); _linkInstances.Add(link.GetComponent <Prototype>()); var arrow = Arrow.Instantiate <TechArrow>(); arrow.transform.position = new Vector3(lastPos.x, lastPos.y, ArrowDepth); arrow.transform.rotation = Quaternion.Euler(0, 0, atan2(dir.y, dir.x) * Mathf.Rad2Deg); arrow.Icon.material = islandArrowMaterials[islandMap[edge.Source]]; _arrowInstances.Add(arrow.GetComponent <Prototype>()); } if (Radial) { for (int i = 1; i <= tiers; i++) { var ring = Ring.Instantiate <LineRenderer>(); var ringPositions = new Vector3[Sections]; for (int s = 0; s < Sections; s++) { var rads = ((float)s / (Sections - 1)) * (PI * 2 - PaddingRadians) + PaddingRadians / 2; ringPositions[s] = new Vector3(sin(rads), -cos(rads), 0) * ((i + StartTier) * (LayerDistance) * Scale); ringPositions[s].z = RingDepth; } ring.positionCount = Sections; ring.SetPositions(ringPositions); var tierLerp = (float)i / (tiers - 1); ring.colorGradient = new Gradient { alphaKeys = new [] { new GradientAlphaKey(1, 0), new GradientAlphaKey(1, 1) }, colorKeys = Enumerable.Range(0, RingColorKeys).Select(x => { var ringLerp = (float)x / (RingColorKeys - 1); return(new GradientColorKey( Color.HSVToRGB(HueMin + (HueMax - HueMin) * ringLerp, lerp(RingInnerSaturation, RingOuterSaturation, tierLerp), lerp(RingInnerBrightness, RingOuterBrightness, tierLerp)), ringLerp)); }).ToArray() }; _ringInstances.Add(ring.GetComponent <Prototype>()); } } } }
private void SetRenderTransformWithoutRaisingEvents(PlaneTransformation value) { GraphCanvas.RenderTransform = new MatrixTransform(value[0, 0], value[0, 1], value[1, 0], value[1, 1], value[0, 2], value[1, 2]); }
void CreateAndLayoutAndDisplayGraph(object sender, ExecutedRoutedEventArgs ex) { try { // Graph graph = new Graph(); // // //graph.LayoutAlgorithmSettings=new MdsLayoutSettings(); // // graph.AddEdge("1", "2"); // graph.AddEdge("1", "3"); // var e = graph.AddEdge("4", "5"); // e.LabelText = "Some edge label"; // e.Attr.Color = Color.Red; // e.Attr.LineWidth *= 2; // // graph.AddEdge("4", "6"); // e = graph.AddEdge("7", "8"); // e.Attr.LineWidth *= 2; // e.Attr.Color = Color.Red; // // graph.AddEdge("7", "9"); // e = graph.AddEdge("5", "7"); // e.Attr.Color = Color.Red; // e.Attr.LineWidth *= 2; // // graph.AddEdge("2", "7"); // graph.AddEdge("10", "11"); // graph.AddEdge("10", "12"); // graph.AddEdge("2", "10"); // graph.AddEdge("8", "10"); // graph.AddEdge("5", "10"); // graph.AddEdge("13", "14"); // graph.AddEdge("13", "15"); // graph.AddEdge("8", "13"); // graph.AddEdge("2", "13"); // graph.AddEdge("5", "13"); // graph.AddEdge("16", "17"); // graph.AddEdge("16", "18"); // graph.AddEdge("16", "18"); // graph.AddEdge("19", "20"); // graph.AddEdge("19", "21"); // graph.AddEdge("17", "19"); // graph.AddEdge("2", "19"); // graph.AddEdge("22", "23"); // // e = graph.AddEdge("22", "24"); // e.Attr.Color = Color.Red; // e.Attr.LineWidth *= 2; // // e = graph.AddEdge("8", "22"); // e.Attr.Color = Color.Red; // e.Attr.LineWidth *= 2; // // graph.AddEdge("20", "22"); // graph.AddEdge("25", "26"); // graph.AddEdge("25", "27"); // graph.AddEdge("20", "25"); // graph.AddEdge("28", "29"); // graph.AddEdge("28", "30"); // graph.AddEdge("31", "32"); // graph.AddEdge("31", "33"); // graph.AddEdge("5", "31"); // graph.AddEdge("8", "31"); // graph.AddEdge("2", "31"); // graph.AddEdge("20", "31"); // graph.AddEdge("17", "31"); // graph.AddEdge("29", "31"); // graph.AddEdge("34", "35"); // graph.AddEdge("34", "36"); // graph.AddEdge("20", "34"); // graph.AddEdge("29", "34"); // graph.AddEdge("5", "34"); // graph.AddEdge("2", "34"); // graph.AddEdge("8", "34"); // graph.AddEdge("17", "34"); // graph.AddEdge("37", "38"); // graph.AddEdge("37", "39"); // graph.AddEdge("29", "37"); // graph.AddEdge("5", "37"); // graph.AddEdge("20", "37"); // graph.AddEdge("8", "37"); // graph.AddEdge("2", "37"); // graph.AddEdge("40", "41"); // graph.AddEdge("40", "42"); // graph.AddEdge("17", "40"); // graph.AddEdge("2", "40"); // graph.AddEdge("8", "40"); // graph.AddEdge("5", "40"); // graph.AddEdge("20", "40"); // graph.AddEdge("29", "40"); // graph.AddEdge("43", "44"); // graph.AddEdge("43", "45"); // graph.AddEdge("8", "43"); // graph.AddEdge("2", "43"); // graph.AddEdge("20", "43"); // graph.AddEdge("17", "43"); // graph.AddEdge("5", "43"); // graph.AddEdge("29", "43"); // graph.AddEdge("46", "47"); // graph.AddEdge("46", "48"); // graph.AddEdge("29", "46"); // graph.AddEdge("5", "46"); // graph.AddEdge("17", "46"); // graph.AddEdge("49", "50"); // graph.AddEdge("49", "51"); // graph.AddEdge("5", "49"); // graph.AddEdge("2", "49"); // graph.AddEdge("52", "53"); // graph.AddEdge("52", "54"); // graph.AddEdge("17", "52"); // graph.AddEdge("20", "52"); // graph.AddEdge("2", "52"); // graph.AddEdge("50", "52"); // graph.AddEdge("55", "56"); // graph.AddEdge("55", "57"); // graph.AddEdge("58", "59"); // graph.AddEdge("58", "60"); // graph.AddEdge("20", "58"); // graph.AddEdge("29", "58"); // graph.AddEdge("5", "58"); // graph.AddEdge("47", "58"); // // var subgraph = new Subgraph("subgraph 1"); // graph.RootSubgraph.AddSubgraph(subgraph); // subgraph.AddNode(graph.FindNode("47")); // subgraph.AddNode(graph.FindNode("58")); // // graph.AddEdge(subgraph.Id, "55"); // // var node = graph.FindNode("5"); // node.LabelText = "Label of node 5"; // node.Label.FontSize = 5; // node.Label.FontName = "New Courier"; // node.Label.FontColor = Microsoft.Msagl.Drawing.Color.Blue; // // node = graph.FindNode("55"); // // // graph.Attr.LayerDirection= LayerDirection.LR; // // graph.LayoutAlgorithmSettings.EdgeRoutingSettings.RouteMultiEdgesAsBundles = true; // //graph.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.SplineBundling; // //layout the graph and draw it Graph graph = new Graph(); graph.AddEdge("47", "58"); graph.AddEdge("70", "71"); var subgraph = new Subgraph("subgraph1"); subgraph.Label.Text = "Outer"; graph.RootSubgraph.AddSubgraph(subgraph); subgraph.AddNode(graph.FindNode("47")); subgraph.AddNode(graph.FindNode("58")); var subgraph2 = new Subgraph("subgraph2"); subgraph2.Label.Text = "Inner"; subgraph2.Attr.Color = Color.Black; subgraph2.Attr.FillColor = Color.Yellow; subgraph2.Attr.ClusterLabelMargin = LabelPlacement.Bottom; subgraph2.AddNode(graph.FindNode("70")); subgraph2.AddNode(graph.FindNode("71")); subgraph.AddSubgraph(subgraph2); graph.AddEdge("58", subgraph2.Id); graph.Attr.LayerDirection = LayerDirection.LR; //graph.LayoutAlgorithmSettings.EdgeRoutingSettings.EdgeRoutingMode = EdgeRoutingMode.Rectilinear; var global = (SugiyamaLayoutSettings)graph.LayoutAlgorithmSettings; var local = (SugiyamaLayoutSettings)global.Clone(); local.Transformation = PlaneTransformation.Rotation(-Math.PI / 2); subgraph2.LayoutSettings = local; // for Collapsing\Expanding global.ClusterSettings.Add(subgraph2, local); graphViewer.Graph = graph; } catch (Exception e) { MessageBox.Show(e.ToString(), "Load Failed", MessageBoxButton.OK, MessageBoxImage.Error); } }
void CreateGraphClustersBig(bool horizontal) { Graph graph = new Graph("clusters big"); void addCluster(string clusterId, params string[] nodeIds) { if (nodeIds.Length == 0) { nodeIds = new string[] { clusterId } } ; var cluster = new Subgraph(clusterId); foreach (var nodeId in nodeIds) { var node = new Node(clusterId + "." + nodeId); node.LabelText = nodeId; graph.AddNode(node); cluster.AddNode(node); } if (horizontal) { cluster.Attr.ClusterLabelMargin = Microsoft.Msagl.Core.Layout.LgNodeInfo.LabelPlacement.Right; } graph.RootSubgraph.AddSubgraph(cluster); } addCluster("Arabinose"); addCluster("Arabinose_control"); addCluster("Arabinose_growth"); addCluster("Auto"); addCluster("Auto_control"); addCluster("Auto_growth"); addCluster("Degrader"); addCluster("Degrader_control"); addCluster("Degrader_growth"); addCluster("Receivers", "Receiver0", "Receiver1", "Receiver2", "Receiver3"); addCluster("Receivers_control", "Receiver0_control", "Receiver1_control", "Receiver2_control", "Receiver3_control"); addCluster("Receivers_growth", "Receiver0_growth", "Receiver1_growth", "Receiver2_growth", "Receiver3_growth"); addCluster("Relays", "Relay1", "Relay2"); addCluster("Relays_control", "Relay1_control", "Relay2_control"); addCluster("Relays_growth", "Relay1_growth", "Relay2_growth"); addCluster("Standard"); addCluster("Standard_control"); addCluster("Standard_growth"); void addEdge(string sourceCluster, string sourceNode, string targetCluster, string targetNode) { graph.AddEdge(sourceNode == null ? sourceCluster : (sourceCluster + "." + sourceNode), targetNode == null ? targetCluster : (targetCluster + "." + targetNode)); } addEdge("Arabinose", "Arabinose", "Degrader", "Degrader"); addEdge("Arabinose_control", "Arabinose_control", "Arabinose", "Arabinose"); addEdge("Arabinose_control", "Arabinose_control", "Degrader_control", "Degrader_control"); addEdge("Arabinose_growth", "Arabinose_growth", "Arabinose_control", "Arabinose_control"); addEdge("Auto", null, "Standard", null); addEdge("Auto_control", "Auto_control", "Auto", "Auto"); addEdge("Auto_control", null, "Standard_control", null); addEdge("Auto_growth", "Auto_growth", "Auto_control", "Auto_control"); addEdge("Degrader_control", "Degrader_control", "Degrader", "Degrader"); addEdge("Degrader_growth", "Degrader_growth", "Degrader_control", "Degrader_control"); addEdge("Receivers", null, "Relays", null); addEdge("Receivers_control", null, "Relays_control", null); addEdge("Receivers_control", "Receiver0_control", "Receivers", "Receiver0"); addEdge("Receivers_control", "Receiver1_control", "Receivers", "Receiver1"); addEdge("Receivers_control", "Receiver2_control", "Receivers", "Receiver2"); addEdge("Receivers_control", "Receiver3_control", "Receivers", "Receiver3"); addEdge("Receivers_growth", "Receiver0_growth", "Receivers_control", "Receiver0_control"); addEdge("Receivers_growth", "Receiver1_growth", "Receivers_control", "Receiver1_control"); addEdge("Receivers_growth", "Receiver2_growth", "Receivers_control", "Receiver2_control"); addEdge("Receivers_growth", "Receiver3_growth", "Receivers_control", "Receiver3_control"); addEdge("Relays", null, "Degrader", null); addEdge("Relays_control", "Relay1_control", "Relays", "Relay1"); addEdge("Relays_control", "Relay2_control", "Relays", "Relay2"); addEdge("Relays_growth", "Relay1_growth", "Relays_control", "Relay1_control"); addEdge("Relays_growth", "Relay2_growth", "Relays_control", "Relay2_control"); addEdge("Standard", null, "Receivers", null); addEdge("Standard_control", null, "Receivers_control", null); addEdge("Standard_control", "Standard_control", "Standard", "Standard"); addEdge("Standard_growth", "Standard_growth", "Standard_control", "Standard_control"); if (horizontal) { (graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings).Transformation = PlaneTransformation.Rotation(Math.PI / 2.0); } gViewer.Graph = graph; this.propertyGrid1.SelectedObject = graph; } void CreateGraph() { #if TEST_MSAGL DisplayGeometryGraph.SetShowFunctions(); #endif //Graph graph = new Graph(); //graph.AddEdge("47", "58"); //graph.AddEdge("70", "71"); //var subgraph = new Subgraph("subgraph1"); //graph.RootSubgraph.AddSubgraph(subgraph); //subgraph.AddNode(graph.FindNode("47")); //subgraph.AddNode(graph.FindNode("58")); //var subgraph2 = new Subgraph("subgraph2"); //subgraph2.Attr.Color = Color.Black; //subgraph2.Attr.FillColor = Color.Yellow; //subgraph2.AddNode(graph.FindNode("70")); //subgraph2.AddNode(graph.FindNode("71")); //subgraph.AddSubgraph(subgraph2); //graph.AddEdge("58", subgraph2.Id); //graph.Attr.LayerDirection = LayerDirection.LR; //gViewer.Graph = graph; Graph graph = new Graph("graph"); //graph.LayoutAlgorithmSettings=new MdsLayoutSettings(); gViewer.BackColor = System.Drawing.Color.FromArgb(10, System.Drawing.Color.Red); /* * 4->5 * 5->7 * 7->8 * 8->22 * 22->24 */ graph.AddEdge("1", "2"); graph.AddEdge("1", "3"); var e = graph.AddEdge("4", "5"); e.Attr.Color = Color.Red; e.Attr.LineWidth *= 2; graph.LayerConstraints.AddUpDownVerticalConstraint(graph.FindNode("4"), graph.FindNode("5")); StraightenEdge(e, graph); e = graph.AddEdge("4", "6"); e.LabelText = "Changing label"; this.labelToChange = e.Label; e = graph.AddEdge("7", "8"); e.Attr.LineWidth *= 2; e.Attr.Color = Color.Red; StraightenEdge(e, graph); graph.AddEdge("7", "9"); e = graph.AddEdge("5", "7"); e.Attr.Color = Color.Red; e.Attr.LineWidth *= 2; StraightenEdge(e, graph); graph.AddEdge("2", "7"); graph.AddEdge("10", "11"); graph.AddEdge("10", "12"); graph.AddEdge("2", "10"); graph.AddEdge("8", "10"); graph.AddEdge("5", "10"); graph.AddEdge("13", "14"); graph.AddEdge("13", "15"); graph.AddEdge("8", "13"); graph.AddEdge("2", "13"); graph.AddEdge("5", "13"); graph.AddEdge("16", "17"); graph.AddEdge("16", "18"); graph.AddEdge("19", "20"); graph.AddEdge("19", "21"); graph.AddEdge("17", "19"); graph.AddEdge("2", "19"); graph.AddEdge("22", "23"); e = graph.AddEdge("22", "24"); e.Attr.Color = Color.Red; e.Attr.LineWidth *= 2; StraightenEdge(e, graph); e = graph.AddEdge("8", "22"); e.Attr.Color = Color.Red; e.Attr.LineWidth *= 2; StraightenEdge(e, graph); graph.AddEdge("20", "22"); graph.AddEdge("25", "26"); graph.AddEdge("25", "27"); graph.AddEdge("20", "25"); graph.AddEdge("28", "29"); graph.AddEdge("28", "30"); graph.AddEdge("31", "32"); graph.AddEdge("31", "33"); graph.AddEdge("5", "31"); graph.AddEdge("8", "31"); graph.AddEdge("2", "31"); graph.AddEdge("20", "31"); graph.AddEdge("17", "31"); graph.AddEdge("29", "31"); graph.AddEdge("34", "35"); graph.AddEdge("34", "36"); graph.AddEdge("20", "34"); graph.AddEdge("29", "34"); graph.AddEdge("5", "34"); graph.AddEdge("2", "34"); graph.AddEdge("8", "34"); graph.AddEdge("17", "34"); graph.AddEdge("37", "38"); graph.AddEdge("37", "39"); graph.AddEdge("29", "37"); graph.AddEdge("5", "37"); graph.AddEdge("20", "37"); graph.AddEdge("8", "37"); graph.AddEdge("2", "37"); graph.AddEdge("40", "41"); graph.AddEdge("40", "42"); graph.AddEdge("17", "40"); graph.AddEdge("2", "40"); graph.AddEdge("8", "40"); graph.AddEdge("5", "40"); graph.AddEdge("20", "40"); graph.AddEdge("29", "40"); graph.AddEdge("43", "44"); graph.AddEdge("43", "45"); graph.AddEdge("8", "43"); graph.AddEdge("2", "43"); graph.AddEdge("20", "43"); graph.AddEdge("17", "43"); graph.AddEdge("5", "43"); graph.AddEdge("29", "43"); graph.AddEdge("46", "47"); graph.AddEdge("46", "48"); graph.AddEdge("29", "46"); graph.AddEdge("5", "46"); graph.AddEdge("17", "46"); graph.AddEdge("49", "50"); graph.AddEdge("49", "51"); graph.AddEdge("5", "49"); graph.AddEdge("2", "49"); graph.AddEdge("52", "53"); graph.AddEdge("52", "54"); graph.AddEdge("17", "52"); graph.AddEdge("20", "52"); graph.AddEdge("2", "52"); graph.AddEdge("50", "52"); graph.AddEdge("55", "56"); graph.AddEdge("55", "57"); graph.AddEdge("58", "59"); graph.AddEdge("58", "60"); graph.AddEdge("20", "58"); graph.AddEdge("29", "58"); graph.AddEdge("5", "58"); graph.AddEdge("47", "58"); //ChangeNodeSizes(graph); //var sls = graph.LayoutAlgorithmSettings as SugiyamaLayoutSettings; //if (sls != null) //{ // sls.GridSizeByX = 30; // // sls.GridSizeByY = 0; //} //layout the graph and draw it gViewer.Graph = graph; this.propertyGrid1.SelectedObject = graph; }
public void Invalidate() { if (!Node.IsVisible) { foreach (var fe in FrameworkElements) { fe.Visibility = Visibility.Hidden; } return; } if (BoundaryCurveIsDirty) { BoundaryPath.Data = CreatePathFromNodeBoundary(); BoundaryCurveIsDirty = false; } if (LgNodeInfo != null) { double scale = 1; // LgNodeInfo != null && LgNodeInfo.Kind == LgNodeInfoKind.Satellite // ? LgNodeInfo.Scale // : 1; var planeTransform = PlaneTransformation.ScaleAroundCenterTransformation(scale, node.BoundingBox.Center); var transform = new MatrixTransform(planeTransform[0, 0], planeTransform[0, 1], planeTransform[1, 0], planeTransform[1, 1], planeTransform[0, 2], planeTransform[1, 2]); BoundaryPath.RenderTransform = transform; if (FrameworkElementOfNodeForLabel != null) { Common.PositionFrameworkElement(FrameworkElementOfNodeForLabel, node.GeometryNode.Center, scale); } } else { Common.PositionFrameworkElement(FrameworkElementOfNodeForLabel, Node.BoundingBox.Center, 1); } SetFillAndStroke(); if (subgraph == null) { return; } PositionTopMarginBorder((Cluster)subgraph.GeometryNode); double collapseBorderSize = GetCollapseBorderSymbolSize(); var collapseButtonCenter = GetCollapseButtonCenter(collapseBorderSize); Common.PositionFrameworkElement(collapseButtonBorder, collapseButtonCenter, 1); double w = collapseBorderSize * 0.4; collapseSymbolPath.Data = CreateCollapseSymbolPath(collapseButtonCenter + new Point(0, -w / 2), w); collapseSymbolPath.RenderTransform = ((Cluster)subgraph.GeometryNode).IsCollapsed ? new RotateTransform(180, collapseButtonCenter.X, collapseButtonCenter.Y) : null; topMarginRect.Visibility = collapseSymbolPath.Visibility = collapseButtonBorder.Visibility = Visibility.Visible; }
static ICurve ScaledCurve(double s, ICurve curve) { PlaneTransformation t = new PlaneTransformation(s, 0, 0, 0, s, 0); return(curve.Transform(t)); }
/// <summary> /// flips the y-coordinate /// </summary> public void TransformGraphByFlippingY() { var matrix = new PlaneTransformation(1, 0, 0, 0, -1, 0); _graph.GeometryGraph.Transform(matrix); }
public static SmoothedPolyline SmoothedPolylineTransform(SmoothedPolyline smoothedPolyline, PlaneTransformation m) { //GPoint delta = new GPoint(deltaVec.X, deltaVec.Y); SmoothedPolyline sm = smoothedPolyline.Clone(); //PlaneTransformation pt = new PlaneTransformation(m.M11, m.M12,m.OffsetX,m.M21, m.M22, m.OffsetY); for (Microsoft.Msagl.Core.Geometry.Site s = sm.HeadSite, s0 = sm.HeadSite; s != null; s = s.Next, s0 = s0.Next) { s.Point = m * s0.Point; } return(sm); }