/// <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; }
/// <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); }
/// <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); }
/// <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); }
/// <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); }