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); }
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); }
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); }
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); }
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); }
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); }
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); }
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)); }
public static double3x3 mul(double3x3 a, double3x3 b) { return(new double3x3(mul(a, b.m0), mul(a, b.m1), mul(a, b.m2))); }
public static double3 mul(double3x3 x, double3 v) { return(mad(x.m2, v.z, mad(x.m0, v.x, x.m1 * v.y))); }
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; }