コード例 #1
0
        /// <summary>
        /// Creates or expands a final Room in the remaining RoomRow area.
        /// </summary>
        /// <param name="height">Desired height of the Room if a new Room must be created.</param>
        /// <param name="tolerance">Minimum area of a infill Room. Smaller rooms will be joined to the last Room.</param>
        public void Infill(double height, bool join = false)
        {
            height = Math.Round(Math.Abs(height));
            if (height.NearEqual(0.0) || insert.IsAlmostEqualTo(compass.SE))
            {
                return;
            }
            var polygons = Shaper.Intersections(Polygon.Rectangle(insert, compass.NE).ToList(), perimeterJig.ToList());

            if (polygons.Count == 0)
            {
                return;
            }
            if (polygons.Count > 0 && Rooms.Count > 0 && (join || polygons.First().Area() < Tolerance))
            {
                Rooms.Last().Perimeter =
                    Shaper.Merge(
                        new List <Polygon>
                {
                    polygons.First().Rotate(Vector3.Origin, Angle),
                    Rooms.Last().Perimeter
                }).First();
                return;
            }
            if (Rooms.Count > 0)
            {
                Rooms.Add(new Room(polygons.First().Rotate(Vector3.Origin, Angle), height));
                return;
            }
            Rooms.Add(new Room(perimeterJig.Rotate(Vector3.Origin, Angle), height));
            insert = compass.SE;
        }
コード例 #2
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);
        }
コード例 #3
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);
        }
コード例 #4
0
 /// <summary>
 /// Joins triangular end Rooms to the adjacent Room.
 /// </summary>
 /// <returns>An integer new Room count.</returns>
 public int JoinTriangleEndRooms()
 {
     for (var i = 0; i < 2; i++)
     {
         if (Rooms.Count < 2)
         {
             return(Rooms.Count);
         }
         var perimeter = Rooms[0].Perimeter;
         if (perimeter.Vertices.Count == 3)
         {
             var perimeters = Shaper.Merge(new List <Polygon> {
                 perimeter, Rooms[1].Perimeter
             });
             if (perimeters.Count == 1)
             {
                 Rooms[1].Perimeter = perimeters[0];
                 Rooms = Rooms.Skip(1).ToList();
             }
         }
         Rooms.Reverse();
     }
     return(Rooms.Count);
 }
コード例 #5
0
 /// <summary>
 /// Joins end Rooms of an area less than the supplied area to the adjacent Room.
 /// </summary>
 /// <param name="minArea">Minimum area of a ditinct Room.</param>
 /// <returns>An integer new Room count.</returns>
 public int JoinSmallEndRooms(double minArea = 0.1)
 {
     for (var i = 0; i < 2; i++)
     {
         if (Rooms.Count < 2)
         {
             return(Rooms.Count);
         }
         var perimeter = Rooms[0].Perimeter;
         if (perimeter.Area() < minArea)
         {
             var perimeters = Shaper.Merge(new List <Polygon> {
                 perimeter, Rooms[1].Perimeter
             });
             if (perimeters.Count == 1)
             {
                 Rooms[1].Perimeter = perimeters[0];
                 Rooms = Rooms.Skip(1).ToList();
             }
         }
         Rooms.Reverse();
     }
     return(Rooms.Count);
 }