// Token: 0x060002F1 RID: 753 RVA: 0x00030948 File Offset: 0x0002EB48 public static double[,] Inverse3(double[,] a) { double num = Determinant3(a); double[,] a2 = Adjugate3(a); return(MatrixMath.Multiply(a2, 1.0 / num)); }
public static Point4d operator *(Point4d point, Matrix4x4 matrix) { return(new Point4d(MatrixMath.Multiply(point.ToArray(), matrix.To2DArray()))); }
// Token: 0x060002FA RID: 762 RVA: 0x00030EF0 File Offset: 0x0002F0F0 private void ComputeVectors(double[,] A, Vector3d U2, int i0, int i1, int i2) { Vector3d vector; Vector3d vector2; GenerateComplementBasis(out vector, out vector2, U2); Vector3d v = MatrixMath.Multiply(A, vector.ToArray()).ToVector3d(); double num = mEigenvalue[i2] - vector.DotProduct(v); double num2 = vector2.DotProduct(v); Vector3d v2 = MatrixMath.Multiply(A, vector2.ToArray()).ToVector3d(); double num3 = mEigenvalue[i2] - vector2.DotProduct(v2); double num4 = Math.Abs(num); int num5 = 0; double num6 = Math.Abs(num2); if (num6 > num4) { num4 = num6; } num6 = Math.Abs(num3); if (num6 > num4) { num4 = num6; num5 = 1; } if (num4 >= 1E-08) { if (num5 == 0) { double num7 = 1.0 / Math.Sqrt(num * num + num2 * num2); num *= num7; num2 *= num7; mEigenvector[i2] = vector.Multiply(num2).Add(vector2.Multiply(num)); } else { double num7 = 1.0 / Math.Sqrt(num3 * num3 + num2 * num2); num3 *= num7; num2 *= num7; mEigenvector[i2] = vector.Multiply(num3).Add(vector2.Multiply(num2)); } } else if (num5 == 0) { mEigenvector[i2] = vector2; } else { mEigenvector[i2] = vector; } Vector3d vector3 = U2.CrossProduct(mEigenvector[i2]); v = MatrixMath.Multiply(A, U2.ToArray()).ToVector3d(); num = mEigenvalue[i0] - U2.DotProduct(v); num2 = vector3.DotProduct(v); Vector3d v3 = MatrixMath.Multiply(A, vector3.ToArray()).ToVector3d(); num3 = mEigenvalue[i0] - vector3.DotProduct(v3); num4 = Math.Abs(num); num5 = 0; num6 = Math.Abs(num2); if (num6 > num4) { num4 = num6; } num6 = Math.Abs(num3); if (num6 > num4) { num4 = num6; num5 = 1; } if (num4 >= 1E-08) { if (num5 == 0) { double num7 = 1.0 / Math.Sqrt(num * num + num2 * num2); num *= num7; num2 *= num7; mEigenvector[i0] = U2.Multiply(num2).Add(vector3.Multiply(num)); } else { double num7 = 1.0 / Math.Sqrt(num3 * num3 + num2 * num2); num3 *= num7; num2 *= num7; mEigenvector[i0] = U2.Multiply(num3).Add(vector3.Multiply(num2)); } } else if (num5 == 0) { mEigenvector[i0] = vector3; } else { mEigenvector[i0] = U2; } mEigenvector[i1] = mEigenvector[i2].CrossProduct(mEigenvector[i0]); }
internal void ComputeEigenStuff(double[,] A) { double num = Math.Abs(A[0, 0]); double num2 = Math.Abs(A[0, 1]); double num3 = Math.Abs(A[0, 2]); double num4 = Math.Abs(A[1, 1]); double num5 = Math.Abs(A[1, 2]); double num6 = Math.Abs(A[2, 2]); double num7 = MathEx.Max(new double[] { num, num2, num3, num4, num5, num6 }); double[,] array = A; if (num7 > 1.0) { double s = 1.0 / num7; array = MatrixMath.Multiply(A, s); } double[] array2 = new double[3]; ComputeRoots(array, array2); mEigenvalue[0] = array2[0]; mEigenvalue[1] = array2[1]; mEigenvalue[2] = array2[2]; double[] array3 = new double[3]; Vector3d[] array4 = new Vector3d[3]; for (int i = 0; i < 3; i++) { double[,] array5 = (double[, ])array.Clone(); array5[0, 0] -= mEigenvalue[i]; array5[1, 1] -= mEigenvalue[i]; array5[2, 2] -= mEigenvalue[i]; if (!IsPositiveRank(array5, ref array3[i], ref array4[i])) { if (num7 > 1.0) { for (int j = 0; j < 3; j++) { mEigenvalue[j] *= num7; } } mEigenvector[0] = Vector3dEx.AxisX; mEigenvector[1] = Vector3dEx.AxisY; mEigenvector[2] = Vector3dEx.AxisZ; return; } } double num8 = array3[0]; int num9 = 0; if (array3[1] > num8) { num8 = array3[1]; num9 = 1; } if (array3[2] > num8) { num9 = 2; } if (num9 == 0) { array4[0].Normalize(); ComputeVectors(array, array4[0], 1, 2, 0); } else if (num9 == 1) { array4[1].Normalize(); ComputeVectors(array, array4[1], 2, 0, 1); } else { array4[2].Normalize(); ComputeVectors(array, array4[2], 0, 1, 2); } if (num7 > 1.0) { for (int k = 0; k < 3; k++) { mEigenvalue[k] *= num7; } } }