Subversion Repositories gelsvn

Rev

Rev 357 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
39 bj 1
#include <iostream>
2
 
3
#include "QEM.h"
4
#include "LinAlg/LapackFunc.h"
5
 
6
using namespace LinAlg;
7
using namespace CGLA;
8
using namespace std;
9
 
10
namespace Geometry
11
{
357 jab 12
	Vec3d QEM::opt_pos(double sv_thresh, const CGLA::Vec3d& p0) const
39 bj 13
	{
315 jab 14
			CMatrix U,S,V;
15
			SVD(A,U,S,V);
16
			CMatrix Sp(3,3,0.0);
17
 
18
			double s00 = S.get(0,0);
19
			double limit = sv_thresh * s00;
20
 
21
			Sp.set(0,0,1.0/s00);
357 jab 22
			Vec3d diff(0.0);
315 jab 23
			for(int i=1;i<3;++i)
24
			{
25
					double sii = S.get(i,i);
26
					if(sii < limit)
357 jab 27
					{
28
						Sp.set(i,i,0.0);
29
						Vec3d vi(V.get(0,i), V.get(1,i), V.get(2,i));
30
						diff += vi*dot(vi, p0);
31
					}
315 jab 32
					else
357 jab 33
						Sp.set(i,i,1.0/sii);
315 jab 34
			}
35
 
36
			CMatrix Ap = V * Sp * U.Transposed();
37
 
220 jab 38
			CVector x(3);
315 jab 39
			x = Ap * (b*0.5);
40
 
357 jab 41
			return diff-Vec3d(x[0],x[1],x[2]);
220 jab 42
	}
39 bj 43
 
44
}