public MapSegmentPathTile FindStartTile(ICollection <MapSegmentPathTile> tiles, MapSegmentDirection direction)
    {
        foreach (var tile in tiles)
        {
            if (MapSegmentPathTile.IsFree(tile.NeighbourUp))
            {
                return(tile);
            }
        }

        // In theory; this is not possible
        return(null);
    }
    public Point GetEndPoint(MapSegmentDirection direction)
    {
        if (direction == MapSegmentDirection.Up)
        {
            return(Point + UP_END_OFFSET);
        }
        else if (direction == MapSegmentDirection.Right)
        {
            return(Point + RIGHT_END_OFFSET);
        }
        else if (direction == MapSegmentDirection.Down)
        {
            return(Point + DOWN_END_OFFSET);
        }
        else if (direction == MapSegmentDirection.Left)
        {
            return(Point + LEFT_END_OFFSET);
        }

        return(Point);
    }
    public MapSegmentPathTile GetNeighbour(MapSegmentDirection direction)
    {
        MapSegmentPathTile result = null;

        if (direction == MapSegmentDirection.Up)
        {
            result = NeighbourUp;
        }
        else if (direction == MapSegmentDirection.Down)
        {
            result = NeighbourDown;
        }
        else if (direction == MapSegmentDirection.Left)
        {
            result = NeighbourLeft;
        }
        else if (direction == MapSegmentDirection.Right)
        {
            result = NeighbourRight;
        }

        return(result);
    }
    public List <Vector2> GetGroupPoints(ICollection <MapSegmentPathTile> tiles, MapSegmentPathTile startTile, MapSegmentDirection startDirection)
    {
        var result    = new List <Vector2>();
        var startNode = new MapSegmentTraverseResult {
            PathTile = startTile, Direction = startDirection
        };

        var currentNode = startNode;
        var point       = startNode.PathTile.GetStartPoint(startDirection).ToVector2();

        result.Add(point);

        while (!CheckTerminationCondition(currentNode, startNode, result))
        {
            point = currentNode.PathTile.GetEndPoint(currentNode.Direction).ToVector2();
            result.Add(point);
            currentNode = GetNextNode(currentNode);
        }

        return(result);
    }
    public bool IsNeighbourFree(MapSegmentDirection direction)
    {
        var tile = GetNeighbour(direction);

        return(IsFree(tile));
    }