public Dictionary <BallData, IntVector3> GetBallsPositions()
    {
        BallData[,] realBalls = new BallData[Width, Height];
        for (int x = 0; x < Width; x++)
        {
            for (int y = 0; y < Height; y++)
            {
                if (!board[x, y].ball.IsEmpty() && !board[x, y].ball.IsWall())
                {
                    realBalls[x, y] = new BallData(BallType.NORMAL, board[x, y].ball.GetObjectiveType());
                }
                else
                {
                    realBalls[x, y] = BallData.GetEmptyBall();
                }
            }
        }
        FaceModel faceModel = FaceModel.ModelsDictionary[face];

        realBalls = realBalls.Rotate(360 - rotation);

        if (faceModel.mirrorAxis != -1)
        {
            realBalls = realBalls.Mirror(faceModel.mirrorAxis);
        }
        Dictionary <BallData, IntVector3> result = new Dictionary <BallData, IntVector3>();

        for (int x = 0; x < Width; x++)
        {
            for (int y = 0; y < Height; y++)
            {
                if (realBalls[x, y].BallType == BallType.NORMAL)
                {
                    IntVector3 point = new IntVector3(x, y);
                    result.Add(realBalls[x, y], point);
                }
            }
        }
        return(result);
    }