Exemple #1
0
        /// <summary>
        /// Gets the intersection of a plane at the specified height as a list of contours (i.e a list of 2D polygons).
        /// </summary>
        /// <param name="elevation">The elevation.</param>
        /// <returns>List&lt;BarrierPolygons&gt;.</returns>
        public List <BarrierPolygon> GetIntersection(double elevation)
        {
            var edges = new List <UVLine>();

            foreach (var item in this._faces)
            {
                if (item.Intersects(elevation))
                {
                    var edge = item.GetIntersection(elevation);
                    UV  p1   = new UV(edge.Start.X, edge.Start.Y);
                    UV  p2   = new UV(edge.End.X, edge.End.Y);
                    edges.Add(new UVLine(p1, p2));
                }
            }
            var plines = PLine.ExtractPLines(edges);
            List <BarrierPolygon> boundary = new List <BarrierPolygon>();

            foreach (PLine item in plines)
            {
                var oneBoundary = item.Simplify(0.001d, 0.0001d);
                if (oneBoundary != null)
                {
                    var polygon = new BarrierPolygon(oneBoundary.ToArray())
                    {
                        IsClosed = item.Closed
                    };
                    boundary.Add(polygon);
                }
            }
            return(boundary);
        }
        /// <summary>
        /// Gets the field boundary polygons.
        /// </summary>
        /// <param name="cellularFloor">The cellular floor.</param>
        /// <returns>List&lt;BarrierPolygons&gt;.</returns>
        public static List <BarrierPolygon> GetFieldBoundary(CellularFloor cellularFloor)
        {
            Dictionary <UVLine, int> guid = new Dictionary <UVLine, int>();

            foreach (var item in cellularFloor.Cells)
            {
                if (item.FieldOverlapState == OverlapState.Inside)
                {
                    var lines = cellularFloor.CellToLines(item);
                    foreach (var line in lines)
                    {
                        if (guid.ContainsKey(line))
                        {
                            guid[line]++;
                        }
                        else
                        {
                            guid.Add(line, 1);
                        }
                    }
                }
            }
            List <UVLine> boundaryLines = new List <UVLine>();

            foreach (KeyValuePair <UVLine, int> item in guid)
            {
                if (item.Value == 1)
                {
                    boundaryLines.Add(item.Key);
                }
            }
            guid.Clear();
            guid = null;
            var pLines = PLine.ExtractPLines(boundaryLines);
            List <BarrierPolygon> boundary = new List <BarrierPolygon>();

            foreach (PLine item in pLines)
            {
                var oneBoundary = item.Simplify(cellularFloor.CellSize / 10);
                if (oneBoundary != null)
                {
                    boundary.Add(new BarrierPolygon(oneBoundary.ToArray()));
                }
            }
            boundaryLines.Clear();
            boundaryLines = null;
            return(boundary);
        }
        /// <summary>
        /// Gets the boundary polygons of a collection of cells.
        /// </summary>
        /// <param name="cellIDs">The visible cells.</param>
        /// <param name="cellularFloor">The cellular floor.</param>
        /// <returns>List&lt;BarrierPolygons&gt;.</returns>
        public static List <BarrierPolygon> GetBoundary(ICollection <int> cellIDs, CellularFloorBaseGeometry cellularFloor)
        {
            Dictionary <UVLine, int> guid = new Dictionary <UVLine, int>();

            foreach (var item in cellIDs)
            {
                var lines = cellularFloor.CellToLines(cellularFloor.FindCell(item));
                foreach (var line in lines)
                {
                    if (guid.ContainsKey(line))
                    {
                        guid[line]++;
                    }
                    else
                    {
                        guid.Add(line, 1);
                    }
                }
            }
            List <UVLine> boundaryLines = new List <UVLine>();

            foreach (KeyValuePair <UVLine, int> item in guid)
            {
                if (item.Value == 1)
                {
                    boundaryLines.Add(item.Key);
                }
            }
            guid.Clear();
            guid = null;
            var plines = PLine.ExtractPLines(boundaryLines);
            List <BarrierPolygon> boundary = new List <BarrierPolygon>();

            foreach (PLine item in plines)
            {
                var oneBoundary = item.Simplify(cellularFloor.CellSize / 10);
                if (oneBoundary != null)
                {
                    boundary.Add(new BarrierPolygon(oneBoundary.ToArray()));
                }
            }
            boundaryLines.Clear();
            boundaryLines = null;
            return(boundary);
        }