/// <summary>
        /// Build a transformation taking the independent vectors v1 and v2 to w1 and w2, respectively.
        /// </summary>
        /// <param name="v1">A first vector; must be nonzero. </param>
        /// <param name="v2">A second vector; must be linearly independent of the first</param>
        /// <param name="w1">Where the first vector will be sent</param>
        /// <param name="w2">Where the second vector will be sent</param>
        /// <returns>A linear transformation taking v1 to w1 and v2 to w2 </returns>
        public static LinearTransform2 VectorsToVectors(Vector v1, Vector v2, Vector w1, Vector w2)
        {
            LinearTransform2 V = new LinearTransform2(v1, v2);
            LinearTransform2 W = new LinearTransform2(w1, w2);

            return(W * V.InverseTransform());
        }
Esempio n. 2
0
        private static void testLT()
        {
            // Results: inverse is broken for LinearTransform; otherwise OK.
            Debug.Print(new LinearTransform2() + "\nshould be identity\n");
            Vector           v1 = new Vector(2, 3); Vector v2 = new Vector(-1, 4);
            LinearTransform2 T1 = new LinearTransform2(v1, v2);

            Debug.Print(T1 + "\nshould be 2, -1; 3 4.\n");
            Debug.Print(T1.Det() + "\n should be 11; " + T1.Trace() + "\nshould be 6\n");
            Vector           w1 = new Vector(0, 1); Vector w2 = new Vector(1, 1);
            LinearTransform2 Tvw = LinearTransform2.VectorsToVectors(v1, v2, w1, w2);
            LinearTransform2 T30 = LinearTransform2.RotateXY(30 * Math.PI / 180.0);
            LinearTransform2 Ti  = T1.InverseTransform();

            Debug.Print(T30 + "\nshould be Rot30; lower left = 0.5\n");
            Debug.Print(Ti * v1 + "\nshould be e1\n");
            Debug.Print(Ti * v2 + "\nshould be e2\n");
            Debug.Print(T1 * T1 + "\nshould be [1 -6; 18 13]\n");
            Debug.Print(T1 * Ti + "\n should be identity\n");
        }