void AddAction(Point a, Point b) {
     Debug.Assert(_pathRouter.VisGraph.ContainsVertex(a));
     Debug.Assert(_pathRouter.VisGraph.ContainsVertex(b));
     _pathRouter.VisGraph.AddEdge(a, b);
     var ss = new SymmetricSegment(a, b);
     _symmetricSegmentsTree.Add(new Rectangle(a, b), ss);
 }
Example #2
0
        public Rail FindOrCreateRail(Point s, Point t)
        {
            var p0 = s;
            var p1 = t;

            var  t1 = new SymmetricSegment(p0, p1);
            Rail rail;

            if (RailDictionary.TryGetValue(t1, out rail))
            {
                return(rail);
            }
            var t2 = new SymmetricSegment(p1, p0);

            if (RailDictionary.TryGetValue(t2, out rail))
            {
                return(rail);
            }

            // no rail exists // roman: please check that this code really can be commented out and does need to be fixed instead

            /*
             * var q0 = VisGraph.GetPointOfVisGraphVertex(s);
             * var q1 = VisGraph.GetPointOfVisGraphVertex(t);
             * if (q0 == null || q1 == null)
             * {
             *  //no visgraph vertex found
             * }
             * else
             * {
             *  var edge = VisGraph.FindEdge(q0.Point, q1.Point);
             * }*/
            return(CreateRail(p0, p1));
        }
Example #3
0
        bool IfCanInsertLooseSegmentUpdateTiles(SymmetricSegment seg, GridTraversal grid)
        {
            //test if already inserted
            if (IsSegmentAlreadyAdded(seg))
            {
                return(true);
            }

            var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid);

            bool canInsertSegment = true;

            foreach (var tile in intersectedTiles)
            {
                if (!_segmentTileTable.ContainsKey(tile))
                {
                    _segmentTileTable[tile] = 0;
                }

                canInsertSegment &= _segmentTileTable[tile] < MaxAmountRailsPerTile;
            }
            if (!canInsertSegment)
            {
                return(false);
            }

            foreach (var tile in intersectedTiles)
            {
                _segmentTileTable[tile]++;
            }
            return(true);
        }
        static bool SymmetricSegmentIntersects(SymmetricSegment ss, Point a, Point b)
        {
            double t0, t1;
            var    dist = LineSegment.MinDistBetweenLineSegments(ss.A, ss.B, a, b, out t0, out t1);

            return(dist < 0.001 && ((0.01 < t0 && t0 < 0.99) || (0.01 < t1 && t1 < 0.99)));
        }
        void RemoveAction(Point a, Point b) {
#if DEBUG
            VisibilityEdge ve;
            Debug.Assert(_pathRouter.FindVertex(a).TryGetEdge(_pathRouter.FindVertex(b), out ve));
#endif
            _pathRouter.RemoveEdge(a, b);
            var ss=new SymmetricSegment(a, b);
            _symmetricSegmentsTree.Remove(new Rectangle(ss.A, ss.B), ss);
        }
Example #6
0
        public static void RunTest3()
        {
            var moveableRects = new Rectangle[0];
            var fixedRects    = new Rectangle[1];

            fixedRects[0] = new Rectangle(-10, -20, 50, 60);
            SymmetricSegment[] fixedSegments = new SymmetricSegment[0];
            var orb = new OverlapRemovalFixedSegmentsBitmap(moveableRects, fixedRects, fixedSegments);
        }
        void AddAction(Point a, Point b)
        {
            Debug.Assert(_pathRouter.VisGraph.ContainsVertex(a));
            Debug.Assert(_pathRouter.VisGraph.ContainsVertex(b));
            _pathRouter.VisGraph.AddEdge(a, b);
            var ss = new SymmetricSegment(a, b);

            _symmetricSegmentsTree.Add(new Rectangle(a, b), ss);
        }
Example #8
0
        public Rail FindRail(Point s, Point t)
        {
            var  p0 = s;
            var  p1 = t;
            var  ss = new SymmetricSegment(p1, p0);
            Rail rail;

            RailDictionary.TryGetValue(ss, out rail);
            return(rail);
        }
        void RemoveAction(Point a, Point b)
        {
#if TEST_MSAGL
            VisibilityEdge ve;
            Debug.Assert(_pathRouter.FindVertex(a).TryGetEdge(_pathRouter.FindVertex(b), out ve));
#endif
            _pathRouter.RemoveEdge(a, b);
            var ss = new SymmetricSegment(a, b);
            _symmetricSegmentsTree.Remove(new Rectangle(ss.A, ss.B), ss);
        }
        internal RouteSimplifier(LgPathRouter pathRouter, IEnumerable<LgNodeInfo> nodes, Set<Point> fixedPoints) {
            _pathRouter = pathRouter;
            _fixedPoints = fixedPoints;
            foreach (var node in nodes)
                _nodesTree.Add(node.BoundaryOnLayer.BoundingBox, node);


            foreach (var e in pathRouter.VisGraph.Edges) {
                var ss= new SymmetricSegment(e.SourcePoint, e.TargetPoint);
                _symmetricSegmentsTree.Add(new Rectangle(ss.A, ss.B), ss);
            }
        }
Example #11
0
        void RemoveLooseSegmentDecrementTiles(SymmetricSegment seg, GridTraversal grid)
        {
            var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid);

            foreach (var tile in intersectedTiles)
            {
                if (_segmentTileTable.ContainsKey(tile))
                {
                    _segmentTileTable[tile]--;
                }
            }
        }
        public OverlapRemovalFixedSegmentsBitmap(Rectangle[] moveableRectangles, Rectangle[] fixedRectangles,
            SymmetricSegment[] fixedSegments) {
            _moveableRectangles = moveableRectangles;
            _fixedRectangles = fixedRectangles;
            _fixedSegments = fixedSegments;

            _bbox = GetInitialBoundingBox();
            _bbox.ScaleAroundCenter(1.25);

            InitBitmap();
            InitTransform();
            
            movedRectangles = new Rectangle[moveableRectangles.Length];
        }
        bool IsCrossedBySegment(SymmetricSegment edge)
        {
            var  intersectingSegments = _segmentTree.GetAllIntersecting(new Rectangle(edge.A, edge.B));
            bool hasIntersection      = false;

            foreach (var seg in intersectingSegments)
            {
                if (RectSegIntersection.SegmentsIntersect(edge.A, edge.B, seg.p1, seg.p2))
                {
                    hasIntersection = true;
                    break;
                }
            }
            return(hasIntersection);
        }
Example #14
0
        public Rail CreateRail(Point ep0, Point ep1)
        {
            var  st = new SymmetricSegment(ep0, ep1);
            Rail rail;

            if (RailDictionary.TryGetValue(st, out rail))
            {
                return(rail);
            }
            var ls = new LineSegment(ep0, ep1);

            rail = new Rail(ls, ZoomLevel);
            RailTree.Add(rail.BoundingBox, rail);
            RailDictionary.Add(st, rail);
            return(rail);
        }
        internal RouteSimplifier(LgPathRouter pathRouter, IEnumerable <LgNodeInfo> nodes, Set <Point> fixedPoints)
        {
            _pathRouter  = pathRouter;
            _fixedPoints = fixedPoints;
            foreach (var node in nodes)
            {
                _nodesTree.Add(node.BoundaryOnLayer.BoundingBox, node);
            }


            foreach (var e in pathRouter.VisGraph.Edges)
            {
                var ss = new SymmetricSegment(e.SourcePoint, e.TargetPoint);
                _symmetricSegmentsTree.Add(new Rectangle(ss.A, ss.B), ss);
            }
        }
Example #16
0
        void AddSegmentToRtree(SymmetricSegment seg)
        {
            if (IsSegmentAlreadyAdded(seg))
            {
                return;
            }

            var rect = new Rectangle(seg.A, seg.B);

            //rect = new Rectangle(rect.LeftBottom - segRtreeBuffer*new Point(1, 1),
            //    rect.RightTop + segRtreeBuffer*new Point(1, 1));

            _insertedSegmentsTree.Add(rect, seg);

            // add to visgraph
            _pathRouter.AddVisGraphEdge(seg.A, seg.B);
        }
Example #17
0
        /// <summary>
        /// try adding single rail to dictionary
        /// </summary>
        /// <param name="rail"></param>
        /// <returns>true iff the rail does not belong to _railDictionary</returns>
        public bool AddRailToDictionary(Rail rail)
        {
            Point p0, p1;

            if (!rail.GetStartEnd(out p0, out p1))
            {
                return(false);
            }
            var st = new SymmetricSegment(p0, p1);

            if (!_railDictionary.ContainsKey(st))
            {
                _railDictionary.Add(st, rail);
                return(true);
            }
            return(false);
        }
Example #18
0
        public Rail FindOrCreateRail(Point s, Point t)
        {
            var p0 = s;
            var p1 = t;

            var  t1 = new SymmetricSegment(p0, p1);
            Rail rail;

            if (RailDictionary.TryGetValue(t1, out rail))
            {
                return(rail);
            }
            var t2 = new SymmetricSegment(p1, p0);

            if (RailDictionary.TryGetValue(t2, out rail))
            {
                return(rail);
            }
            return(CreateRail(p0, p1));
        }
        public OverlapRemovalFixedSegmentsMst(Rectangle[] moveableRectangles, Rectangle[] fixedRectangles, SymmetricSegment[] fixedSegments)
        {
            TreeNode.numNodes = 0;
            this.moveableRectangles = moveableRectangles;
            this.fixedRectangles = fixedRectangles;
            this.fixedSegments = fixedSegments;

            SaveOldPositionsMoveable();
        }
        void AddSegmentToRtree(SymmetricSegment seg) {
            if (IsSegmentAlreadyAdded(seg))
                return;

            var rect = new Rectangle(seg.A, seg.B);
            //rect = new Rectangle(rect.LeftBottom - segRtreeBuffer*new Point(1, 1),
            //    rect.RightTop + segRtreeBuffer*new Point(1, 1));

            _insertedSegmentsTree.Add(rect, seg);

            // add to visgraph
            _pathRouter.AddVisGraphEdge(seg.A, seg.B);
        }
Example #21
0
 bool IsSegmentAlreadyAdded(SymmetricSegment seg)
 {
     return(_pathRouter.ExistsEdge(seg.A, seg.B));
 }
 bool IsSegmentAlreadyAdded(SymmetricSegment seg) {
     return _pathRouter.ExistsEdge(seg.A, seg.B);
 }
        Rail ContinueReadingRail(LgEdgeInfo topRankedEdgoInfo, int zoomLevel, LgLevel level) {
            XmlRead();
            string pointString;
            if (TokenIs(GeometryToken.Arrowhead)) {
                Point arrowheadPosition = TryGetPointAttribute(GeometryToken.ArrowheadPosition);
                Point attachmentPoint = TryGetPointAttribute(GeometryToken.CurveAttachmentPoint);
                Arrowhead ah = new Arrowhead {
                    TipPosition = arrowheadPosition,
                    Length = (attachmentPoint - arrowheadPosition).Length
                };
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ah, attachmentPoint, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(arrowheadPosition, attachmentPoint);
                level._railDictionary[tuple] = rail;
                return rail;
            }

            if (TokenIs(GeometryToken.LineSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var linePoints = ParsePoints(pointString);
                Debug.Assert(linePoints.Length == 2);
                LineSegment ls = new LineSegment(linePoints[0], linePoints[1]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(ls, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(ls.Start, ls.End);
                level._railDictionary[tuple] = rail;
                level._railTree.Add(ls.BoundingBox, rail);
                return rail;
            }
            if (TokenIs(GeometryToken.CubicBezierSegment)) {
                pointString = GetAttribute(GeometryToken.Points);
                var controlPoints = ParsePoints(pointString);
                Debug.Assert(controlPoints.Length == 4);
                var bs = new CubicBezierSegment(controlPoints[0], controlPoints[1], controlPoints[2], controlPoints[3]);
                XmlRead();
                ReadEndElement();
                var rail = new Rail(bs, topRankedEdgoInfo, zoomLevel);
                var tuple = new SymmetricSegment(bs.Start, bs.End);
                level._railDictionary[tuple] = rail;
                return rail;
            }
            throw new Exception();
        }
Example #24
0
 public static void RunTest3() {
     var moveableRects = new Rectangle[0];
     var fixedRects = new Rectangle[1];
     fixedRects[0] = new Rectangle(-10, -20, 50, 60);
     SymmetricSegment[] fixedSegments = new SymmetricSegment[0];
     var orb = new OverlapRemovalFixedSegmentsBitmap(moveableRects, fixedRects, fixedSegments);
     
 }
 public Rail CreateRail(Point ep0, Point ep1) {
     var st = new SymmetricSegment(ep0, ep1);
     Rail rail;
     if (RailDictionary.TryGetValue(st, out rail)) {
         return rail;
     }
     var ls = new LineSegment(ep0, ep1);
     rail = new Rail(ls, ZoomLevel);
     RailTree.Add(rail.BoundingBox, rail);
     RailDictionary.Add(st, rail);
     return rail;
 }
 public Rail FindRail(Point s, Point t) {
     var p0 = s;
     var p1 = t;
     var ss = new SymmetricSegment(p1, p0);
     Rail rail;
     RailDictionary.TryGetValue(ss, out rail);
     return rail;
 }
        static bool SymmetricSegmentIntersects(SymmetricSegment ss, Point a, Point b) {
            double t0, t1;
            var dist = LineSegment.MinDistBetweenLineSegments(ss.A, ss.B, a, b, out t0, out t1);
            return dist <0.001 && ((0.01 < t0 && t0 < 0.99) || (0.01 < t1 && t1 < 0.99));

        }
 /// <summary>
 /// try adding single rail to dictionary
 /// </summary>
 /// <param name="rail"></param>
 /// <returns>true iff the rail does not belong to _railDictionary</returns>
 public bool AddRailToDictionary(Rail rail) {
     Point p0, p1;
     if (!rail.GetStartEnd(out p0, out p1)) return false;
     var st = new SymmetricSegment(p0, p1);
     if (!_railDictionary.ContainsKey(st)) {
         _railDictionary.Add(st, rail);
         return true;
     }
     return false;
 }
        public Rail FindOrCreateRail(Point s, Point t) {
            var p0 = s;
            var p1 = t;

            var t1 = new SymmetricSegment(p0, p1);
            Rail rail;
            if (RailDictionary.TryGetValue(t1, out rail)) return rail;
            var t2 = new SymmetricSegment(p1, p0);
            if (RailDictionary.TryGetValue(t2, out rail)) return rail;

            // no rail exists // roman: please check that this code really can be commented out and does need to be fixed instead 
            /*
             * var q0 = VisGraph.GetPointOfVisGraphVertex(s);
            var q1 = VisGraph.GetPointOfVisGraphVertex(t);
            if (q0 == null || q1 == null)
            {
                //no visgraph vertex found
            }
            else
            {
                var edge = VisGraph.FindEdge(q0.Point, q1.Point);
            }*/
            return CreateRail(p0, p1);
        }
        void RemoveLooseSegmentDecrementTiles(SymmetricSegment seg, GridTraversal grid) {
            var intersectedTiles = GetIntersectedTiles(seg.A, seg.B,  grid);

            foreach (var tile in intersectedTiles) {
                if (_segmentTileTable.ContainsKey(tile))
                    _segmentTileTable[tile]--;
            }
        }
  bool IsCrossedBySegment(SymmetricSegment edge)
 {
     var intersectingSegments = _segmentTree.GetAllIntersecting(new Rectangle(edge.A, edge.B));
     bool hasIntersection = false;
     foreach (var seg in intersectingSegments)
     {
         if (RectSegIntersection.SegmentsIntersect(edge.A, edge.B, seg.p1, seg.p2))
         {
             hasIntersection = true;
             break;
         }
     }
     return hasIntersection;
 }
        bool IfCanInsertLooseSegmentUpdateTiles(SymmetricSegment seg,  GridTraversal grid) {
            //test if already inserted
            if (IsSegmentAlreadyAdded(seg))
                return true;

            var intersectedTiles = GetIntersectedTiles(seg.A, seg.B, grid);

            bool canInsertSegment = true;
            foreach (var tile in intersectedTiles) {
                if (!_segmentTileTable.ContainsKey(tile))
                    _segmentTileTable[tile] = 0;

                canInsertSegment &= _segmentTileTable[tile] < MaxAmountRailsPerTile;
            }
            if (!canInsertSegment) return false;

            foreach (var tile in intersectedTiles) {
                _segmentTileTable[tile]++;
            }
            return true;
        }