예제 #1
0
        /// <summary>
        /// Maximum of the absolute value of all Eigenvalues of <paramref name="H"/>.
        /// </summary>
        static public double MaxAbsEigen(double[,] H)
        {
            var linalg = new ManagedLinearAlgebraProvider();

            double Eigen;
            int    N = H.GetLength(0);

            double[] Matrix    = H.Resize(false);
            double[] EigenVect = new double[Matrix.Length];
            double[] diagM     = new double[Matrix.Length];
            System.Numerics.Complex[] EigenValues = new System.Numerics.Complex[N];
            linalg.EigenDecomp(false, N, Matrix, EigenVect, EigenValues, diagM);
            Eigen = EigenValues.Select(ev => Complex.Abs(ev)).Max();
            return(Eigen);
        }
예제 #2
0
        public Vector3D[] identifyMajorAxes()
        {
            Vector3D[] majorAxes        = new Vector3D[3];
            double[]   covarianceMatrix = covariance();

            double[]  eigenVectors  = new double[9];
            Complex[] eigenValues   = new Complex[3];
            double[]  eigenVectorsM = new double[9];

            ManagedLinearAlgebraProvider pca = new ManagedLinearAlgebraProvider();

            pca.EigenDecomp(true, 3, covarianceMatrix, eigenVectors, eigenValues, eigenVectorsM);

            // major axis
            majorAxes[0]   = new Vector3D();
            majorAxes[0].X = eigenVectors[6];
            majorAxes[0].Y = eigenVectors[7];
            majorAxes[0].Z = eigenVectors[8];

            majorAxes[1]   = new Vector3D();
            majorAxes[1].X = eigenVectors[3];
            majorAxes[1].Y = eigenVectors[4];
            majorAxes[1].Z = eigenVectors[5];

            majorAxes[2]   = new Vector3D();
            majorAxes[2].X = eigenVectors[0];
            majorAxes[2].Y = eigenVectors[1];
            majorAxes[2].Z = eigenVectors[2];

            _transformMatrix = new Matrix3D(majorAxes[0].X, majorAxes[1].X, majorAxes[2].X, 0,
                                            majorAxes[0].Y, majorAxes[1].Y, majorAxes[2].Y, 0,
                                            majorAxes[0].Z, majorAxes[1].Z, majorAxes[2].Z, 0,
                                            -Centroid.X, -Centroid.Y, -Centroid.Z, 1);

            List <Point3D> trOBBV = transformPointSet();
            BoundingBox3D  trOBB  = new BoundingBox3D(trOBBV);

            OBB = transformBackPointSet(trOBB.BBVertices);
            return(majorAxes);
        }
        public static Plane PlaneFromDepthData(Float4[,] Data, Region region)
        {
            int   width  = Data.GetLength(0);
            int   height = Data.GetLength(1);
            Plane P      = new Plane();
            //Area selection
            int     minX   = (region.MinX < 0 ? 0 : region.MinX);
            int     maxX   = (region.MaxX > width ? width : region.MaxX);
            int     minY   = (region.MinY < 0 ? 0 : region.MinY);
            int     maxY   = (region.MaxY > height ? height : region.MaxY);
            int     jumpX  = width - (maxX - minX);
            int     startX = minY * width + minX;
            int     count  = 0;
            Vector3 pos    = Vector3.Zero;

            unsafe
            {
                fixed(Float4 *sData = &Data[0, 0])
                {
                    //Calculate origin
                    Float4 *pData = sData + startX;

                    for (int y = minY; y < maxY; y++)
                    {
                        for (int x = minX; x < maxX; x++)
                        {
                            pData++;
                            if (region.Covered(x, y) && pData->W != 0f)
                            {
                                pos.X += pData->X;
                                pos.Y += pData->Y;
                                pos.Z += pData->Z;
                                count++;
                            }
                        }
                        pData += jumpX;
                    }
                    pos     /= count;
                    P.Origin = new Vector3(pos.X, pos.Y, pos.Z);

                    //Calculate normal
                    double x2, y2, z2, xy, xz, yz;

                    x2 = y2 = z2 = xy = xz = yz = 0;
                    double rx, ry, rz;

                    pData = sData + startX;
                    for (int y = minY; y < maxY; y++)
                    {
                        for (int x = minX; x < maxX; x++)
                        {
                            pData++;
                            if (region.Covered(x, y) && pData->W != 0f)
                            {
                                pos = new Vector3(pData->X, pData->Y, pData->Z);
                                rx  = pos.X - P.Origin.X;
                                ry  = pos.Y - P.Origin.Y;
                                rz  = pos.Z - P.Origin.Z;
                                x2 += rx * rx;
                                y2 += ry * ry;
                                z2 += rz * rz;
                                xy += rx * ry;
                                xz += rx * rz;
                                yz += ry * rz;
                            }
                        }
                        pData += jumpX;
                    }
                    ManagedLinearAlgebraProvider linear = new ManagedLinearAlgebraProvider();

                    double[]  matrix       = new double[] { x2, xy, xz, xy, y2, yz, xz, yz, z2 };
                    double[]  eigenVectors = new double[9];
                    Complex[] eigenValues  = new Complex[3];
                    double[]  matrixD      = new double[9];
                    linear.EigenDecomp(true, 3, matrix, eigenVectors, eigenValues, matrixD);
                    P.Normal = new Vector3(eigenVectors[0], eigenVectors[1], eigenVectors[2]);
                }
            }
            return(P);
        }