예제 #1
0
            // 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);
            }
예제 #2
0
        // 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);
        }
예제 #3
0
 /// <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)));
 }
예제 #4
0
 public static Point4d operator *(Point4d point, Matrix4x4 matrix)
 {
     return(new Point4d(MatrixMath.Multiply(point.ToArray(), matrix.To2DArray())));
 }
예제 #5
0
            // 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]);
            }
예제 #6
0
            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;
                    }
                }
            }
예제 #7
0
 // 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);
 }