示例#1
0
    public Vector3 Solve(double svd_tol, int svd_sweeps, double pinv_tol)
    {
        if (QefData.numPoints == 0)
        {
            throw new ArgumentException("...");
        }

        massPoint  = QefData.massPoint;
        massPoint /= QefData.numPoints;
        SetAta();
        SetAtb();
        atb -= MatUtils.VMuSymmetric(ata, massPoint);
        x    = Vector3.Zero;
        double result = SVD.SolveSymmetric(ata, atb, out x, svd_tol, svd_sweeps, pinv_tol);

        if (double.IsNaN(result))
        {
            x = massPoint;
        }
        else
        {
            x += massPoint;
        }
        SetAtb();
        hasSolution = true;
        return(x);
    }
示例#2
0
    public double GetError(Vector3 pos)
    {
        if (!hasSolution)
        {
            SetAta();
            SetAtb();
        }

        Vector3 atax = MatUtils.VMuSymmetric(ata, pos);

        return(pos.Dot(atax) - 2 * pos.Dot(atb) + QefData.btb);
    }