Пример #1
0
        public CloseSegmentsIterator(List <Segment> polySegments, long overlapAmount = 0, bool useQuadTree = true)
        {
            if (useQuadTree)
            {
                var bounds = default(IntRect);
                var quads  = new List <Quad>(polySegments.Count);
                for (int i = 0; i < polySegments.Count; i++)
                {
                    var quad = new Quad(polySegments[i].Left - overlapAmount,
                                        polySegments[i].Bottom - overlapAmount,
                                        polySegments[i].Right + overlapAmount,
                                        polySegments[i].Top + overlapAmount);

                    if (i == 0)
                    {
                        bounds = new IntRect(quad.MinX, quad.MinY, quad.MaxX, quad.MaxY);
                    }
                    else
                    {
                        bounds.ExpandToInclude(new IntRect(quad.MinX, quad.MinY, quad.MaxX, quad.MaxY));
                    }

                    quads.Add(quad);
                }

                tree = new QuadTree <int>(5, new Quad(bounds.minX, bounds.minY, bounds.maxX, bounds.maxY));
                for (int i = 0; i < quads.Count; i++)
                {
                    tree.Insert(i, quads[i]);
                }
            }
        }
Пример #2
0
        public static QuadTree <int> GetPointQuadTree(this Polygon polygon, int splitCount = 5, long expandDist = 1)
        {
            var bounds = polygon.GetBounds();

            bounds.Inflate(expandDist);
            var quadTree = new QuadTree <int>(splitCount, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);

            for (int i = 0; i < polygon.Count; i++)
            {
                quadTree.Insert(i, polygon[i].X - expandDist, polygon[i].Y - expandDist, polygon[i].X + expandDist, polygon[i].Y + expandDist);
            }

            return(quadTree);
        }
Пример #3
0
        public static QuadTree <int> GetEdgeQuadTree(this Polygon polygon, int splitCount = 5, long expandDist = 1)
        {
            var bounds = polygon.GetBounds();

            bounds.Inflate(expandDist);
            var quadTree = new QuadTree <int>(splitCount, bounds.minX, bounds.minY, bounds.maxX, bounds.maxY);

            for (int i = 0; i < polygon.Count; i++)
            {
                var currentPoint = polygon[i];
                var nextPoint    = polygon[i == polygon.Count - 1 ? 0 : i + 1];
                quadTree.Insert(i, new Quad(Math.Min(nextPoint.X, currentPoint.X) - expandDist,
                                            Math.Min(nextPoint.Y, currentPoint.Y) - expandDist,
                                            Math.Max(nextPoint.X, currentPoint.X) + expandDist,
                                            Math.Max(nextPoint.Y, currentPoint.Y) + expandDist));
            }

            return(quadTree);
        }