private static (ILine first, ILine second) GetOverlapping(ILine first, ILine second) { var firstOverlap = new Line(); var secondOverlap = new Line(); foreach (var firstTilePosition in first) { var secondTilePosition = second.FirstOrDefault(tilePosition => tilePosition.Coordinates.IsOverlapping(firstTilePosition.Coordinates)); if (secondTilePosition != default(TilePosition)) { firstOverlap.Add(firstTilePosition); secondOverlap.Add(secondTilePosition); } } return(firstOverlap, secondOverlap); }
private static Tiles ConnectDoorsViaConnectingLine(Tiles tilesWithUnconnectedDoors, ILine firstProjection, ILine secondProjection, ILine connectingLine) { var startOfConnectingLine = connectingLine.First(); var firstDoor = firstProjection.Single(tilePosition => tilesWithUnconnectedDoors.IsTileType <Door>(tilePosition.Coordinates)); var fromFirstToConnecting = ExtractLineBetween(firstProjection, firstDoor.Coordinates, startOfConnectingLine.Coordinates); var endOfConnectingLine = connectingLine.Last(); var secondDoor = secondProjection.Single(tilePosition => tilesWithUnconnectedDoors.IsTileType <Door>(tilePosition.Coordinates)); var fromConnectingToSecond = ExtractLineBetween(secondProjection, secondDoor.Coordinates, endOfConnectingLine.Coordinates); var finalRoute = new Line(); finalRoute.AddRange(fromFirstToConnecting); finalRoute.AddRange(connectingLine.Select(Tunnel)); finalRoute.AddRange(fromConnectingToSecond); var stateChange = finalRoute.ToTilesState(); var tilesWithNewlyConnectedDoors = tilesWithUnconnectedDoors.Clone(stateChange); return(tilesWithNewlyConnectedDoors); }
private static ILine ConnectProjections(Tiles tiles, Door firstDoor, Door secondDoor, ILine firstProjection, ILine secondProjection, (Compass4Points first, Compass4Points second) directions)