private static void TestVector() { { DotNet3d.Vector v0 = new DotNet3d.Vector(); v0.X = 10; v0.Y = 11; v0.Z = 12; Trace.Assert(v0.ToString() == "[10 11 12]\n"); DotNet3d.Vector v1 = new DotNet3d.Vector(); Trace.Assert(v1.ToString() == "[0 0 0]\n"); DotNet3d.Vector v2 = new DotNet3d.Vector { X = 1, Y = 2, Z = 3 }; Trace.Assert(v2.ToString() == "[1 2 3]\n"); DotNet3d.Vector v3 = new DotNet3d.Vector(v2); Trace.Assert(v3.ToString() == "[1 2 3]\n"); DotNet3d.Vector v4 = new DotNet3d.Vector(4, 5, 6); Trace.Assert(v4.ToString() == "[4 5 6]\n"); double[] arr2 = { 7, 8, 9 }; DotNet3d.Vector v5 = new DotNet3d.Vector(arr2); Trace.Assert(v5.ToString() == "[7 8 9]\n"); DotNet3d.Vector v6 = v2 + v4; Trace.Assert(v6.ToString() == "[5 7 9]\n"); DotNet3d.Vector v7 = 2 * v2; Trace.Assert(v7.ToString() == "[2 4 6]\n"); DotNet3d.Vector v8 = v2 * 2; Trace.Assert(v8.ToString() == "[2 4 6]\n"); DotNet3d.Vector v9 = v2 / 2; Trace.Assert(v9.ToString() == "[0.5 1 1.5]\n"); DotNet3d.Vector v10 = new DotNet3d.Vector(1, 2, 2); Trace.Assert(v10.Length() == 3); } // Normalize { DotNet3d.Vector v1 = new DotNet3d.Vector(1, 2, 3); var v1n = v1.Normalize(); var str = v1n.ToString(); Trace.Assert(str == "[0.27 0.53 0.8]\n"); Trace.Assert(v1.ToString() == "[0.27 0.53 0.8]\n"); Trace.Assert(v1.X == 0.2672612419124244); Trace.Assert(v1.Y == 0.53452248382484879); Trace.Assert(v1.Z == 0.80178372573727319); DotNet3d.Vector v2 = new DotNet3d.Vector(1, 2, 3); Trace.Assert(DotNet3d.Vector.Normalize(v2).ToString() == "[0.27 0.53 0.8]\n"); } { DotNet3d.Vector v12 = new DotNet3d.Vector(1, 2, 3); DotNet3d.Point p10 = new DotNet3d.Point(1, 2, 3); Trace.Assert((v12 + p10).ToString() == "(2 4 6)\n"); Trace.Assert((p10 + v12).ToString() == "(2 4 6)\n"); DotNet3d.Vector v13 = new DotNet3d.Vector(4, 5, 6); DotNet3d.Vector v14 = new DotNet3d.Vector(3, 2, 1); Trace.Assert((v13 - v14).ToString() == "[1 3 5]\n"); DotNet3d.Vector v15 = new DotNet3d.Vector(1, 2, 3); DotNet3d.Vector v16 = new DotNet3d.Vector(10, 11, 12); // Verified by http://onlinemschool.com/math/assistance/vector/multiply/ Trace.Assert(DotNet3d.Vector.Dot(v15, v16) == 68); DotNet3d.Vector v17 = new DotNet3d.Vector(1, 2, 3); DotNet3d.Vector v18 = new DotNet3d.Vector(10, 11, 12); // Verified by https://www.symbolab.com/solver/Vector-cross-product-calculator Trace.Assert(DotNet3d.Vector.Cross(v17, v18).ToString() == "[-9 18 -9]\n"); DotNet3d.Vector v19 = new DotNet3d.Vector(1, 2, 3); v19 = -v19; Trace.Assert(v19.ToString() == "[-1 -2 -3]\n"); } }
private static void TestMatrix() { { var txt = ""; DotNet3d.Matrix m0 = new DotNet3d.Matrix(); txt = " 1 0 0 0\n" + " 0 1 0 0\n" + " 0 0 1 0\n" + " 0 0 0 1\n"; var str = m0.ToString(); Trace.Assert(str == txt); DotNet3d.Matrix m1 = new DotNet3d.Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); txt = " 1 2 3 4\n" + " 5 6 7 8\n" + " 9 10 11 12\n" + " 13 14 15 16\n"; Trace.Assert(m1.ToString() == txt); { double[] _array = new double[9] { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; DotNet3d.Matrix _m = new DotNet3d.Matrix(_array); var _txt = " 1 2 3 0\n" + " 4 5 6 0\n" + " 7 8 9 0\n" + " 0 0 0 1\n"; Trace.Assert(_m.ToString() == _txt); } DotNet3d.Matrix m2 = new DotNet3d.Matrix(m1); Trace.Assert(m2.ToString() == txt); double[] array = new double[16] { 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; DotNet3d.Matrix m3 = new DotNet3d.Matrix(array); txt = " 16 15 14 13\n" + " 12 11 10 9\n" + " 8 7 6 5\n" + " 4 3 2 1\n"; Trace.Assert(m3.ToString() == txt); DotNet3d.Vector vx = new DotNet3d.Vector(1, 1, 1); DotNet3d.Vector vy = new DotNet3d.Vector(2, 2, 2); DotNet3d.Vector vz = new DotNet3d.Vector(3, 3, 3); DotNet3d.Matrix m4 = new DotNet3d.Matrix(vx, vy, vz); txt = " 1 2 3 0\n" + " 1 2 3 0\n" + " 1 2 3 0\n" + " 0 0 0 1\n"; Trace.Assert(m4.ToString() == txt); DotNet3d.Matrix m5 = new DotNet3d.Matrix(); m5.Translate(1, 2, 3); txt = " 1 0 0 1\n" + " 0 1 0 2\n" + " 0 0 1 3\n" + " 0 0 0 1\n"; Trace.Assert(m5.ToString() == txt); DotNet3d.Matrix m6 = new DotNet3d.Matrix(); m6.Translate(vx); txt = " 1 0 0 1\n" + " 0 1 0 1\n" + " 0 0 1 1\n" + " 0 0 0 1\n"; Trace.Assert(m6.ToString() == txt); DotNet3d.Matrix m7 = new DotNet3d.Matrix(); m7.Scale(2, 4, 8); txt = " 2 0 0 0\n" + " 0 4 0 0\n" + " 0 0 8 0\n" + " 0 0 0 1\n"; Trace.Assert(m7.ToString() == txt); DotNet3d.Matrix m8 = new DotNet3d.Matrix(); m8.RotateX(90); str = m8.ToString(); txt = " 1 0 0 0\n" + " 0 0 -1 0\n" + " 0 1 0 0\n" + " 0 0 0 1\n"; Trace.Assert(str == txt); DotNet3d.Matrix m9 = new DotNet3d.Matrix(); m9.RotateY(90); txt = " 0 0 1 0\n" + " 0 1 0 0\n" + " -1 0 0 0\n" + " 0 0 0 1\n"; Trace.Assert(m9.ToString() == txt); DotNet3d.Matrix m10 = new DotNet3d.Matrix(); m10.RotateZ(90); txt = " 0 -1 0 0\n" + " 1 0 0 0\n" + " 0 0 1 0\n" + " 0 0 0 1\n"; Trace.Assert(m10.ToString() == txt); DotNet3d.Matrix m11 = new DotNet3d.Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); Trace.Assert(m11.Determinate() == 0); DotNet3d.Matrix m12 = new DotNet3d.Matrix(7, 6, 5, 4, 1, 2, 3, 4, 9, 8, 7, 6, 2, 4, 6, 8); m12.Invert(); // determinate is zero (ie not invertable), divide by zero gives NaN txt = " NaN NaN NaN NaN\n" + " NaN NaN NaN NaN\n" + " NaN NaN NaN NaN\n" + " NaN NaN NaN NaN\n"; str = m12.ToString(); Trace.Assert(str == txt); DotNet3d.Matrix m13 = new DotNet3d.Matrix(7, 3, 5, 4, 3, 2, 3, 1, 9, 3, 7, 6, 1, 4, 6, 8); m13.Invert(); // Verified numbers are correct via http://matrix.reshish.com/inverse.php Trace.Assert(m13.M11 == 0.34090909090909094); Trace.Assert(m13.M12 == -0.22727272727272729); Trace.Assert(m13.M13 == -0.068181818181818177); Trace.Assert(m13.M14 == -0.090909090909090912); Trace.Assert(m13.M21 == 1.0340909090909092); Trace.Assert(m13.M22 == -0.022727272727272728); Trace.Assert(m13.M23 == -0.80681818181818188); Trace.Assert(m13.M24 == 0.090909090909090912); Trace.Assert(m13.M31 == -1.125); Trace.Assert(m13.M32 == 0.75); Trace.Assert(m13.M33 == 0.625); Trace.Assert(m13.M34 == 0); Trace.Assert(m13.M41 == 0.28409090909090912); Trace.Assert(m13.M42 == -0.52272727272727271); Trace.Assert(m13.M43 == -0.056818181818181823); Trace.Assert(m13.M44 == 0.090909090909090912); DotNet3d.Matrix m14 = DotNet3d.Matrix.Identity(); m14 = 3.0 * m14; txt = " 3 0 0 0\n" + " 0 3 0 0\n" + " 0 0 3 0\n" + " 0 0 0 3\n"; Trace.Assert(m14.ToString() == txt); DotNet3d.Matrix m15 = new DotNet3d.Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); DotNet3d.Matrix m16 = new DotNet3d.Matrix(3, 11, -3, 2, -2, 2, 99, 18, 59, 17, 121, 112, 3, 4, -5, 106); // answer verified by http://matrix.reshish.com/multCalculation.php txt = " 188 82 538 798\n" + " 440 218 1,386 1,750\n" + " 692 354 2,234 2,702\n" + " 944 490 3,082 3,654\n"; str = (m15 * m16).ToString(); Trace.Assert(str == txt); DotNet3d.Vector v1 = new DotNet3d.Vector(1, 2, 3); DotNet3d.Matrix m17 = DotNet3d.Matrix.Identity(); txt = "[1 2 3]\n"; str = (m17 * v1).ToString(); Trace.Assert(str == txt); DotNet3d.Point p1 = new DotNet3d.Point(3, 2, 1); txt = "(3 2 1)\n"; Trace.Assert((m17 * p1).ToString() == txt); txt = " 0 0 0 0\n" + " 0 0 0 0\n" + " 0 0 0 0\n" + " 0 0 0 0\n"; Trace.Assert(DotNet3d.Matrix.Zero().ToString() == txt); txt = " 1 0 0 1\n" + " 0 1 0 2\n" + " 0 0 1 3\n" + " 0 0 0 1\n"; Trace.Assert(DotNet3d.Matrix.Translation(1, 2, 3).ToString() == txt); Trace.Assert(DotNet3d.Matrix.Translation(new DotNet3d.Vector(1, 2, 3)).ToString() == txt); txt = " 2 0 0 0\n" + " 0 3 0 0\n" + " 0 0 4 0\n" + " 0 0 0 1\n"; Trace.Assert(DotNet3d.Matrix.Scaling(2, 3, 4).ToString() == txt); txt = " 1 0 0 0\n" + " 0 0 -1 0\n" + " 0 1 0 0\n" + " 0 0 0 1\n"; Trace.Assert(DotNet3d.Matrix.RotationX(90).ToString() == txt); txt = " 0 0 1 0\n" + " 0 1 0 0\n" + " -1 0 0 0\n" + " 0 0 0 1\n"; Trace.Assert(DotNet3d.Matrix.RotationY(90).ToString() == txt); txt = " 0 -1 0 0\n" + " 1 0 0 0\n" + " 0 0 1 0\n" + " 0 0 0 1\n"; Trace.Assert(DotNet3d.Matrix.RotationZ(90).ToString() == txt); DotNet3d.Matrix m18 = new DotNet3d.Matrix(16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1); txt = " 16 12 8 4\n" + " 15 11 7 3\n" + " 14 10 6 2\n" + " 13 9 5 1\n"; Trace.Assert(DotNet3d.Matrix.Transpose(m18).ToString() == txt); DotNet3d.Matrix m19 = new DotNet3d.Matrix(7, 3, 5, 4, 3, 2, 3, 1, 9, 3, 7, 6, 1, 4, 6, 8); // Verified numbers are correct via http://matrix.reshish.com/inverse.php txt = " 0.34 -0.23 -0.07 -0.09\n" + " 1.03 -0.02 -0.81 0.09\n" + " -1.13 0.75 0.63 0\n" + " 0.28 -0.52 -0.06 0.09\n"; var m19i = DotNet3d.Matrix.Invert(m19); str = m19i.ToString(); Trace.Assert(str == txt); Trace.Assert(m19i.M11 == 0.34090909090909094); Trace.Assert(m19i.M12 == -0.22727272727272729); Trace.Assert(m19i.M13 == -0.068181818181818177); Trace.Assert(m19i.M14 == -0.090909090909090912); Trace.Assert(m19i.M21 == 1.0340909090909092); Trace.Assert(m19i.M22 == -0.022727272727272728); Trace.Assert(m19i.M23 == -0.80681818181818188); Trace.Assert(m19i.M24 == 0.090909090909090912); Trace.Assert(m19i.M31 == -1.125); Trace.Assert(m19i.M32 == 0.75); Trace.Assert(m19i.M33 == 0.625); Trace.Assert(m19i.M34 == 0); Trace.Assert(m19i.M41 == 0.28409090909090912); Trace.Assert(m19i.M42 == -0.52272727272727271); Trace.Assert(m19i.M43 == -0.056818181818181823); Trace.Assert(m19i.M44 == 0.090909090909090912); } // Create matrix from 3x3 matrix { var m3x3 = new DotNet3d.Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9); var txt = " 1 2 3 0\n" + " 4 5 6 0\n" + " 7 8 9 0\n" + " 0 0 0 1\n"; Trace.Assert(m3x3.ToString() == txt); } // Add two matrices { var a = new DotNet3d.Matrix(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16); var b = new DotNet3d.Matrix(2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32); var txt = " 3 6 9 12\n" + " 15 18 21 24\n" + " 27 30 33 36\n" + " 39 42 45 48\n"; Trace.Assert((a + b).ToString() == txt); } }