/// <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>
        /// Expands a collection of indices in the walkable field.
        /// </summary>
        /// <param name="cellularFloor">The cellular floor.</param>
        /// <param name="indices">The indices.</param>
        /// <returns>HashSet&lt;Index&gt;.</returns>
        public static HashSet <Index> ExpandInWalkableField(CellularFloor cellularFloor, ICollection <Index> indices)
        {
            HashSet <Index> collection = new HashSet <Index>();

            foreach (var item in indices)
            {
                collection.Add(item);
                foreach (var relativeIndex in Index.Neighbors)
                {
                    Index index = item + relativeIndex;
                    if (cellularFloor.ContainsCell(index) && !collection.Contains(index))
                    {
                        if (cellularFloor.Cells[index.I, index.J].FieldOverlapState == OverlapState.Inside)
                        {
                            collection.Add(index);
                        }
                    }
                }
            }
            return(collection);
        }