private static bool ExpandConnection(PositionedConnection conn, char[,] artChars) { Position currentPos = conn.track[conn.track.Count - 1]; List <Position.Direction> dirs = new List <Position.Direction>(); foreach (var direction in PositionedConnection.GetContainedDirections(conn.tailDirection)) { Position newPos = currentPos + direction; if (newPos.IsWithin(artChars)) { Position.Direction thisDir = CharFits(artChars[newPos.x, newPos.y], direction); if (thisDir != Position.Direction.None) { dirs.Add(direction); } } } if (dirs.Count == 0) { throw new InvalidOperationException("Connection reaches dead end"); } if (dirs.Count > 1) { throw new InvalidOperationException("Connection reaches splitting point: not allowed"); } Position newPoint = currentPos + dirs[0]; conn.track.Add(newPoint); conn.tailDirection = CharFits(artChars[newPoint.x, newPoint.y], dirs[0]); return(!TailAtEnd(artChars[newPoint.x, newPoint.y])); }
private static Position.Direction CharFits(char found, Position.Direction direction) { if (found == '+' || found == '#') { switch (direction) { case Position.Direction.North: return(Position.Direction.East | Position.Direction.West | Position.Direction.North); case Position.Direction.East: return(Position.Direction.North | Position.Direction.East | Position.Direction.South); case Position.Direction.South: return(Position.Direction.East | Position.Direction.West | Position.Direction.South); case Position.Direction.West: return(Position.Direction.West | Position.Direction.North | Position.Direction.South); default: return(Position.Direction.None); } } if (found == '|') { switch (direction) { case Position.Direction.North: return(Position.Direction.North); case Position.Direction.South: return(Position.Direction.South); default: return(Position.Direction.None); } } if (found == '-') { switch (direction) { case Position.Direction.East: return(Position.Direction.East); case Position.Direction.West: return(Position.Direction.West); default: return(Position.Direction.None); } } if (found >= 'a' && found <= 'z') { return(direction); } if (found >= '0' && found <= '9') { return(direction); } return(Position.Direction.None); }
public static IEnumerable <Position.Direction> GetContainedDirections(Position.Direction dir) { foreach (var possibleDir in Position.AllDirections) { if (possibleDir == Position.Direction.None) { continue; } if ((dir & possibleDir) == possibleDir) { yield return(possibleDir); } } }
private static void ExtractConnectionEndFor(Position pos, char[,] artChars, Position.Direction dir, char pointerSymbol, List <PositionedConnection> pointers) { int difX = (dir == Position.Direction.East ? 1 : (dir == Position.Direction.West ? -1 : 0)); int difY = (dir == Position.Direction.South ? 1 : (dir == Position.Direction.North ? -1 : 0)); pos.x += difX; pos.y += difY; if (pos.x < 0 || pos.y < 0 || pos.x >= artChars.GetLength(0) || pos.y >= artChars.GetLength(1)) { return; } if (artChars[pos.x, pos.y] == pointerSymbol) { PositionedConnection newConn = new PositionedConnection() { tailDirection = dir }; newConn.track.Add(pos); pointers.Add(newConn); } }