/// <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()); }
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"); }