33 double a00 = metrique_depart[0];
34 double a01 = metrique_depart[1];
35 double a02 = metrique_depart[2];
36 double a11 = metrique_depart[4];
37 double a12 = metrique_depart[5];
38 double a22 = metrique_depart[8];
40 double c0 = a00*a11*a22 + 2.0*a01*a02*a12 - a00*a12*a12 - a11*a02*a02 - a22*a01*a01;
41 double c1 = a00*a11 - a01*a01 + a00*a22 - a02*a02 + a11*a22 - a12*a12;
42 double c2 = a00 + a11 + a22;
43 double c2Div3 = c2*inv3;
44 double aDiv3 = (c1 - c2*c2Div3)*inv3;
45 if (aDiv3 > 0.0) { aDiv3 = 0.0; }
46 double mbDiv2 = 0.5*(c0 + c2Div3*(2.0*c2Div3*c2Div3 - c1));
47 double q = mbDiv2*mbDiv2 + aDiv3*aDiv3*aDiv3;
48 if (q > 0.0) { q = 0.0; }
49 double magnitude =
sqrt(-aDiv3);
50 double angle = atan2(
sqrt(-q),mbDiv2)*inv3;
51 double cs =
cos(angle);
52 double sn =
sin(angle);
53 valeur_propre[0] = c2Div3 + 2.0*magnitude*cs;
54 valeur_propre[1] = c2Div3 - magnitude*(cs +
sqrt(3)*sn);
55 valeur_propre[2] = c2Div3 - magnitude*(cs -
sqrt(3)*sn);
56 std::multimap<double,double> tab;
57 tab.insert(std::pair<double,double>(valeur_propre[0],valeur_propre[0]));
58 tab.insert(std::pair<double,double>(valeur_propre[1],valeur_propre[1]));
59 tab.insert(std::pair<double,double>(valeur_propre[2],valeur_propre[2]));
60 std::map<double,double>::iterator it=tab.begin();
61 valeur_propre[0]=it->second;it++;
62 valeur_propre[1]=it->second;it++;
63 valeur_propre[2]=it->second;
65 metrique2[0]=metrique_depart[0]-valeur_propre[0];
66 metrique2[4]=metrique_depart[4]-valeur_propre[0];
67 metrique2[8]=metrique_depart[8]-valeur_propre[0];
71 vecteur_propre[0] =1.;
72 vecteur_propre[1] =0.;
73 vecteur_propre[2] =0.;
74 vecteur_propre[3] =0.;
75 vecteur_propre[4] =1.;
76 vecteur_propre[5] =0.;
77 vecteur_propre[6] =0.;
78 vecteur_propre[7] =0.;
79 vecteur_propre[8] =1.;
88 vecteur_propre[0] =v1.
get_x();
89 vecteur_propre[1] =v2.get_x();
90 vecteur_propre[2] =v3.
get_x();
91 vecteur_propre[3] =v1.
get_y();
92 vecteur_propre[4] =v2.get_y();
93 vecteur_propre[5] =v3.
get_z();
94 vecteur_propre[6] =v1.
get_x();
95 vecteur_propre[7] =v2.get_y();
96 vecteur_propre[8] =v3.
get_z();
102 metrique2[0]=metrique_depart[0]-valeur_propre[1];
103 metrique2[4]=metrique_depart[4]-valeur_propre[1];
104 metrique2[8]=metrique_depart[8]-valeur_propre[1];
109 vecteur_propre[0] =v1.
get_x();
110 vecteur_propre[1] =v2.
get_x();
111 vecteur_propre[2] =v3.
get_x();
112 vecteur_propre[3] =v1.
get_y();
113 vecteur_propre[4] =v2.
get_y();
114 vecteur_propre[5] =v3.
get_z();
115 vecteur_propre[6] =v1.
get_x();
116 vecteur_propre[7] =v2.
get_y();
117 vecteur_propre[8] =v3.
get_z();
124 vecteur_propre[0] =v1.
get_x();
125 vecteur_propre[1] =v2.get_x();
126 vecteur_propre[2] =v3.
get_x();
127 vecteur_propre[3] =v1.
get_y();
128 vecteur_propre[4] =v2.get_y();
129 vecteur_propre[5] =v3.
get_z();
130 vecteur_propre[6] =v1.
get_x();
131 vecteur_propre[7] =v2.get_y();
132 vecteur_propre[8] =v3.
get_z();
148 V.change_x(-U.
get_z()*invLength);
150 V.change_z(-U.
get_x()*invLength);
159 V.change_y(U.
get_z()*invLength);
160 V.change_z(-U.
get_y()*invLength);
180 double abs, save, max = -1;
181 int maxRow = -1, maxCol = -1;
182 for (
int row = 0; row < 3; row++)
184 for (
int col = row; col < 3; col++)
186 abs = fabs(M[row][col]);
201 for (
int col = 0; col < 3; col++)
204 M[0][col] = M[maxRow][col];
205 M[maxRow][col] = save;
208 double invMax = 1./M[0][maxCol];
214 M[1][1] -= M[1][0]*M[0][1];
215 M[1][2] -= M[1][0]*M[0][2];
216 M[2][1] -= M[2][0]*M[0][1];
217 M[2][2] -= M[2][0]*M[0][2];
221 else if (maxCol == 1)
223 M[1][0] -= M[1][1]*M[0][0];
224 M[1][2] -= M[1][1]*M[0][2];
225 M[2][0] -= M[2][1]*M[0][0];
226 M[2][2] -= M[2][1]*M[0][2];
232 M[1][0]-= M[1][2]*M[0][0];
233 M[1][1]-= M[1][2]*M[0][1];
234 M[2][0]-= M[2][2]*M[0][0];
235 M[2][1]-= M[2][2]*M[0][1];
242 for (
int row = 1; row < 3; row++)
244 for (
int col = 0; col < 3; col++)
246 abs = fabs(M[row][col]);
262 for (
int col = 0; col < 3; col++)
265 M[1][col] = M[2][col];
269 invMax = 1/M[1][maxCol];