From 43b85e9405fd78915431d3ae204edd52884f8328 Mon Sep 17 00:00:00 2001 From: ganovelli Date: Fri, 18 Nov 2005 14:46:23 +0000 Subject: [PATCH] created --- vcg/math/polar_decomposition.h | 80 ++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 vcg/math/polar_decomposition.h diff --git a/vcg/math/polar_decomposition.h b/vcg/math/polar_decomposition.h new file mode 100644 index 00000000..053cdf30 --- /dev/null +++ b/vcg/math/polar_decomposition.h @@ -0,0 +1,80 @@ +/**************************************************************************** +* VCGLib o o * +* Visual and Computer Graphics Library o o * +* _ O _ * +* Copyright(C) 2004 \/)\/ * +* Visual Computing Lab /\/| * +* ISTI - Italian National Research Council | * +* \ * +* All rights reserved. * +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +* This program is distributed in the hope that it will be useful, * +* but WITHOUT ANY WARRANTY; without even the implied warranty of * +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * +* GNU General Public License (http://www.gnu.org/licenses/gpl.txt) * +* for more details. * +* * +****************************************************************************/ +/**************************************************************************** + History + +$Log: not supported by cvs2svn $ + + +****************************************************************************/ +#ifndef POLAR_DECOMPOSITION_VCG +#define POLAR_DECOMPOSITION_VCG + + +#include +#include +#include + +namespace vcg{ + + /** \addtogroup math */ + /* @{ */ + /// Extract the rotational part of a matrix by polar decomposition + /// m = R*S. Polar decomposition is computed by taking r = m * sqrt(m^t*m)^{-1} +template +void RotationalPartByPolarDecomposition( const vcg::Matrix33 & m, vcg::Matrix33 &r ){ + + vcg::Matrix33 tmp,s; + + r.SetZero(); + s.SetZero(); + + tmp= m; + tmp.Transpose(); + tmp = m*tmp; + + Matrix33 res; + Point3 e; + + bool ss = SingularValueDecomposition >(tmp,&e[0],res); + + res.Transpose(); + e[0]=math::Sqrt(e[0]); + e[1]=math::Sqrt(e[1]); + e[2]=math::Sqrt(e[2]); + tmp = tmp*Matrix33Diag(e)*res; + + bool s1 = SingularValueDecomposition >(tmp,&e[0],res); + tmp.Transpose(); + e[0]=1/e[0]; + e[1]=1/e[1]; + e[2]=1/e[2]; + + tmp = res*Matrix33Diag(e)*tmp; + + r = m*tmp; +} + +/*! @} */ +}; +#endif