Ejemplo n.º 1
0
 public void RTreeQuery_PointIntersectionTest()
 {
     for (int seed = 0; seed < 1; ++seed)
     {
         int    n      = 100000;
         var    points = new Point[n];
         var    rand   = new Random(seed);
         double scale  = 1000;
         for (int i = 0; i < n; ++i)
         {
             points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
         }
         var bsptree = new RTree <Point>(
             from p in points
             select new KeyValuePair <Rectangle, Point>(new Rectangle(p), p));
         Assert.AreEqual(bsptree.GetAllLeaves().Count(), n);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
         int intersecting = 0;
         for (int i = 0; i < 10000; ++i)
         {
             double s     = scale / 100;
             var    query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
             if (bsptree.IsIntersecting(query))
             {
                 ++intersecting;
             }
         }
         System.Diagnostics.Debug.WriteLine(intersecting);
     }
 }
Ejemplo n.º 2
0
        public void RTreeQuery_Rectangles()
        {
            const int Seeds      = 100;
            const int RectCount  = 1000;
            const int RegionSize = 1000;
            const int RectSize   = 10;

            for (int seed = 0; seed < Seeds; ++seed)
            {
                var rects = new Rectangle[RectCount];
                var rand  = new Random(seed);
                for (int i = 0; i < RectCount; ++i)
                {
                    rects[i] = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), new Point(RectSize, RectSize));
                }
                var bsptree = new RTree <Rectangle>(
                    from r in rects
                    select new KeyValuePair <Rectangle, Rectangle>(r, r));
                Assert.AreEqual(bsptree.GetAllLeaves().Count(), RectCount);
                Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), RectCount);
                Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
                var query     = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
                var checkList = (from r in rects
                                 where query.Intersects(r)
                                 select r).ToList();
                var checkSet = new HashSet <Rectangle>(checkList);
                var result   = bsptree.GetAllIntersecting(query).ToList();
                Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
                foreach (var r in result)
                {
                    Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
                    Assert.IsTrue(checkSet.Contains(r), "check set does not contain rect: seed={0}", seed);
                }
            }
        }
Ejemplo n.º 3
0
        public void RTreeQuery_IncrementalRectangles()
        {
            const int RectsCount = 1000;
            const int RegionSize = 1000;
            const int RectSize   = 10;

            for (int seed = 0; seed < 1; ++seed)
            {
                var rects = new Rectangle[RectsCount];
                var rand  = new Random(seed);
                for (int i = 0; i < RectsCount; ++i)
                {
                    rects[i] = new Rectangle(new Point(rand.Next(RegionSize), rand.Next(RegionSize)));
                }

                // create rTree with just the first rectangle
                var l = new List <KeyValuePair <Rectangle, Rectangle> >
                {
                    new KeyValuePair <Rectangle, Rectangle>(rects[0], rects[0])
                };
                var queryTree = new RTree <Rectangle>(l);

                // add remaining rectangles 10 at a time
                for (int a = 1, b = 10; b < RectsCount; a = b, b += 10)
                {
                    for (int i = a; i < b; ++i)
                    {
                        queryTree.Add(rects[i], rects[i]);
                    }
                    Assert.AreEqual(queryTree.GetAllLeaves().Count(), b, "did we lose leaves?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(
                                        new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), b,
                                    "are all leaves inside the max range?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0,
                                    "should be no leaves inside this rectangle!");
                    var query     = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
                    var checkList = (from r in rects.Take(b)
                                     where query.Intersects(r)
                                     select r).ToList();
                    var checkSet = new HashSet <string>(checkList.Select(r => r.ToString()));
                    var result   = queryTree.GetAllIntersecting(query).ToList();
                    Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
                    foreach (var r in result)
                    {
                        Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
                        Assert.IsTrue(checkSet.Contains(r.ToString()), "check set does not contain rect: seed={0}", seed);
                    }
                }
            }
        }
        List <Segment> GetAllSegmentsIntersecting(Rectangle rect)
        {
            var segmentsIntersecting = new List <Segment>();
            var boxIntersecting      = _segmentTree.GetAllIntersecting(rect);

            foreach (var seg in boxIntersecting)
            {
                if (RectSegIntersection.Intersect(rect, seg.p1, seg.p2))
                {
                    segmentsIntersecting.Add(seg);
                }
            }
            return(segmentsIntersecting);
        }
        public static bool IsSegmentInsideBoundaryOfSomeRectangle(Point p1, Point p2, RTree <Rectangle> rtree,
                                                                  double tolerance)
        {
            var searchRect = new Rectangle(p1, p2);

            searchRect = GetDilated(searchRect, tolerance);
            var intersected = rtree.GetAllIntersecting(searchRect);

            var boxesContaining = new List <Rectangle>();

            foreach (var r in intersected)
            {
                var boxBig         = GetDilated(r, tolerance);
                var boxSmall       = GetDilated(r, -tolerance);
                var insideBoundary = true;
                insideBoundary &= boxBig.Contains(p1);
                insideBoundary &= boxBig.Contains(p2);
                insideBoundary &= !boxSmall.Contains(p1);
                insideBoundary &= !boxSmall.Contains(p2);

                if (insideBoundary)
                {
                    boxesContaining.Add(r);
                }
            }

            return(boxesContaining.Any());
        }
        Set <SymmetricSegment> GetSymmetricSegmentsIntersectedBySeg(Point a, Point b)
        {
            var rect = new Rectangle(a, b);

            return(new Set <SymmetricSegment>(_symmetricSegmentsTree.GetAllIntersecting(rect).Where(ss =>
                                                                                                    SymmetricSegmentIntersects(ss, a, b))));
        }
        Set <LgNodeInfo> IntersectedByLineSegNodeInfos(Point p1, Point p2)
        {
            var nodes = _nodesTree.GetAllIntersecting(new Rectangle(p1, p2));

            return
                (new Set <LgNodeInfo>(nodes.Where(node => Curve.CurvesIntersect(node.BoundaryOnLayer, new LineSegment(p1, p2)))));
        }
        void SaveCurrentOverlapsBoxes()
        {
            // assume all Rtrees are updated

            oldOverlapsBoxes = new Dictionary <TreeNode, List <TreeNode> >();
            foreach (var v in _moveableRectanglesTree.GetAllLeaves())
            {
                var vOverlaps = _rectNodesRtree.GetAllIntersecting(v.rect);
                if (vOverlaps.Count() <= 1)
                {
                    continue;
                }
                var vOverlapsList = new List <TreeNode>();
                foreach (var u in vOverlaps)
                {
                    if (u != v)
                    {
                        vOverlapsList.Add(u);
                    }
                }
                if (vOverlapsList.Any())
                {
                    oldOverlapsBoxes.Add(v, vOverlapsList);
                }
            }
        }
        public void RTreeQuery_IncrementalRectangles()
        {
            const int RectsCount = 1000;
            const int RegionSize = 1000;
            const int RectSize   = 10;
            var       rects      = new Rectangle[RectsCount];
            var       rand       = new Random(0);

            for (int i = 0; i < RectsCount; ++i)
            {
                rects[i] = new Rectangle(new Point(rand.Next(RegionSize), rand.Next(RegionSize)));
            }

            // create rTree with just the first rectangle
            var rtree = new RTree <Rectangle, Point>();

            rtree.Add(rects[0], rects[0]);

            // add remaining rectangles 10 at a time
            for (int a = 1, b = 10; b < RectsCount; a = b, b += 10)
            {
                for (int i = a; i < b; ++i)
                {
                    rtree.Add(rects[i], rects[i]);
                }
                var allLeaves = rtree.GetAllLeaves().ToArray();
                Assert.AreEqual(allLeaves.Length, b, "did we lose leaves?");
                Assert.AreEqual(rtree.GetAllIntersecting(
                                    new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), b,
                                "are all leaves inside the max range?");
                Assert.AreEqual(rtree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0,
                                "should be no leaves inside this rectangle!");
                var rect      = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
                var checkList = (from r in rects.Take(b)
                                 where rect.Intersects(r)
                                 select r).ToList();
                var checkSet = new HashSet <string>(checkList.Select(r => r.ToString()));
                var result   = rtree.GetAllIntersecting(rect).ToList();
                Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes");
                foreach (var r in result)
                {
                    Assert.IsTrue(rect.Intersects(r), "rect doesn't intersect query: rect={1}, query={2}", r, rect);
                    Assert.IsTrue(checkSet.Contains(r.ToString()), "check set does not contain rect");
                }
            }
        }
        internal List<VisibilityEdge> GetAllGraphEdgesWithEndpointInInteriorOf(IEnumerable<Rectangle> rects,
            double slack = 0.01) {
            var rtree = new RTree<Rectangle>();
            foreach (var rect in rects) {
                var shrinkedRect = rect.Clone();
                shrinkedRect.ScaleAroundCenter(1 - slack);
                rtree.Add(shrinkedRect, shrinkedRect);
            }

            var edges = (from edge in PathRouter.GetAllEdgesVisibilityEdges()
                let qrect1 = new Rectangle(edge.SourcePoint, edge.SourcePoint)
                let qrect2 = new Rectangle(edge.TargetPoint, edge.TargetPoint)
                where rtree.GetAllIntersecting(qrect1).Any() || rtree.GetAllIntersecting(qrect2).Any()
                select edge).ToList();

            return edges;
        }
Ejemplo n.º 11
0
        public void RTreeQuery_RandomPoints()
        {
            var       bspQueryTime   = new Stopwatch();
            var       checkQueryTime = new Stopwatch();
            const int Seeds          = 5;
            const int Repeats        = 5;

            for (int seed = 0; seed < Seeds; ++seed)
            {
                int    n      = 100000;
                var    points = new Point[n];
                var    rand   = new Random(seed);
                double scale  = 1000;
                for (int i = 0; i < n; ++i)
                {
                    points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
                }
                var queryTree = new RTree <Point>(
                    from p in points
                    select new KeyValuePair <Rectangle, Point>(new Rectangle(p), p));
                Assert.AreEqual(queryTree.GetAllLeaves().Count(), n);
                Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
                Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
                for (int i = 0; i < Repeats; ++i)
                {
                    double s     = scale / 100;
                    var    query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
                    bspQueryTime.Start();
                    var result = queryTree.GetAllIntersecting(query).ToList();
                    bspQueryTime.Stop();
                    checkQueryTime.Start();
                    var checkList = (from p in points
                                     where query.Contains(p)
                                     select p).ToList();
                    checkQueryTime.Stop();
                    var checkSet = new HashSet <Point>(checkList);
                    Assert.AreEqual(result.Count, checkList.Count);
                    foreach (var r in result)
                    {
                        Assert.IsTrue(query.Contains(r));
                        Assert.IsTrue(checkSet.Contains(r));
                    }
                }
                Assert.IsTrue(bspQueryTime.ElapsedMilliseconds < checkQueryTime.ElapsedMilliseconds);
            }
        }
Ejemplo n.º 12
0
 public void RTreeQuery_RandomPoints()
 {
     var bspQueryTime = new Stopwatch();
     var checkQueryTime = new Stopwatch();
     const int Seeds = 5;
     const int Repeats = 5;
     for (int seed = 0; seed < Seeds; ++seed)
     {
         int n = 100000;
         var points = new Point[n];
         var rand = new Random(seed);
         double scale = 1000;
         for (int i = 0; i < n; ++i)
         {
             points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
         }
         var queryTree = new RTree<Point>(
             from p in points
             select new KeyValuePair<Rectangle, Point>(new Rectangle(p), p));
         Assert.AreEqual(queryTree.GetAllLeaves().Count(), n);
         Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
         for (int i = 0; i < Repeats; ++i)
         {
             double s = scale / 100;
             var query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
             bspQueryTime.Start();
             var result = queryTree.GetAllIntersecting(query).ToList();
             bspQueryTime.Stop();
             checkQueryTime.Start();
             var checkList = (from p in points
                              where query.Contains(p)
                              select p).ToList();
             checkQueryTime.Stop();
             var checkSet = new HashSet<Point>(checkList);
             Assert.AreEqual(result.Count, checkList.Count);
             foreach (var r in result)
             {
                 Assert.IsTrue(query.Contains(r));
                 Assert.IsTrue(checkSet.Contains(r));
             }
         }
         Assert.IsTrue(bspQueryTime.ElapsedMilliseconds < checkQueryTime.ElapsedMilliseconds);
     }
 }
Ejemplo n.º 13
0
        internal IEnumerable <Rail> GetRailsIntersectingRect(Rectangle visibleRectange)
        {
            var ret = new Set <Rail>();

            foreach (var rail in _railTree.GetAllIntersecting(visibleRectange))
            {
                ret.Insert(rail);
            }
            return(ret);
        }
        public static bool IsSegmentTouchingSomeRectangle(Point p1, Point p2, RTree <Rectangle> rtree, double tolerance)
        {
            var searchRect = new Rectangle(p1, p2);

            searchRect = GetDilated(searchRect, tolerance);
            var intersected = rtree.GetAllIntersecting(searchRect);
            var touching    =
                (from r in intersected
                 let boxBig = GetScaled(r, 1 + tolerance)
                              let boxSmall = GetScaled(r, 1 - tolerance)
                                             where Intersect(boxBig, p1, p2) && !Intersect(boxSmall, p1, p2)
                                             select r);

            return(touching.Any());
        }
        List <Point> GetPointsOverlappingSeg(SymmetricTuple <int> seg, RTree <Point> tree, Point[] indexToPoints)
        {
            Point p0   = indexToPoints[seg.A];
            Point p1   = indexToPoints[seg.B];
            var   rect = new Rectangle(p0, p1);

            rect.Pad(1e-5);

            Point[] vts = tree.GetAllIntersecting(rect).ToArray();

            double t;
            var    vtsOverlapping = vts.Where(p => Point.DistToLineSegment(p, p0, p1, out t) < 1e-5).ToList();

            vtsOverlapping = vtsOverlapping.OrderBy(p => (p - p0).Length).ToList();
            return(vtsOverlapping);
        }
Ejemplo n.º 16
0
        internal void InitNodePortEdges(IEnumerable <LgNodeInfo> nodes, IEnumerable <SymmetricSegment> segments)
        {
            NodePortEdges.Clear();
            NodeCenters.Clear();

            RTree <SymmetricSegment> rtree      = new RTree <SymmetricSegment>();
            RTree <Point>            pointRtree = new RTree <Point>();

            foreach (var seg in segments)
            {
                rtree.Add(new Rectangle(seg.A, seg.B), seg);

                pointRtree.Add(new Rectangle(seg.A), seg.A);
                pointRtree.Add(new Rectangle(seg.B), seg.B);
            }

            foreach (var node in nodes)
            {
                var bbox = node.BoundingBox.Clone();
                bbox.ScaleAroundCenter(0.9);
                NodePortEdges[node] = new List <SymmetricSegment>();
                var segInt = rtree.GetAllIntersecting(bbox).ToList();
                foreach (var seg in segInt)
                {
                    if (RectSegIntersection.Intersect(bbox, seg.A, seg.B))
                    {
                        NodePortEdges[node].Add(seg);
                    }
                    if (!(node.BoundingBox.Contains(seg.A) && node.BoundingBox.Contains(seg.B)))
                    {
                        Debug.Assert(false, "found long edge");
                    }
                }

                bbox = node.BoundingBox.Clone();
                bbox.ScaleAroundCenter(0.01);

                Point x;
                if (pointRtree.OneIntersecting(bbox, out x))
                {
                    NodeCenters[node] = x;
                }
            }
        }
Ejemplo n.º 17
0
        internal List <VisibilityEdge> GetAllGraphEdgesWithEndpointInInteriorOf(IEnumerable <Rectangle> rects,
                                                                                double slack = 0.01)
        {
            var rtree = new RTree <Rectangle>();

            foreach (var rect in rects)
            {
                var shrinkedRect = rect.Clone();
                shrinkedRect.ScaleAroundCenter(1 - slack);
                rtree.Add(shrinkedRect, shrinkedRect);
            }

            var edges = (from edge in PathRouter.GetAllEdgesVisibilityEdges()
                         let qrect1 = new Rectangle(edge.SourcePoint, edge.SourcePoint)
                                      let qrect2 = new Rectangle(edge.TargetPoint, edge.TargetPoint)
                                                   where rtree.GetAllIntersecting(qrect1).Any() || rtree.GetAllIntersecting(qrect2).Any()
                                                   select edge).ToList();

            return(edges);
        }
Ejemplo n.º 18
0
        void FindOverlapsWithInterval(int i)
        {
            if (_intervalTree == null)
            {
                return;
            }
            var interval = GetInterval(i);

            foreach (int j in _intervalTree.GetAllIntersecting(interval))
            {
                var tuple = GTreeOverlapRemoval.GetIdealEdgeLength(i, j,
                                                                   _nodePositions[i], _nodePositions[j], _nodeSizes, _forLayers);

                if (!(tuple.Item3 > 1))
                {
                    return;
                }
                _proximityEdges.Add(tuple);
                _numberOfOverlaps++;
            }
        }
Ejemplo n.º 19
0
        void AddVoronoiCite(CdtTriangle triangle)
        {
            Point p;
            var   goodTriangle = GetCenterOfDescribedCircle(triangle, out p);

            if (!goodTriangle)
            {
                return;
            }
            if (!BoundingBox.Contains(p))
            {
                return;
            }
            var rect = new Rectangle(p);

            rect.Pad(eps);
            if (voronoiSiteTree.GetAllIntersecting(rect).Count() > 0)
            {
                return;
            }

            voronoiSiteTree.Add(rect, p);
        }
Ejemplo n.º 20
0
        public void RTreeQuery_IncrementalRectangles()
        {
            const int RectsCount = 1000;
            const int RegionSize = 1000;
            const int RectSize = 10;
            for (int seed = 0; seed < 1; ++seed)
            {
                var rects = new Rectangle[RectsCount];
                var rand = new Random(seed);
                for (int i = 0; i < RectsCount; ++i)
                {
                    rects[i] = new Rectangle(new Point(rand.Next(RegionSize), rand.Next(RegionSize)));
                }

                // create rTree with just the first rectangle
                var l = new List<KeyValuePair<Rectangle, Rectangle>>
                            {
                                new KeyValuePair<Rectangle, Rectangle>(rects[0], rects[0])
                            };
                var queryTree = new RTree<Rectangle>(l);

                // add remaining rectangles 10 at a time
                for (int a = 1, b = 10; b < RectsCount; a = b, b += 10)
                {
                    for (int i = a; i < b; ++i)
                    {
                        queryTree.Add(rects[i], rects[i]);
                    }
                    Assert.AreEqual(queryTree.GetAllLeaves().Count(), b, "did we lose leaves?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(
                        new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), b,
                        "are all leaves inside the max range?");
                    Assert.AreEqual(queryTree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0,
                        "should be no leaves inside this rectangle!");
                    var query = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
                    var checkList = (from r in rects.Take(b)
                                     where query.Intersects(r)
                                     select r).ToList();
                    var checkSet = new HashSet<Rectangle>(checkList);
                    var result = queryTree.GetAllIntersecting(query).ToList();
                    Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
                    foreach (var r in result)
                    {
                        Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
                        Assert.IsTrue(checkSet.Contains(r), "check set does not contain rect: seed={0}", seed);
                    }
                }
            }
        }
Ejemplo n.º 21
0
 public void RTreeQuery_Rectangles()
 {
     const int Seeds = 100;
     const int RectCount = 1000;
     const int RegionSize = 1000;
     const int RectSize = 10;
     for (int seed = 0; seed < Seeds; ++seed)
     {
         var rects = new Rectangle[RectCount];
         var rand = new Random(seed);
         for (int i = 0; i < RectCount; ++i)
         {
             rects[i] = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), new Point(RectSize, RectSize));
         }
         var bsptree = new RTree<Rectangle>(
             from r in rects
             select new KeyValuePair<Rectangle, Rectangle>(r, r));
         Assert.AreEqual(bsptree.GetAllLeaves().Count(), RectCount);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, RegionSize + RectSize, RegionSize + RectSize)).Count(), RectCount);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         var query = new Rectangle(rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize), rand.Next(RegionSize));
         var checkList = (from r in rects
                          where query.Intersects(r)
                          select r).ToList();
         var checkSet = new HashSet<Rectangle>(checkList);
         var result = bsptree.GetAllIntersecting(query).ToList();
         Assert.AreEqual(result.Count, checkList.Count, "result and check are different sizes: seed={0}", seed);
         foreach (var r in result)
         {
             Assert.IsTrue(query.Intersects(r), "rect doesn't intersect query: seed={0}, rect={1}, query={2}", seed, r, query);
             Assert.IsTrue(checkSet.Contains(r), "check set does not contain rect: seed={0}", seed);
         }
     }
 }
 /// <summary>
 /// ignoring crossing at ls.Start
 /// </summary>
 /// <param name="ls"></param>
 /// <param name="rTree"></param>
 /// <param name="segsToIgnore"></param>
 /// <returns></returns>
 static bool IsCrossing(LineSegment ls, RTree<SegWithIndex> rTree, SegWithIndex[] segsToIgnore) {
     return rTree.GetAllIntersecting(ls.BoundingBox).Where(seg => !segsToIgnore.Contains(seg)).Any();
 }
        public static bool IsSegmentInsideBoundaryOfSomeRectangle(Point p1, Point p2, RTree<Rectangle> rtree,
            double tolerance)
        {
            var searchRect = new Rectangle(p1, p2);
            searchRect = GetDilated(searchRect, tolerance);
            var intersected = rtree.GetAllIntersecting(searchRect);

            var boxesContaining = new List<Rectangle>();
            foreach (var r in intersected)
            {
                var boxBig = GetDilated(r, tolerance);
                var boxSmall = GetDilated(r, -tolerance);
                var insideBoundary = true;
                insideBoundary &= boxBig.Contains(p1);
                insideBoundary &= boxBig.Contains(p2);
                insideBoundary &= !boxSmall.Contains(p1);
                insideBoundary &= !boxSmall.Contains(p2);

                if(insideBoundary)
                    boxesContaining.Add(r);
            }

            return boxesContaining.Any();
        }
        internal void InitNodePortEdges(IEnumerable<LgNodeInfo> nodes, IEnumerable<SymmetricSegment> segments) {
            NodePortEdges.Clear();
            NodeCenters.Clear();

            RTree<SymmetricSegment> rtree = new RTree<SymmetricSegment>();
            RTree<Point> pointRtree = new RTree<Point>();

            foreach (var seg in segments) {
                rtree.Add(new Rectangle(seg.A, seg.B), seg);

                pointRtree.Add(new Rectangle(seg.A), seg.A);
                pointRtree.Add(new Rectangle(seg.B), seg.B);
            }

            foreach (var node in nodes) {
                var bbox = node.BoundingBox.Clone();
                bbox.ScaleAroundCenter(0.9);
                NodePortEdges[node] = new List<SymmetricSegment>();
                var segInt = rtree.GetAllIntersecting(bbox).ToList();
                foreach (var seg in segInt) {
                    if (RectSegIntersection.Intersect(bbox, seg.A, seg.B)) {
                        NodePortEdges[node].Add(seg);
                    }
                    if (!(node.BoundingBox.Contains(seg.A) && node.BoundingBox.Contains(seg.B)))
                        Debug.Assert(false, "found long edge");
                }

                bbox = node.BoundingBox.Clone();
                bbox.ScaleAroundCenter(0.01);

                Point x;
                if (pointRtree.OneIntersecting(bbox, out x))
                    NodeCenters[node] = x;
            }
        }
 /// <summary>
 /// ignoring crossing at ls.Start
 /// </summary>
 /// <param name="ls"></param>
 /// <param name="rTree"></param>
 /// <param name="segsToIgnore"></param>
 /// <returns></returns>
 static bool IsCrossing(LineSegment ls, RTree <SegWithIndex> rTree, SegWithIndex[] segsToIgnore)
 {
     return(rTree.GetAllIntersecting(ls.BoundingBox).Where(seg => !segsToIgnore.Contains(seg)).Any());
 }
/*
        void AddSegsHandlingOverlaps(SymmetricTuple<int> seg, RTree<Point> tree, Point[] indexToPoints) {
            var overlaps = GetPointsOverlappingSeg(seg, tree,indexToPoints);
            if (overlaps.Count <= 2) {
                _segments.Insert(seg);
                return;
            }
            Point ep0 = indexToPoints[seg.A];
            AddSegment(ep0, overlaps[1]);
            AddSegment(overlaps[overlaps.Count - 2], indexToPoints[seg.B]);
            if (overlaps.Count > 3) {
                AddSegsHandlingOverlaps(new SymmetricTuple<int>(_pointIndices[overlaps[1]],_pointIndices[overlaps[overlaps.Count - 2]]), tree, indexToPoints);
            }
        }
*/

        List<Point> GetPointsOverlappingSeg(SymmetricTuple<int> seg, RTree<Point> tree, Point[] indexToPoints) {
            Point p0 = indexToPoints[seg.A];
            Point p1 = indexToPoints[seg.B];
            var rect = new Rectangle(p0, p1);
            rect.Pad(1e-5);

            Point[] vts = tree.GetAllIntersecting(rect).ToArray();

            double t;
            var vtsOverlapping = vts.Where(p => Point.DistToLineSegment(p, p0, p1, out t) < 1e-5).ToList();

            vtsOverlapping = vtsOverlapping.OrderBy(p => (p - p0).Length).ToList();
            if (vtsOverlapping.Count > 2) {
                Console.WriteLine("overlapping points");
                foreach (var v in vtsOverlapping)
                    Console.WriteLine(v);
            }
            return vtsOverlapping;
        }
Ejemplo n.º 27
0
 public void RTreeQuery_PointIntersectionTest()
 {
     for (int seed = 0; seed < 1; ++seed)
     {
         int n = 100000;
         var points = new Point[n];
         var rand = new Random(seed);
         double scale = 1000;
         for (int i = 0; i < n; ++i)
         {
             points[i] = new Point(rand.NextDouble() * scale, rand.NextDouble() * scale);
         }
         var bsptree = new RTree<Point>(
             from p in points
             select new KeyValuePair<Rectangle, Point>(new Rectangle(p), p));
         Assert.AreEqual(bsptree.GetAllLeaves().Count(), n);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(-2, -2, -1, -1)).Count(), 0);
         Assert.AreEqual(bsptree.GetAllIntersecting(new Rectangle(0, 0, scale, scale)).Count(), n);
         int intersecting = 0;
         for (int i = 0; i < 10000; ++i)
         {
             double s = scale / 100;
             var query = new Rectangle(rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s, rand.NextDouble() * s);
             if (bsptree.IsIntersecting(query))
             {
                 ++intersecting;
             }
         }
         System.Console.WriteLine(intersecting);
     }
 }
 public static bool IsSegmentTouchingSomeRectangle(Point p1, Point p2, RTree<Rectangle> rtree, double tolerance)
 {
     var searchRect = new Rectangle(p1, p2);
     searchRect = GetDilated(searchRect, tolerance);
     var intersected = rtree.GetAllIntersecting(searchRect);
     var touching =
         (from r in intersected
          let boxBig = GetScaled(r, 1 + tolerance)
          let boxSmall = GetScaled(r, 1 - tolerance)
          where Intersect(boxBig, p1, p2) && !Intersect(boxSmall, p1, p2)
          select r);
     return touching.Any();
 }