Subversion Repositories gelsvn

Rev

Rev 315 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

#include <iostream>

#include "QEM.h"
#include "LinAlg/LapackFunc.h"

using namespace LinAlg;
using namespace CGLA;
using namespace std;

namespace Geometry
{
        Vec3d QEM::opt_pos(double sv_thresh, const CGLA::Vec3d& p0) const
        {
                        CMatrix U,S,V;
                        SVD(A,U,S,V);
                        CMatrix Sp(3,3,0.0);
                        
                        double s00 = S.get(0,0);
                        double limit = sv_thresh * s00;

                        Sp.set(0,0,1.0/s00);
                        Vec3d diff(0.0);
                        for(int i=1;i<3;++i)
                        {
                                        double sii = S.get(i,i);
                                        if(sii < limit)
                                        {
                                                Sp.set(i,i,0.0);
                                                Vec3d vi(V.get(0,i), V.get(1,i), V.get(2,i));
                                                diff += vi*dot(vi, p0);
                                        }
                                        else
                                                Sp.set(i,i,1.0/sii);
                        }

                        CMatrix Ap = V * Sp * U.Transposed();

                        CVector x(3);
                        x = Ap * (b*0.5);
                        
                        return diff-Vec3d(x[0],x[1],x[2]);
        }

}