/// <summary>
 /// </summary>
 public static M34f operator *(Rot2f rot, Shift3f shift)
 {
     return(Rot2f.Multiply(rot, shift));
 }
 /// <summary>
 /// Multiplies 2 Euclidean transformations.
 /// This concatenates the two rigid transformations into a single one, first b is applied, then a.
 /// Attention: Multiplication is NOT commutative!
 /// </summary>
 public static Euclidean2f Multiply(Euclidean2f a, Euclidean2f b)
 {
     //a.Rot * b.Rot, a.Trans + a.Rot * b.Trans
     return(new Euclidean2f(Rot2f.Multiply(a.Rot, b.Rot), a.Trans + a.Rot.TransformDir(b.Trans)));
 }
 /// <summary>
 /// </summary>
 public static Rot2f operator *(Rot2f r0, Rot2f r1)
 {
     return(Rot2f.Multiply(r0, r1));
 }
 /// <summary>
 /// </summary>
 public static M33f operator *(Rot2f rot, Scale3f scale)
 {
     return(Rot2f.Multiply(rot, scale));
 }
 /// <summary>
 /// </summary>
 public static M33f operator *(Rot2f rot2, Rot3f rot3)
 {
     return(Rot2f.Multiply(rot2, rot3));
 }
 /// <summary>
 /// </summary>
 public static M44f operator *(Rot2f rot, M44f mat)
 {
     return(Rot2f.Multiply(rot, mat));
 }
 /// <summary>
 /// </summary>
 public static V4f operator *(Rot2f rot, V4f vec)
 {
     return(Rot2f.Multiply(rot, vec));
 }
 /// <summary>
 /// Multiplies rotation with scalar value.
 /// </summary>
 public static Rot2f operator *(float val, Rot2f rot)
 {
     return(Rot2f.Multiply(rot, val));
 }
 public static M33f Multiply(Rot2f rot2, Rot3f rot3)
 {
     return(Rot2f.Multiply(rot2, (M33f)rot3));
 }