private ProximityOverlapRemoval RunOverlapRemoval(GeometryGraph graphCopy, GeometryGraph graphOriginal, HashSet <Tuple <int, int> > proximityEdges, HashSet <Tuple <int, int, int> > proximityTriangles, List <Tuple <string, double> > statistics, OverlapRemovalSettings settings) { ProximityOverlapRemoval prism = new ProximityOverlapRemoval(graphCopy); prism.Settings = settings; Timer timer = new Timer(); timer.Start(); prism.RemoveOverlaps(); timer.Stop(); var cpuTimeSpan = TimeSpan.FromSeconds(timer.Duration); var statCpuTime = Tuple.Create("CPUTime", cpuTimeSpan.TotalSeconds); var statIterations = Tuple.Create("Iterations", (double)prism.LastRunIterations); var statEdgeLength = Statistics.Statistics.EdgeLengthDeviation(graphOriginal, graphCopy, proximityEdges); var statProcrustes = Statistics.Statistics.ProcrustesStatistics(graphOriginal.Nodes.Select(v => v.Center).ToList(), graphCopy.Nodes.Select(v => v.Center).ToList()); var statTriangleOrient = Statistics.Statistics.TriangleOrientation(graphOriginal, graphCopy, proximityTriangles); var statArea = Statistics.Statistics.Area(graphCopy); statistics.Add(statCpuTime); statistics.Add(statIterations); statistics.Add(statEdgeLength); statistics.Add(statProcrustes); statistics.Add(statArea); statistics.Add(statTriangleOrient); return(prism); }
/// <summary> /// generate and load tiles /// </summary> public void GenerateTiles() { var timer = new Timer(); timer.Start(); var renderTransform = _graphCanvas.RenderTransform.Clone(); bool normalFlow = false; try { Debug.Assert(!string.IsNullOrEmpty(TileDirectory)); Clear(); CreateTileDirectoryIfNeededAndRemoveEverythingUnderIt(); MakeAllNodesVisible(); UpdateAllNodeBorders(); RemoveAllVisibleRails(); var fitFactor = GetFitFactor(new Size(800, 800)); var w = GeomGraph.Width * fitFactor; var h = GeomGraph.Height * fitFactor; var renderBitmap = new RenderTargetBitmap((int)w, (int)h, 96, 96, PixelFormats.Pbgra32); var tileList=new List<Tuple<int, int>> {new Tuple<int, int>(0, 0)}; var nextLevelTileList = new List<Tuple<int, int>>(); for (int iLevel = 0; iLevel < _lgLayoutSettings.Interactor.GetNumberOfLevels() - 1 && tileList.Count>0;) { GridTraversal grid = new GridTraversal(GeomGraph.BoundingBox, iLevel); Console.WriteLine("Drawing tiles on level {0} ...", iLevel); DrawTilesOnLevel(tileList, grid, renderBitmap, w, h, fitFactor*Math.Pow(2, iLevel), iLevel, nextLevelTileList); iLevel++; if (iLevel == _lgLayoutSettings.Interactor.GetNumberOfLevels() - 1) break; tileList = SwapTileLists(tileList, ref nextLevelTileList); } Console.WriteLine("Done"); normalFlow = true; } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine("did not succeeed to save all tiles"); } finally { // restore the original state foreach ( var node in _drawingGraph.Nodes.Concat(_drawingGraph.RootSubgraph.AllSubgraphsDepthFirstExcludingSelf())) { HideVNode(node); } Clear(); _graphCanvas.RenderTransform = renderTransform; if (normalFlow) InitTiles(); if (ViewChangeEvent != null) ViewChangeEvent(null, null); } timer.Stop(); Console.WriteLine("tiles for {0}", timer.Duration); }