void UpdateTilesCountInsertedNodes(int level, GridTraversal grid) { foreach (var node in _insertedNodes) { var tuple = grid.PointToTuple(node.Center); if (!_nodeTileTable.ContainsKey(tuple)) { _nodeTileTable[tuple] = 0; } _nodeTileTable[tuple]++; } }
private bool TryAddingOldSegments(List <SymmetricSegment> oldSegments, GridTraversal grid) { Set <SymmetricSegment> insertedSegments; bool canInsertOldPaths = TryAddingSegmentsUpdateTiles(oldSegments, grid, out insertedSegments); if (canInsertOldPaths) { AddSegmentsToRtree(oldSegments); return(true); } // if couldn't even insert previous level, terminate return(false); }
public void RunTest6() { Point bl = new Point(0, 0); Point p1 = new Point(0.5, 1.5); Point p2 = new Point(9.5, 10.1); GridTraversal grid = new GridTraversal(new Rectangle(bl, bl + new Point(20, 15)), 2); var tiles = grid.GetTilesIntersectedByLineSeg(p1, p2); #if TEST_MSAGL Microsoft.Msagl.GraphViewerGdi.DisplayGeometryGraph.SetShowFunctions(); ShowTiles(tiles, grid, p1, p2); #endif }
public void RunTest7() { Point p1 = new Point(-497.12352212078628, 1689.84931190121); Point p2 = new Point(198.64235142705752, 2139.4677380013277); Point bl = new Point(-5191.0147700187063, -4395.7850131819132); double gridSize = 553.23948409846571; GridTraversal grid = new GridTraversal(new Rectangle(bl, bl + new Point(gridSize, gridSize)), 20); var tiles = grid.GetTilesIntersectedByLineSeg(p1, p2); #if TEST_MSAGL Microsoft.Msagl.GraphViewerGdi.DisplayGeometryGraph.SetShowFunctions(); ShowTiles(tiles, grid, p1, p2); #endif }
private void AddOldNodes(int numNodesOnPreviousLevel, GridTraversal grid) { for (int i = 0; i < numNodesOnPreviousLevel; i++) { var ni = SortedLgNodeInfos[i]; var nodeTile = grid.PointToTuple(ni.Center); if (!_nodeTileTable.ContainsKey(nodeTile)) { _nodeTileTable[nodeTile] = 0; } ni.Processed = true; _nodeTileTable[nodeTile]++; _insertedNodes.Add(ni); } }
internal bool IfCanInsertLooseSegmentUpdateTiles(SymmetricSegment seg, GridTraversal grid) { //test if already inserted if (IsSegmentAlreadyAdded(seg)) { return(true); } var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid); int maxNumRailPerTile = 0; bool canInsertSegment = true; foreach (var tile in intersectedTiles) { if (!_segmentTileTable.ContainsKey(tile)) { _segmentTileTable[tile] = 0; } if (maxNumRailPerTile < _segmentTileTable[tile]) { maxNumRailPerTile = _segmentTileTable[tile]; } canInsertSegment &= _segmentTileTable[tile] < MaxAmountRailsPerTile; } if (!canInsertSegment) { Console.WriteLine("maxNumRailPerTile = " + maxNumRailPerTile); return(false); } foreach (var tile in intersectedTiles) { _segmentTileTable[tile]++; } return(true); }
internal int TryInsertingNodesAndRoutes(int numNodesToInsert, Dictionary <SymmetricTuple <LgNodeInfo>, List <Point> > trajectories, List <SymmetricSegment> oldSegments, int zoomLevel, int numNodesOnPreviousLevel, GridTraversal grid, LgPathRouter pathRouter) { MarkAllNodesNotProcessed(); _segmentTileTable = new Dictionary <Tuple <int, int>, int>(); _nodeTileTable = new Dictionary <Tuple <int, int>, int>(); var canAddOldSegments = TryAddingOldSegments(oldSegments, grid); if (!canAddOldSegments) { return(0); } AddOldNodes(numNodesOnPreviousLevel, grid); int i; for (i = numNodesOnPreviousLevel; i < numNodesToInsert; i++) { var ni = SortedLgNodeInfos[i]; var nodeTile = grid.PointToTuple(ni.Center); if (!_nodeTileTable.ContainsKey(nodeTile)) { _nodeTileTable[nodeTile] = 0; } if (_nodeTileTable[nodeTile] >= MaxNodesPerTile(zoomLevel)) //test MaxAmountNodesPerTile { ShowDebugInsertedSegments(grid, zoomLevel, ni, null, null); break; } Set <VisibilityEdge> edges = GetSegmentsOnPathsToInsertedNeighborsNotOnOldTrajectories(ni, trajectories, pathRouter); Set <SymmetricSegment> segments = new Set <SymmetricSegment>( edges.Select(e => new SymmetricSegment(e.SourcePoint, e.TargetPoint))); var newToAdd = segments.Where(seg => !IsSegmentAlreadyAdded(seg)).ToList(); Set <SymmetricSegment> insertedSegments; bool canInsertPaths = TryAddingSegmentsUpdateTiles(newToAdd, grid, out insertedSegments); if (canInsertPaths) { AddSegmentsToRtree(newToAdd); ni.Processed = true; _nodeTileTable[nodeTile]++; _insertedNodes.Add(ni); continue; } //debug output //AddSegmentsToRtree(newToAdd); //remove // ShowDebugInsertedSegments(grid, zoomLevel, ni, newToAdd, segments); break; } var nextNode = numNodesToInsert < SortedLgNodeInfos.Count ? SortedLgNodeInfos[numNodesToInsert] : null; // ShowDebugInsertedSegments(grid, zoomLevel, nextNode, null, null); return(i); }
List <Tuple <int, int> > GetIntersectedTiles(Point p1, Point p2, GridTraversal grid) { return(grid.GetTilesIntersectedByLineSeg(p1, p2)); }
void UpdateTilesCountInsertedNodesOnly(int level, GridTraversal grid) { _nodeTileTable = new Dictionary <Tuple <int, int>, int>(); UpdateTilesCountInsertedNodes(level, grid); }
bool IfCanInsertLooseSegmentsUpdateTiles(IEnumerable <SymmetricSegment> segs, out Set <SymmetricSegment> insertedSegs, GridTraversal grid) { insertedSegs = new Set <SymmetricSegment>(); foreach (var seg in segs) { if (IfCanInsertLooseSegmentUpdateTiles(seg, grid)) { insertedSegs.Insert(seg); } else { return(false); } } return(true); }
private void ShowDebugInsertedSegments(GridTraversal grid, int zoomLevel, LgNodeInfo nodeToAdd, IEnumerable <SymmetricSegment> newToAdd, IEnumerable <SymmetricSegment> allOnNewEdges) { #if DEBUG && !SILVERLIGHT && !SHARPKIT && PREPARE_DEMO var edges = _pathRouter.GetAllEdgesVisibilityEdges(); var ll = new List <DebugCurve>(); foreach (var ni in _insertedNodes) { ll.Add(new DebugCurve(5, "green", ni.BoundaryCurve)); } if (nodeToAdd != null) { var curve = _insertedNodes.Last().BoundaryCurve.Clone(); curve.Translate(nodeToAdd.Center - _insertedNodes.Last().Center); ll.Add(new DebugCurve(5, "red", curve)); } foreach (var e in edges) { ll.Add(new DebugCurve(new LineSegment(e.SourcePoint, e.TargetPoint))); } int n = zoomLevel; int maxNodes = MaxNodesPerTile(zoomLevel); for (int ix = 0; ix < n; ix++) { for (int iy = 0; iy < n; iy++) { var tile = new Tuple <int, int>(ix, iy); var r = grid.GetTileRect(ix, iy); if (_nodeTileTable.ContainsKey(tile) && _nodeTileTable[tile] >= maxNodes) { ll.Add(new DebugCurve(5, "yellow", CurveFactory.CreateRectangle(r))); } else if (_segmentTileTable.ContainsKey(tile) && _segmentTileTable[tile] >= MaxAmountRailsPerTile) { ll.Add(new DebugCurve(5, "orange", CurveFactory.CreateRectangle(r))); } else { ll.Add(new DebugCurve(5, "blue", CurveFactory.CreateRectangle(r))); } } } if (allOnNewEdges != null) { foreach (var seg in allOnNewEdges) { ll.Add(new DebugCurve(5, "yellow", new LineSegment(seg.A, seg.B))); } } if (newToAdd != null) { foreach (var seg in newToAdd) { ll.Add(new DebugCurve(5, "red", new LineSegment(seg.A, seg.B))); } } LayoutAlgorithmSettings.ShowDebugCurves(ll.ToArray()); PrintInsertedNodesLabels(); #endif }