/// <summary>
        /// Constructs the rotation matrix for an angle counter-clockwise (right-handed) about an arbitrary axis
        /// </summary>
        /// <param name="angle">Angle in radians</param>
        static public Matrix RotationMatrix(Vector axis, double angle)
        {
            axis = axis.UnitVector();
            var    matrix      = new Matrix(3, 3);
            double cos         = Math.Cos(angle);
            double sin         = Math.Sin(angle);
            double oneMinusCos = 1 - cos;

            matrix[0, 0] = cos + UtilityFunctions.Square(axis.X) * oneMinusCos;
            matrix[0, 1] = axis.X * axis.Y * oneMinusCos - axis.Z * sin;
            matrix[0, 2] = axis.X * axis.Z * oneMinusCos + axis.Y * sin;
            matrix[1, 0] = axis.Y * axis.X * oneMinusCos + axis.Z * sin;
            matrix[1, 1] = cos + UtilityFunctions.Square(axis.Y) * oneMinusCos;
            matrix[1, 2] = axis.Y * axis.Z * oneMinusCos - axis.X * sin;
            matrix[2, 0] = axis.Z * axis.X * oneMinusCos - axis.Y * sin;
            matrix[2, 1] = axis.Z * axis.Y * oneMinusCos + axis.X * sin;
            matrix[2, 2] = cos + UtilityFunctions.Square(axis.Z) * oneMinusCos;
            return(matrix);
        }