// preserve orientation of the most anisotropic metric in 2D!!! SMetric3 intersection_conserve_mostaniso_2d (const SMetric3 &m1, const SMetric3 &m2) { fullMatrix<double> V1(3,3); fullVector<double> S1(3); m1.eig(V1,S1,false); double ratio1 = anisoRatio2D(V1(0,0),V1(1,0),V1(2,0), V1(0,1),V1(1,1),V1(2,1), V1(0,2),V1(1,2),V1(2,2), S1(0),S1(1),S1(2)); fullMatrix<double> V2(3,3); fullVector<double> S2(3); m2.eig(V2,S2,false); double ratio2 = anisoRatio2D(V2(0,0),V2(1,0),V2(2,0), V2(0,1),V2(1,1),V2(2,1), V2(0,2),V2(1,2),V2(2,2), S2(0),S2(1),S2(2)); if (ratio1 < ratio2) return intersection_conserveM1(m1, m2); else return intersection_conserveM1(m2, m1); }
// preserve orientation of the most anisotropic metric !!! SMetric3 intersection_conserve_mostaniso (const SMetric3 &m1, const SMetric3 &m2) { fullMatrix<double> V1(3,3); fullVector<double> S1(3); m1.eig(V1,S1,true); double ratio1 = fabs(S1(0)/S1(2)); // Minimum ratio because we take sorted eigenvalues fullMatrix<double> V2(3,3); fullVector<double> S2(3); m2.eig(V2,S2,true); double ratio2 = fabs(S2(0)/S2(2)); // Minimum ratio because we take sorted eigenvalues if (ratio1 < ratio2) return intersection_conserveM1(m1, m2); else return intersection_conserveM1(m2, m1); }
// preserve orientation of m1 !!! SMetric3 intersection_conserveM1 (const SMetric3 &m1, const SMetric3 &m2) { // we should do // return intersection (m1,m2); fullMatrix<double> V(3,3); fullVector<double> S(3); m1.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)); SMetric3 iv(l0,l1,l2,v0,v1,v2); return iv; }
surfacePointWithExclusionRegion::surfacePointWithExclusionRegion( MVertex *v, SPoint2 p[4][NUMDIR], SPoint2 &_mp, SMetric3 &meshMetric, surfacePointWithExclusionRegion *father) { _v = v; _meshMetric = meshMetric; _center = _mp; for(int i = 0; i < 4; i++) _q[i] = _center + (p[i][0] + p[(i + 1) % 4][0] - _center * 2) * FACTOR; for(int i = 0; i < 4; i++) for(int j = 0; j < NUMDIR; j++) _p[i][j] = p[i][j]; if(!father) { fullMatrix<double> V(3, 3); fullVector<double> S(3); meshMetric.eig(V, S); double l = std::max(std::max(S(0), S(1)), S(2)); _distanceSummed = sqrt(1 / (l * l)); } else { _distanceSummed = father->_distanceSummed + distance(father->_v, _v); } }