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