コード例 #1
0
        public void GetAllRoomsAndCorridors()
        {
            Rooms.Clear();
            Corridors.Clear();
            ClearAllSpaces(TileMap, NumColumns, NumRows);
            DetermineSpaceTypes();


            for (int column = 0; column < NumColumns; column++)
            {
                for (int row = 0; row < NumRows; row++)
                {
                    Tile activeSpace = GetFloorSpace(column, row);
                    if (activeSpace == null)
                    {
                        continue;
                    }

                    if (activeSpace.SpaceType == SpaceType.Room)
                    {
                        if (activeSpace.Parent == null)
                        {
                            Rooms.Add(CreateRoomFromSpace(activeSpace));
                        }
                    }
                    else if (activeSpace.SpaceType == SpaceType.Corridor)
                    {
                        if (activeSpace.Parent == null)
                        {
                            Corridors.Add(CreateCorridorFromSpace(activeSpace));
                        }
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// Private function conforming the Corridors to other Story Room lists.
        /// </summary>
        private void FitCorridors()
        {
            var corridors = Corridors.ToList();

            Corridors.Clear();
            foreach (var corridor in corridors)
            {
                AddCorridor(corridor);
            }
        }
コード例 #3
0
        /// <summary>
        /// Adds a Room to the Corridors list.
        /// </summary>
        /// <param name="room">Room to add.</param>
        /// <param name="fit">Indicates whether the new corridor should mutually fit to other Story features.</param>
        /// <param name="merge">Indicates whether the new corridor should merge with other corridors.</param>
        /// <returns>
        /// True if one or more rooms were added to the Story.
        /// </returns>
        public bool AddCorridor(Room room, bool fit = true, bool merge = true)
        {
            if (Perimeter == null || room.Perimeter == null || !Perimeter.Covers(perimeter))
            {
                return(false);
            }
            var newRoom =
                new Room()
            {
                Color     = room.Color,
                Elevation = Elevation,
                Height    = room.Height,
                Name      = room.Name,
                Perimeter = room.Perimeter
            };
            var fitRooms = new List <Room> {
                newRoom
            };

            if (fit)
            {
                var toRooms = new List <Room>(Exclusions);
                toRooms.AddRange(Services);
                fitRooms = FitRooms(fitRooms, toRooms, false);
                Rooms    = FitRooms(Rooms, fitRooms);
            }
            if (fitRooms.Count == 0)
            {
                return(false);
            }
            Corridors.AddRange(fitRooms);
            var merged = Shaper.Merge(CorridorsAsPolygons);

            if (merge && merged.Count < Corridors.Count)
            {
                Corridors.Clear();
                foreach (var corridor in merged)
                {
                    Corridors.Add(
                        new Room()
                    {
                        Color     = room.Color,
                        Elevation = Elevation,
                        Height    = room.Height,
                        Name      = room.Name,
                        Perimeter = corridor
                    });
                }
            }
            return(true);
        }
コード例 #4
0
        /// <summary>
        /// Adds a Room to the Corridors list.
        /// </summary>
        /// <param name="room">Room to add.</param>
        /// <returns>
        /// True if one or more Rooms were added.
        /// </returns>
        public bool AddCorridor(Room room,
                                bool merge       = true,
                                double tolerance = 0.0,
                                double minLength = 0.0)
        {
            var perimeters = Shaper.FitWithin(room.Perimeter, Perimeter);

            if (perimeters.Count == 0)
            {
                return(false);
            }
            var fitAmong = new List <Polygon>(OpeningsAsPolygons);

            fitAmong.AddRange(ExclusionsAsPolygons);
            fitAmong.AddRange(ServicesAsPolygons);
            var corridors = Shaper.Differences(perimeters, fitAmong).ToList();

            if (corridors.Count() == 0)
            {
                return(false);
            }
            corridors.AddRange(CorridorsAsPolygons);
            if (merge)
            {
                corridors = Shaper.Merge(corridors);
            }
            Corridors.Clear();
            foreach (var corridor in corridors)
            {
                Corridors.Add(
                    new Room(room)
                {
                    Elevation = Elevation,
                    Height    = room.Height,
                    Perimeter = corridor
                });
            }
            FitRooms();
            return(true);
        }
コード例 #5
0
        /// <summary>
        /// Creates a grid network of corridors within the Story and returns a list of spatially sorted RoomRows ready for population.
        /// </summary>
        /// <param name="rowLength">Distance between cross corridors.</param>
        /// <param name="roomDepth">Desired depth of Rooms.</param>
        /// <param name="corridorWidth">Width of all corridors.</param>
        /// <returns>A List of RoomRow</returns>
        public List <RoomRow> PlanGrid(double rowLength, double rowDepth, double corridorWidth = 3.0, bool split = true)
        {
            Corridors.Clear();
            Rooms.Clear();
            rowLength     = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowLength);
            rowDepth      = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(rowDepth);
            corridorWidth = rowLength.NearEqual(0.0) ? 1.0 : Math.Abs(corridorWidth);

            var row          = Perimeter.Segments().OrderByDescending(s => s.Length()).First();
            var ang          = Math.Atan2(row.End.Y - row.Start.Y, row.End.X - row.Start.X) * (180 / Math.PI);
            var perimeterJig = Perimeter.Rotate(Vector3.Origin, ang * -1);
            var grid         = new Grid2d(perimeterJig);

            grid.U.DivideByFixedLength(rowLength, FixedDivisionMode.RemainderAtBothEnds);
            grid.V.DivideByFixedLength(rowDepth, FixedDivisionMode.RemainderAtBothEnds);
            var uLines   = grid.GetCellSeparators(GridDirection.U).Skip(1).Reverse().Skip(1).Reverse();
            var vLines   = grid.GetCellSeparators(GridDirection.V).Skip(1).Reverse().Skip(1).Reverse();
            var ctrLines = new List <Line>();

            foreach (var curve in uLines)
            {
                ctrLines.Add((Line)curve);
            }
            foreach (var curve in vLines)
            {
                ctrLines.Add((Line)curve);
            }
            foreach (var line in ctrLines)
            {
                var corridor = line.Thicken(corridorWidth);
                if (perimeterJig.Compass().Box.Covers(corridor))
                {
                    AddCorridor(new Room(corridor.Rotate(Vector3.Origin, ang), Height));
                }
            }
            foreach (var cell in grid.CellsFlat)
            {
                var polygon = (Polygon)cell.GetCellGeometry();
                var compass = polygon.Compass();
                if (split)
                {
                    var north = Polygon.Rectangle(compass.W, compass.NE).Rotate(Vector3.Origin, ang);
                    var south = Polygon.Rectangle(compass.SW, compass.E).Rotate(Vector3.Origin, ang);
                    AddRoom(new Room(north, Height));
                    AddRoom(new Room(south, Height));
                    continue;
                }
                else if (Math.Abs(compass.SizeY - rowDepth) <= 0.0001)
                {
                    AddRoom(new Room(polygon.Rotate(Vector3.Origin, ang), Height));
                }
            }
            var roomRows = new List <RoomRow>();

            foreach (var room in Rooms)
            {
                roomRows.Add(new RoomRow(room.Perimeter));
            }
            Rooms.Clear();
            return(roomRows);
        }