public void double3x3_operator_not_equal_wide_wide()
        {
            double3x3 a0 = double3x3(430.8425316432689, 104.69001798736394, 225.80243478799355, -310.57017841496048, -418.61945815506363, 304.12820281839379, -509.32682561749908, -160.53807719076895, -203.30197606016975);
            double3x3 b0 = double3x3(210.02470622305975, -55.203330304102678, -269.92533672504373, -234.54673372700194, 25.917412054686565, -63.726991444699024, -484.55371092471933, -425.333599050219, -53.274394775402925);
            bool3x3   r0 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a0 != b0, r0);

            double3x3 a1 = double3x3(-505.76325368590807, 162.17220623892365, 1.1561973100324394, 65.662074358045174, 102.78780250567377, 172.93008120960099, 26.621009123800832, 235.12595259171258, 128.54198533321824);
            double3x3 b1 = double3x3(328.1944192984115, 15.963139303011417, 461.71412417931208, -113.36304455313973, -240.07297264787974, 495.11916970420589, 203.5583661550462, 340.49345103860526, -241.90719448863865);
            bool3x3   r1 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a1 != b1, r1);

            double3x3 a2 = double3x3(-354.99697630246959, 334.35948220564023, -495.83200692377613, 468.30740163675853, 458.37094733601941, 299.93733300824522, 43.12718560319729, -354.71349994964595, -145.2871955117617);
            double3x3 b2 = double3x3(459.56982896270688, 213.0737384357833, -384.7828506831, -255.07233846144396, 477.66343115161328, -248.03662621604121, -407.92344565313471, -199.78886971240343, 151.84326488889906);
            bool3x3   r2 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a2 != b2, r2);

            double3x3 a3 = double3x3(390.80186218340032, -303.13149108697263, 391.13459533785215, 139.2868607692825, 104.52318506339714, 511.29640293088573, 213.1470559635884, -101.09569625793756, 441.6633772522506);
            double3x3 b3 = double3x3(-97.120607659742518, 154.97589380805187, -172.83452065886672, 441.5027942329192, -401.73862785926957, -411.43016333665241, -337.8202766561044, -430.63088270213029, -150.87180502287663);
            bool3x3   r3 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a3 != b3, r3);
        }
        public void double3x3_operator_equal_wide_wide()
        {
            double3x3 a0 = double3x3(492.15758275061728, -495.20632027797694, 227.45765195947968, -147.37405950733182, -222.68201909897942, 64.093720704360749, -23.890404473939157, -16.8197190839889, 163.23210890741655);
            double3x3 b0 = double3x3(192.56880888369346, -235.61102472786376, -254.04311740307281, -412.62472052715009, 471.90480945627428, -6.4727852374654162, -339.10237447316865, 488.1875700839737, -379.5965842584132);
            bool3x3   r0 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a0 == b0, r0);

            double3x3 a1 = double3x3(-165.27101071424363, 470.87767980568003, -423.94255967808078, 109.63436918595539, 462.69031283943468, -335.38147727371262, 357.23446934168896, 1.5455777652308598, -347.38824741327585);
            double3x3 b1 = double3x3(-308.41700258311675, -82.333374300195544, -102.92108087563935, 226.51573835430463, -356.90132896830391, -362.91277544708589, -427.89843746083716, 466.65013978753711, -102.79904680270658);
            bool3x3   r1 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a1 == b1, r1);

            double3x3 a2 = double3x3(-114.47217302884542, 435.84865804940864, 194.23808607563285, 138.76554710174241, -467.34914205379278, 370.43337767684523, 476.70826147343416, 320.55264702465047, -498.59197377534207);
            double3x3 b2 = double3x3(-43.355954428834821, 85.045664111639212, -91.127054972167628, 422.19208856215334, -477.43130873024057, 1.8770024785198984, 312.5800799394865, 254.59934365684137, 352.72583763335172);
            bool3x3   r2 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a2 == b2, r2);

            double3x3 a3 = double3x3(92.4169581366782, 104.51136856177425, 166.75460608618084, -204.73343024250744, 434.75675674656259, -397.32965988541469, 503.98163699730378, -503.7141270598928, 90.659743112819115);
            double3x3 b3 = double3x3(62.490957050812881, 119.71476059766246, -511.05808639482507, -302.47273053902791, -371.76924365189359, -20.007841834802093, 21.459455738523729, -426.02067228128232, -305.41193666374863);
            bool3x3   r3 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a3 == b3, r3);
        }
        public void double3x3_operator_equal_scalar_wide()
        {
            double    a0 = (-253.39728534100453);
            double3x3 b0 = double3x3(19.952187785856495, -185.79199346610903, 407.8136052600172, -87.2766969610363, -206.27469382354741, 160.503138855334, -274.77081478516141, -2.6315281403397535, 448.35453602688131);
            bool3x3   r0 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a0 == b0, r0);

            double    a1 = (-410.03524251004461);
            double3x3 b1 = double3x3(247.32901465489022, 355.53915350303942, -298.06671180299793, 414.10151429385951, -481.30262707234482, 196.55074438664633, 34.60100008668428, 113.76156645350227, -386.45337861890596);
            bool3x3   r1 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a1 == b1, r1);

            double    a2 = (-124.49174672201821);
            double3x3 b2 = double3x3(243.8866447153905, -492.6181826501238, 145.424413033493, 421.55070968230757, -95.409988209330493, 336.80928746648567, 209.58380589707929, 487.441424358376, 161.80653365040507);
            bool3x3   r2 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a2 == b2, r2);

            double    a3 = (149.84247095409899);
            double3x3 b3 = double3x3(225.723996505944, -71.21880176999548, 85.780251781353854, 192.547256797807, -49.887493395194156, -229.80195652218629, -103.40733413743197, 19.215747126944279, 492.88110827509365);
            bool3x3   r3 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a3 == b3, r3);
        }
        public void double3x3_operator_equal_wide_scalar()
        {
            double3x3 a0 = double3x3(-303.2300766926399, 451.52631327674089, -253.65587413201848, -105.20363502632995, -500.6910920090466, -426.19248338518315, 159.87609656149334, -59.558379439431405, -57.477391031327386);
            double    b0 = (123.5445759871717);
            bool3x3   r0 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a0 == b0, r0);

            double3x3 a1 = double3x3(-182.0497396840014, 370.88599866017978, -172.03530629539642, 455.40001198993991, -11.338988547836891, 363.93823044557973, -27.150561106927, -325.97606507221985, -290.35904254129116);
            double    b1 = (406.51375861024189);
            bool3x3   r1 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a1 == b1, r1);

            double3x3 a2 = double3x3(180.19686635779067, -439.35894295170851, -126.54608899287234, -197.2617896521752, -227.15933357326281, -479.8991937487848, -439.77767750237962, -495.23734902555, -224.51705013239621);
            double    b2 = (-374.12832015293105);
            bool3x3   r2 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a2 == b2, r2);

            double3x3 a3 = double3x3(-422.83322616239695, -20.106708774392814, 297.37999906082632, 185.9665759475746, -102.97598962810633, -220.59704910060253, -228.686854707397, -333.00125972041917, 434.2130317325765);
            double    b3 = (-450.19627043707123);
            bool3x3   r3 = bool3x3(false, false, false, false, false, false, false, false, false);

            TestUtils.AreEqual(a3 == b3, r3);
        }
        public void double3x3_operator_not_equal_scalar_wide()
        {
            double    a0 = (275.79582823244664);
            double3x3 b0 = double3x3(-57.196896341255353, -382.4325279586169, 97.820359990848374, -161.46364529499022, -458.39563367254829, -499.61786364932448, 327.92217818271467, 367.57121699283425, 59.7863667289663);
            bool3x3   r0 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a0 != b0, r0);

            double    a1 = (-209.58068118318016);
            double3x3 b1 = double3x3(-62.580453186566217, -479.97497604786184, -49.494519495169868, -114.68521338081229, 109.93924599044919, -176.28482755286842, -347.48529903380449, 85.540928165214609, -356.65954868712441);
            bool3x3   r1 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a1 != b1, r1);

            double    a2 = (-104.24357490625397);
            double3x3 b2 = double3x3(-133.54918605347592, 243.53971135036079, 13.141311890045813, -379.98594754747393, -41.281226892620907, 87.911684792447659, -339.07727996403224, -371.82034533648766, 333.14425936953364);
            bool3x3   r2 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a2 != b2, r2);

            double    a3 = (294.81196011920088);
            double3x3 b3 = double3x3(-187.14565977228136, 220.19225774528093, -228.18207250730234, -499.72373914146971, 97.4059055305114, 501.60439395420462, 459.67539880223353, 158.09812290877949, 358.48858921531985);
            bool3x3   r3 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a3 != b3, r3);
        }
        public void double3x3_operator_not_equal_wide_scalar()
        {
            double3x3 a0 = double3x3(-16.914588697680529, 168.83411486858233, -462.71352145760949, 130.30776959765137, 214.50161443208424, -440.26328178879959, -197.12796053529155, -169.09985860115842, -386.61117595555783);
            double    b0 = (-145.37277109239847);
            bool3x3   r0 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a0 != b0, r0);

            double3x3 a1 = double3x3(-281.02101362916687, -403.96372313236992, -269.80570877241234, 299.65422763473089, -71.750904831919286, -432.75573917513515, -457.36312100727258, -13.519590622521719, 273.87305773136814);
            double    b1 = (-270.26885593601912);
            bool3x3   r1 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a1 != b1, r1);

            double3x3 a2 = double3x3(185.042454567292, 116.39514427836764, 511.73495578753523, 230.50753628020527, 100.27476768394683, 129.68240863163135, 321.17879048044733, -220.63900409482375, 140.33521921016984);
            double    b2 = (-482.53069351731364);
            bool3x3   r2 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a2 != b2, r2);

            double3x3 a3 = double3x3(369.2123617461009, -333.66624871532724, -373.93775218256644, 150.20429451307484, -442.16476627912596, 372.32001488856974, -95.837970539852051, 495.56669663617697, -5.385580780629823);
            double    b3 = (453.81121489676241);
            bool3x3   r3 = bool3x3(true, true, true, true, true, true, true, true, true);

            TestUtils.AreEqual(a3 != b3, r3);
        }
Exemplo n.º 7
0
        public static double4x4 lookRotationToMatrix(double3 position, double3 forward, double3 up)
        {
            double3x3 rot = lookRotationToMatrix(forward, up);

            double4x4 matrix;

            matrix.m0 = new double4(rot.m0, 0.0F);
            matrix.m1 = new double4(rot.m1, 0.0F);
            matrix.m2 = new double4(rot.m2, 0.0F);
            matrix.m3 = new double4(position, 1.0F);

            return(matrix);
        }
Exemplo n.º 8
0
        public static double3x3 orthogonalize(double3x3 i)
        {
            double3x3 o;

            double3 u = i.m0;
            double3 v = i.m1 - i.m0 * math.dot(i.m1, i.m0);

            double lenU = math.length(u);
            double lenV = math.length(v);

            bool c = lenU > epsilon_normal && lenV > epsilon_normal;

            o.m0 = math.select_d(new double3(1, 0, 0), u / lenU, c);
            o.m1 = math.select_d(new double3(0, 1, 0), v / lenV, c);
            o.m2 = math.cross(o.m0, o.m1);

            return(o);
        }
Exemplo n.º 9
0
 public static void AreEqual(double3x3 a, double3x3 b, int maxUlp, bool signedZeroEqual)
 {
     AreEqual(a.c0, b.c0, maxUlp, signedZeroEqual);
     AreEqual(a.c1, b.c1, maxUlp, signedZeroEqual);
     AreEqual(a.c2, b.c2, maxUlp, signedZeroEqual);
 }
Exemplo n.º 10
0
 public static void AreEqual(double3x3 a, double3x3 b, double delta = 0.0)
 {
     AreEqual(a.c0, b.c0, delta);
     AreEqual(a.c1, b.c1, delta);
     AreEqual(a.c2, b.c2, delta);
 }
Exemplo n.º 11
0
 public static void AreEqual(double3x3 expected, double3x3 actual, int maxUlp, bool signedZeroEqual)
 {
     AreEqual(expected.c0, actual.c0, maxUlp, signedZeroEqual);
     AreEqual(expected.c1, actual.c1, maxUlp, signedZeroEqual);
     AreEqual(expected.c2, actual.c2, maxUlp, signedZeroEqual);
 }
Exemplo n.º 12
0
 public static void AreEqual(double3x3 expected, double3x3 actual, double delta = 0.0)
 {
     AreEqual(expected.c0, actual.c0, delta);
     AreEqual(expected.c1, actual.c1, delta);
     AreEqual(expected.c2, actual.c2, delta);
 }
Exemplo n.º 13
0
 public static double3x3 transpose(double3x3 i)
 {
     return(new double3x3(i.m0.x, i.m1.x, i.m2.x, i.m0.y, i.m1.y, i.m2.y, i.m0.z, i.m1.z, i.m2.z));
 }
Exemplo n.º 14
0
 public static double3x3 mul(double3x3 a, double3x3 b)
 {
     return(new double3x3(mul(a, b.m0), mul(a, b.m1), mul(a, b.m2)));
 }
Exemplo n.º 15
0
 public static double3 mul(double3x3 x, double3 v)
 {
     return(mad(x.m2, v.z, mad(x.m0, v.x, x.m1 * v.y)));
 }
Exemplo n.º 16
0
        public SymmetricEigenSolver(double a00, double a01, double a02, double a11, double a12, double a22)
        {
            evec = new double3x3();
            eval = new double3();

            //
            // Precondition the matrix by factoring out the maximum absolute value
            // of the components. This guards against floating-point overflow when
            // computing the eigenvalues.
            //

            var max0 = math.max(math.abs(a00), math.abs(a01));
            var max1 = math.max(math.abs(a02), math.abs(a11));
            var max2 = math.max(math.abs(a12), math.abs(a22));

            var maxAbsElement = math.max(math.max(max0, max1), max2);

            if (maxAbsElement == 0)
            {
                //
                // A is the zero matrix.
                //

                eval[0] = 0;
                eval[1] = 0;
                eval[2] = 0;

                evec[0] = new double3(1, 0, 0);
                evec[1] = new double3(0, 1, 0);
                evec[2] = new double3(0, 0, 1);

                return;
            }

            var invMaxAbsElement = 1 / maxAbsElement;

            a00 *= invMaxAbsElement;
            a01 *= invMaxAbsElement;
            a02 *= invMaxAbsElement;
            a11 *= invMaxAbsElement;
            a12 *= invMaxAbsElement;
            a22 *= invMaxAbsElement;

            var norm = a01 * a01 + a02 * a02 + a12 * a12;

            if (norm > 0)
            {
                //
                // Compute the eigenvalues of A. The acos(z) function requires |z| <= 1,
                // but will fail silently and return NaN if the input is larger than 1 in
                // magnitude. To avoid this condition due to rounding errors, the halfDet
                // value is clamped to [-1,1].
                //

                var traceDiv3 = (a00 + a11 + a22) / 3;

                var b00 = a00 - traceDiv3;
                var b11 = a11 - traceDiv3;
                var b22 = a22 - traceDiv3;

                var denom = math.sqrt((b00 * b00 + b11 * b11 + b22 * b22 + norm * 2) / 6);

                var c00 = b11 * b22 - a12 * a12;
                var c01 = a01 * b22 - a12 * a02;
                var c02 = a01 * a12 - b11 * a02;

                var det = (b00 * c00 - a01 * c01 + a02 * c02) / (denom * denom * denom);

                var halfDet = det * 0.5;

                halfDet = math.min(math.max(halfDet, -1), 1);

                //
                // The eigenvalues of B are ordered as beta0 <= beta1 <= beta2.  The
                // number of digits in twoThirdsPi is chosen so that, whether float or
                // double, the floating-point number is the closest to theoretical 2*pi/3.
                //

                var angle       = math.acos(halfDet) / 3;
                var twoThirdsPi = 2.09439510239319549;
                var beta2       = math.cos(angle) * 2;
                var beta0       = math.cos(angle + twoThirdsPi) * 2;
                var beta1       = -(beta0 + beta2);

                //
                // The eigenvalues of A are ordered as alpha0 <= alpha1 <= alpha2.
                //

                eval[0] = traceDiv3 + denom * beta0;
                eval[1] = traceDiv3 + denom * beta1;
                eval[2] = traceDiv3 + denom * beta2;

                //
                // The index i0 corresponds to the root guaranteed to have multiplicity 1
                // and goes with either the maximum root or the minimum root. The index
                // i2 goes with the root of the opposite extreme. Root beta2 is always
                // between beta0 and beta1.
                //

                int i0, i2, i1 = 1;

                if (halfDet >= 0)
                {
                    i0 = 2;
                    i2 = 0;
                }
                else
                {
                    i0 = 0;
                    i2 = 2;
                }

                //
                // Compute the eigenvectors. The set { evec[0], evec[1], evec[2] } is
                // right handed and orthonormal.
                //

                evec[i0] = ComputeEigenvector0(a00, a01, a02, a11, a12, a22, eval[i0]);
                evec[i1] = ComputeEigenvector1(a00, a01, a02, a11, a12, a22, evec[i0], eval[i1]);
                evec[i2] = math.cross(evec[i0], evec[i1]);
            }
            else
            {
                //
                // The matrix is diagonal.
                //

                eval[0] = a00;
                eval[1] = a11;
                eval[2] = a22;

                evec[0] = new double3(1, 0, 0);
                evec[1] = new double3(0, 1, 0);
                evec[2] = new double3(0, 0, 1);
            }

            //
            // The preconditioning scaled the matrix A, which scales the eigenvalues.
            // Revert the scaling.
            //

            eval[0] *= maxAbsElement;
            eval[1] *= maxAbsElement;
            eval[2] *= maxAbsElement;
        }