Пример #1
0
        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);
        }
Пример #2
0
 /// <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
         );
 }
Пример #3
0
 /// <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;
 }
Пример #4
0
        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])));
        }
Пример #5
0
 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));
 }
Пример #6
0
 /// <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));
 }
Пример #7
0
 /// <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));
 }