// Token: 0x060002F9 RID: 761 RVA: 0x00030E84 File Offset: 0x0002F084 private bool IsPositiveRank(double[,] M, ref double maxEntry, ref Vector3d maxRow) { maxEntry = -1.0; int i = -1; for (int j = 0; j < 3; j++) { for (int k = j; k < 3; k++) { double num = Math.Abs(M[j, k]); if (num > maxEntry) { maxEntry = num; i = j; } } } maxRow = MatrixMath.GetRow(M, i).ToVector3d(); return(maxEntry >= 1E-08); }
// Token: 0x06000324 RID: 804 RVA: 0x00031F98 File Offset: 0x00030198 private static double[] ChordalNodesU(Point3d[,] intPoints) { int length = intPoints.GetLength(0); int length2 = intPoints.GetLength(1); Point3d[] intPoints2 = new Point3d[length2]; double[,] array = new double[length, length2]; for (int i = 0; i < length; i++) { intPoints2 = MatrixMath.GetRow(intPoints, i); double[] array2 = SplineMath.ChordalNodes(intPoints2); for (int j = 0; j < length2; j++) { array[i, j] = array2[j]; } } double[] array3 = new double[length2]; for (int k = 0; k < length2; k++) { array3[k] = MathEx.Mean(MatrixMath.GetColumn(array, k)); } return(array3); }
/// <summary> /// 使用二维数组来初始化 Matrix3x3 /// </summary> /// <param name="orientaition"></param> public static Matrix3x3 Create(double[,] orientaition) { return(Create(MatrixMath.GetRow(orientaition, 0), MatrixMath.GetRow(orientaition, 1), MatrixMath.GetRow(orientaition, 2))); }
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; } } }
// Token: 0x060002EA RID: 746 RVA: 0x00030528 File Offset: 0x0002E728 public static double[] BackSolve(double[,] a, int[] index, double[] b) { double[] array = MatrixMath.Copy(b); BackSubstitution(a, index, array); return(array); }