Esempio n. 1
0
        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");
            }
        }
Esempio n. 2
0
        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);
            }
        }