// (1-t) * m1 + t * m2 SMetric3 interpolation (const SMetric3 &m1, const SMetric3 &m2, const double t) { SMetric3 im1 = m1.invert(); SMetric3 im2 = m2.invert(); im1 *= (1.-t); im2 *= t; im1 += im2; return im1.invert(); }
SMetric3 intersection (const SMetric3 &m1, const SMetric3 &m2) { SMetric3 im1 = m1.invert(); fullMatrix<double> V(3,3); fullVector<double> S(3); im1 *= m2; im1.eig(V,S,true); SVector3 v0(V(0,0),V(1,0),V(2,0)); SVector3 v1(V(0,1),V(1,1),V(2,1)); SVector3 v2(V(0,2),V(1,2),V(2,2)); double l0 = std::max(dot(v0,m1,v0),dot(v0,m2,v0)); double l1 = std::max(dot(v1,m1,v1),dot(v1,m2,v1)); double l2 = std::max(dot(v2,m1,v2),dot(v2,m2,v2)); // Correction from the PhD thesis of Frederic Alauzet p.16 // If m2 = alpha*m1, then take the largest metric static const double eps = 1.e-2; // Tolerance to detect triple eigenvalue (i.e. proportional metrics) const double max_eig = std::max(S(0), std::max(S(1), S(2))); const double min_eig = std::min(S(0), std::min(S(1), S(2))); const double range_eig = fabs((max_eig-min_eig)/max_eig); if (range_eig < eps) return (max_eig >= 1.) ? m2 : m1; SMetric3 iv(l0,l1,l2,v0,v1,v2); return iv; }
SMetric3 interpolation (const SMetric3 &m1, const SMetric3 &m2, const SMetric3 &m3, const double u, const double v) { SMetric3 im1 = m1.invert(); SMetric3 im2 = m2.invert(); SMetric3 im3 = m3.invert(); im1 *= (1.-u-v); im2 *= u; im3 *= v; im1 += im2; im1 += im3; return im1.invert(); }
SMetric3 interpolation (const SMetric3 &m1, const SMetric3 &m2, const SMetric3 &m3, const SMetric3 &m4, const double u, const double v, const double w) { SMetric3 im1 = m1.invert(); SMetric3 im2 = m2.invert(); SMetric3 im3 = m3.invert(); SMetric3 im4 = m4.invert(); im1 *= (1.-u-v-w); im2 *= u; im3 *= v; im4 *= w; im1 += im2; im1 += im3; im1 += im4; return im1.invert(); }