public Similarity__x3t__(M4__x4t__ m, __ft__ epsilon = (__ft__)0.00001) { if (!(m.M30.IsTiny(epsilon) && m.M31.IsTiny(epsilon) && m.M32.IsTiny(epsilon))) { throw new ArgumentException("Matrix contains perspective components."); } if (m.M33.IsTiny(epsilon)) { throw new ArgumentException("Matrix is not homogeneous."); } m /= m.M33; //normalize it var m33 = (M3__x3t__)m; var s0 = m33.C0.Norm2; var s1 = m33.C1.Norm2; var s2 = m33.C2.Norm2; var s = (s0 * s1 * s2).Pow((__ft__)1.0 / 3); //geometric mean of scale if (!((s0 / s - 1).IsTiny(epsilon) && (s1 / s - 1).IsTiny(epsilon) && (s2 / s - 1).IsTiny(epsilon))) { throw new ArgumentException("Matrix features non-uniform scaling"); } m33 /= s; Scale = s; EuclideanTransformation = new Euclidean__x3t__(m33, m.C3.XYZ); }
/// <summary> /// Creates a similarity transformation from a rigid transformation <paramref name="euclideanTransformation"/> and an (subsequent) uniform scale by factor <paramref name="scale"/>. /// </summary> public Similarity__x3t__(Euclidean__x3t__ euclideanTransformation, __ft__ scale) { Scale = scale; EuclideanTransformation = new Euclidean__x3t__( euclideanTransformation.Rot, scale * euclideanTransformation.Trans ); }
/// <summary> /// Creates a similarity transformation from an uniform scale by factor <paramref name="scale"/>, and a (subsequent) rigid transformation <paramref name="euclideanTransformation"/>. /// </summary> public Similarity__x3t__(__ft__ scale, Euclidean__x3t__ euclideanTransformation) { Scale = scale; EuclideanTransformation = euclideanTransformation; }
public static Similarity__x3t__ Parse(string s) { var x = s.NestedBracketSplitLevelOne().ToArray(); return(new Similarity__x3t__(__ft__.Parse(x[0]), Euclidean__x3t__.Parse(x[1]))); }
public static bool ApproxEqual(Similarity__x3t__ t0, Similarity__x3t__ t1, __ft__ angleTol, __ft__ posTol, __ft__ scaleTol) { return(t0.Scale.ApproximateEquals(t1.Scale, scaleTol) && Euclidean__x3t__.ApproxEqual(t0.EuclideanTransformation, t1.EuclideanTransformation, angleTol, posTol)); }
/// <summary> /// Multiplies an Euclidean transformation by a Similarity transformation. /// This concatenates the two transformations into a single one, first b is applied, then a. /// Attention: Multiplication is NOT commutative! /// </summary> public static Similarity__x3t__ Multiply(Euclidean__x3t__ a, Similarity__x3t__ b) { return(Multiply((Similarity__x3t__)a, b)); }
/// <summary> /// Multiplies a Similarity transformation by an Euclidean transformation. /// This concatenates the two transformations into a single one, first b is applied, then a. /// Attention: Multiplication is NOT commutative! /// </summary> public static Similarity__x3t__ Multiply(Similarity__x3t__ a, Euclidean__x3t__ b) { return(Multiply(a, (Similarity__x3t__)b)); }