Esempio n. 1
0
        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]++;
            }
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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
        }
Esempio n. 4
0
        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
        }
Esempio n. 5
0
        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);
            }
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
 List <Tuple <int, int> > GetIntersectedTiles(Point p1, Point p2, GridTraversal grid)
 {
     return(grid.GetTilesIntersectedByLineSeg(p1, p2));
 }
Esempio n. 9
0
 void UpdateTilesCountInsertedNodesOnly(int level, GridTraversal grid)
 {
     _nodeTileTable = new Dictionary <Tuple <int, int>, int>();
     UpdateTilesCountInsertedNodes(level, grid);
 }
Esempio n. 10
0
 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);
 }
Esempio n. 11
0
        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
        }