예제 #1
0
    private double[] fitNearestSurface(List <DistanceAndPoint> distancesAndPoints, int n)
    {
        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca , for " + n + " points");
        }
        MatrixStats mc = getCovar(distancesAndPoints, n);

        OnePC pc1 = powerMethod(mc.covar);

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca1 " + pc1.pc[0] + ", " + pc1.pc[1] + ", " + pc1.pc[2]);
        }

        double[,] covar2 = new double[3, 3];
        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                covar2[i, j] = mc.covar[i, j] - (pc1.shrink * pc1.pc[i] * pc1.pc[j]);
            }
        }

        OnePC pc2 = powerMethod(covar2);

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca2 " + pc2.pc[0] + ", " + pc2.pc[1] + ", " + pc2.pc[2]);
        }

        //  c(x=y1 * z2 - z1 * y2, y=z1 * x2 - x1 * z2, z=x1 * y2 - y1 * x2)
        double[] planeCoefficients =
        {
            pc1.pc [1] * pc2.pc [2] - pc1.pc [2] * pc2.pc [1],
            pc1.pc [2] * pc2.pc [0] - pc1.pc [0] * pc2.pc [2],
            pc1.pc [0] * pc2.pc [1] - pc1.pc [1] * pc2.pc [0],
            0.0f
        };

        planeCoefficients[3] = planeCoefficients[0] * mc.mean[0] + planeCoefficients[1] * mc.mean[1] + planeCoefficients[2] * mc.mean[2];

        return(planeCoefficients);
    }
예제 #2
0
    private MatrixStats getCovar(List<DistanceAndPoint> distancesAndPoints, int n)
    {
        if (DEBUG) Debug.Log ("TangoUpdate pca start getCovar");

        Vector3 sum = new Vector3(0.0f, 0.0f, 0.0f);
        for (int i=0; i < n; i++) {
            sum += distancesAndPoints[i].point;
        }

        if (DEBUG) Debug.Log ("TangoUpdate pca vector sum " + sum.x + ", " + sum.y + ", " + sum.z);

        double[] mean = {sum.x / n, sum.y / n, sum.z / n};

        if (DEBUG) Debug.Log ("TangoUpdate pca vector mean " + mean[0] + ", " + mean[1] + ", " + mean[2]);

        double[,] covar = {{0,0,0}, {0,0,0}, {0,0,0}};

        if (DEBUG) Debug.Log ("TangoUpdate pca initial, " + covar[0,0] + "," + covar[0,1] + "," + covar[1,2]);

        for (int i=0; i < n; i++) {
            covar[0,0] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.x - mean[0]);
            covar[0,1] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.y - mean[1]);
            covar[0,2] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.z - mean[2]);
            covar[1,1] += (distancesAndPoints[i].point.y - mean[1]) * (distancesAndPoints[i].point.y - mean[1]);
            covar[1,2] += (distancesAndPoints[i].point.y - mean[1]) * (distancesAndPoints[i].point.z - mean[2]);
            covar[2,2] += (distancesAndPoints[i].point.z - mean[2]) * (distancesAndPoints[i].point.z - mean[2]);
        }
        covar [1, 0] = covar [0, 1];
        covar [2, 0] = covar [0, 2];
        covar [2, 1] = covar [1, 2];

        if (DEBUG) Debug.Log ("TangoUpdate pca , " + covar[0,0] + "," + covar[0,1] + "," + covar[1,2]);

        for (int i=0; i < 3; i++) {
            for (int j=0; j < 3; j++) {
                covar [i, j] /= (n - 1);
                if (DEBUG) Debug.Log ("TangoUpdate pca , " + i + "," + j + "," + covar[i,j]);
            }
        }

        MatrixStats mstats = new MatrixStats (mean, covar);

        return mstats;
    }
예제 #3
0
    private MatrixStats getCovar(List <DistanceAndPoint> distancesAndPoints, int n)
    {
        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca start getCovar");
        }

        Vector3 sum = new Vector3(0.0f, 0.0f, 0.0f);

        for (int i = 0; i < n; i++)
        {
            sum += distancesAndPoints[i].point;
        }

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca vector sum " + sum.x + ", " + sum.y + ", " + sum.z);
        }

        double[] mean = { sum.x / n, sum.y / n, sum.z / n };

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca vector mean " + mean[0] + ", " + mean[1] + ", " + mean[2]);
        }

        double[,] covar = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca initial, " + covar[0, 0] + "," + covar[0, 1] + "," + covar[1, 2]);
        }

        for (int i = 0; i < n; i++)
        {
            covar[0, 0] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.x - mean[0]);
            covar[0, 1] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.y - mean[1]);
            covar[0, 2] += (distancesAndPoints[i].point.x - mean[0]) * (distancesAndPoints[i].point.z - mean[2]);
            covar[1, 1] += (distancesAndPoints[i].point.y - mean[1]) * (distancesAndPoints[i].point.y - mean[1]);
            covar[1, 2] += (distancesAndPoints[i].point.y - mean[1]) * (distancesAndPoints[i].point.z - mean[2]);
            covar[2, 2] += (distancesAndPoints[i].point.z - mean[2]) * (distancesAndPoints[i].point.z - mean[2]);
        }
        covar [1, 0] = covar [0, 1];
        covar [2, 0] = covar [0, 2];
        covar [2, 1] = covar [1, 2];

        if (DEBUG)
        {
            Debug.Log("TangoUpdate pca , " + covar[0, 0] + "," + covar[0, 1] + "," + covar[1, 2]);
        }

        for (int i = 0; i < 3; i++)
        {
            for (int j = 0; j < 3; j++)
            {
                covar [i, j] /= (n - 1);
                if (DEBUG)
                {
                    Debug.Log("TangoUpdate pca , " + i + "," + j + "," + covar[i, j]);
                }
            }
        }


        MatrixStats mstats = new MatrixStats(mean, covar);

        return(mstats);
    }