ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 169
Committed: Fri Feb 13 23:04:14 2009 UTC (16 years, 3 months ago) by francois
Original Path: magic/lib/outil/outil/src/ot_mathematique.cpp
File size: 25660 byte(s)
Log Message:
Resolution de bug avec la version de gcc 4.3.2 --> mise la norme de c++

File Contents

# User Rev Content
1 souaissa 58 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuillière et Vincent FRANCOIS
5     // Département de Génie Mécanique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du département
8     // de génie mécanique de l'Université du Québec à
9     // Trois Rivières
10     // Les librairies ne peuvent être utilisées sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // ot_mathematique.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 à 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26 francois 169 #include <iomanip>
27 souaissa 58 #include <math.h>
28 francois 169 #include <string.h>
29 souaissa 86 #include <assert.h>
30 souaissa 58 #include <algorithm>
31     #include "ot_mathematique.h"
32    
33     using namespace std;
34    
35    
36     OT_VECTEUR_3D::OT_VECTEUR_3D(double x,double y,double z)
37     {
38     valeur[0]=x;
39     valeur[1]=y;
40     valeur[2]=z;
41     }
42    
43    
44     OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz)
45     {
46     valeur[0]=xyz[0];
47     valeur[1]=xyz[1];
48     valeur[2]=xyz[2];
49     }
50    
51     OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz1,double *xyz2)
52     {
53     valeur[0]=xyz2[0]-xyz1[0];
54     valeur[1]=xyz2[1]-xyz1[1];
55     valeur[2]=xyz2[2]-xyz1[2];
56     }
57    
58     OT_VECTEUR_3D::OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd)
59     {
60     valeur[0]=mdd.valeur[0];
61     valeur[1]=mdd.valeur[1];
62     valeur[2]=mdd.valeur[2];
63     }
64    
65     OT_VECTEUR_3D::OT_VECTEUR_3D(OT_VECTEUR_3D& mdd)
66     {
67     valeur[0]=mdd.valeur[0];
68     valeur[1]=mdd.valeur[1];
69     valeur[2]=mdd.valeur[2];
70     }
71    
72     OT_VECTEUR_3D::OT_VECTEUR_3D(void)
73     {
74     valeur[0]=0.;
75     valeur[1]=0.;
76     valeur[2]=0.;
77     }
78    
79     double OT_VECTEUR_3D::get_x(void) const
80     {
81     return valeur[0];
82     }
83    
84    
85     double OT_VECTEUR_3D::get_y(void) const
86     {
87     return valeur[1];
88     }
89    
90    
91     double OT_VECTEUR_3D::get_z(void) const
92     {
93     return valeur[2];
94     }
95    
96     void OT_VECTEUR_3D::change_x(double x)
97     {
98     valeur[0]=x;
99     }
100    
101     void OT_VECTEUR_3D::change_y(double y)
102     {
103     valeur[1]=y;
104     }
105    
106     void OT_VECTEUR_3D::change_z(double z)
107     {
108     valeur[2]=z;
109     }
110    
111     double* OT_VECTEUR_3D::get_xyz(void)
112     {
113     return valeur;
114     }
115    
116     OT_VECTEUR_3D::operator const double* () const
117     {
118     return valeur;
119     }
120    
121     OT_VECTEUR_3D::operator double* ()
122     {
123     return valeur;
124     }
125    
126     double OT_VECTEUR_3D::operator[] (int i) const
127     {
128     return valeur[i];
129     }
130    
131     double & OT_VECTEUR_3D::operator[] (int i)
132     {
133     return valeur[i];
134     }
135    
136     double OT_VECTEUR_3D::operator() (int i) const
137     {
138     return valeur[i];
139     }
140     double & OT_VECTEUR_3D::operator() (int i)
141     {
142     return valeur[i];
143     }
144    
145     double OT_VECTEUR_3D::get_longueur(void) const
146     {
147     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
148     }
149    
150     double OT_VECTEUR_3D::get_longueur2(void) const
151     {
152     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
153     }
154    
155    
156     void OT_VECTEUR_3D::norme(void)
157     {
158     double longueur=get_longueur();
159     if (longueur != 0)
160     {
161     valeur[0]=valeur[0]/longueur;
162     valeur[2]=valeur[2]/longueur;
163     valeur[1]=valeur[1]/longueur;
164     }
165     }
166    
167     OT_VECTEUR_3D OT_VECTEUR_3D::gram_shmidt(const OT_VECTEUR_3D& vint)
168     {
169     OT_VECTEUR_3D v(0.,0.,0.);
170     double alpha=(*this)*vint;
171     v= *this-alpha*vint;
172     return v;
173     }
174    
175     OT_VECTEUR_3D OT_VECTEUR_3D::unite(int i)
176     {
177     OT_VECTEUR_3D v(0.,0.,0.);
178     v[i]=1.;
179     return v;
180     }
181    
182    
183     int OT_VECTEUR_3D::compare_valeur (const OT_VECTEUR_3D& mdd) const
184     {
185     return memcmp(valeur, mdd.valeur, 3*sizeof(double));
186     }
187    
188     bool OT_VECTEUR_3D::operator== (const OT_VECTEUR_3D& mdd) const
189     {
190     return compare_valeur(mdd) == 0;
191     }
192    
193     bool OT_VECTEUR_3D::operator!= (const OT_VECTEUR_3D& mdd) const
194     {
195     return compare_valeur(mdd) != 0;
196     }
197    
198     bool OT_VECTEUR_3D::operator< (const OT_VECTEUR_3D& mdd) const
199     {
200     return compare_valeur(mdd) < 0;
201     }
202    
203     bool OT_VECTEUR_3D::operator<= (const OT_VECTEUR_3D& mdd) const
204     {
205     return compare_valeur(mdd) <= 0;
206     }
207    
208     bool OT_VECTEUR_3D::operator> (const OT_VECTEUR_3D& mdd) const
209     {
210     return compare_valeur(mdd) > 0;
211     }
212    
213     bool OT_VECTEUR_3D::operator>= (const OT_VECTEUR_3D& mdd) const
214     {
215     return compare_valeur(mdd) >= 0;
216     }
217    
218     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec)
219     {
220     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<"}, ";
221     return __os;
222     }
223    
224     OT_VECTEUR_3D operator/ (const OT_VECTEUR_3D& mdd1, double diviseur)
225     {
226     OT_VECTEUR_3D kQuot;
227    
228     if ( diviseur != (double)0.0 )
229     {
230     double facteur = ((double)1.0)/diviseur;
231     kQuot.valeur[0] = facteur*mdd1.valeur[0];
232     kQuot.valeur[1] = facteur*mdd1.valeur[1];
233     kQuot.valeur[2] = facteur*mdd1.valeur[2];
234     }
235     else
236     {
237     kQuot.valeur[0] = 1E300;
238     kQuot.valeur[1] = 1E300;
239     kQuot.valeur[2] = 1E300;
240     }
241    
242     return kQuot;
243     }
244    
245     OT_VECTEUR_3D operator- (const OT_VECTEUR_3D& mdd1)
246     {
247     return OT_VECTEUR_3D(
248     -mdd1.valeur[0],
249     -mdd1.valeur[1],
250     -mdd1.valeur[2]);
251     }
252    
253     double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
254     {
255     double tmp;
256     tmp=mdd1.valeur[0]*mdd2.valeur[0]+mdd1.valeur[1]*mdd2.valeur[1]+mdd1.valeur[2]*mdd2.valeur[2];
257     return tmp;
258     }
259    
260     OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2)
261     {
262     OT_VECTEUR_3D tmp;
263     tmp.valeur[0]=mdd1*mdd2.valeur[0];
264     tmp.valeur[1]=mdd1*mdd2.valeur[1];
265     tmp.valeur[2]=mdd1*mdd2.valeur[2];
266     return tmp;
267     }
268    
269     OT_VECTEUR_3D& OT_VECTEUR_3D::operator+= (const OT_VECTEUR_3D& mdd)
270     {
271     valeur[0] += mdd.valeur[0];
272     valeur[1] += mdd.valeur[1];
273     valeur[2] += mdd.valeur[2];
274     return *this;
275     }
276     OT_VECTEUR_3D& OT_VECTEUR_3D::operator-= (const OT_VECTEUR_3D& mdd)
277     {
278     valeur[0] -= mdd.valeur[0];
279     valeur[1] -= mdd.valeur[1];
280     valeur[2] -= mdd.valeur[2];
281     return *this;
282     }
283     OT_VECTEUR_3D& OT_VECTEUR_3D::operator*= (double facteur)
284     {
285     valeur[0] *= facteur;
286     valeur[1] *= facteur;
287     valeur[2] *= facteur;
288     return *this;
289     }
290     OT_VECTEUR_3D& OT_VECTEUR_3D::operator/= (double diviseur)
291     {
292     if ( diviseur != (double)0.0 )
293     {
294     double facteur = ((double)1.0)/diviseur;
295     valeur[0] *= facteur;
296     valeur[1] *= facteur;
297     valeur[2] *= facteur;
298     }
299     else
300     {
301     valeur[0] = 1E300;
302     valeur[1] = 1E300;
303     valeur[2] = 1E300;
304     }
305    
306     return *this;
307     }
308    
309     OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
310     {
311     OT_VECTEUR_3D tmp;
312     tmp.valeur[0]=mdd1.valeur[1]*mdd2.valeur[2]-mdd1.valeur[2]*mdd2.valeur[1];
313     tmp.valeur[1]=mdd1.valeur[2]*mdd2.valeur[0]-mdd1.valeur[0]*mdd2.valeur[2];
314     tmp.valeur[2]=mdd1.valeur[0]*mdd2.valeur[1]-mdd1.valeur[1]*mdd2.valeur[0];
315     return tmp;
316     }
317    
318     double OT_VECTEUR_3D::diff(void)
319     {
320     return 0.33333333333333*(fabs(valeur[0])+fabs(valeur[1])+fabs(valeur[2]));
321     }
322    
323    
324     OT_MATRICE_3D::OT_MATRICE_3D(OT_VECTEUR_3D& colonne1,OT_VECTEUR_3D& colonne2,OT_VECTEUR_3D& colonne3)
325     {
326     vec[0]=colonne1;
327     vec[1]=colonne2;
328     vec[2]=colonne3;
329     }
330    
331     OT_MATRICE_3D::OT_MATRICE_3D(const OT_MATRICE_3D& mdd)
332     {
333     vec[0]=mdd.vec[0];
334     vec[1]=mdd.vec[1];
335     vec[2]=mdd.vec[2];
336     }
337    
338 souaissa 151 OT_MATRICE_3D::OT_MATRICE_3D(void)
339     {
340     for(int i=0;i<3;i++)
341     {
342     for(int j=0;j<3;j++)
343     {
344     vec[i][j]=0.;
345     }
346 souaissa 58
347 souaissa 151 }
348    
349     }
350 souaissa 58 std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat)
351     {
352    
353     __os << "{ ";
354     for (unsigned i=0; i<3; i++)
355     {
356     __os << "[ "<< __mat(i,0)<<" ]\t [ "<<__mat(i,1) <<" ]\t [ "<<__mat(i,2);
357     if (i+1 < 3)
358     __os << std::endl << " ";
359     }
360     __os << " }" << std::endl;
361     return __os;
362     }
363    
364     OT_VECTEUR_3D & OT_MATRICE_3D::operator [](int i)
365     {
366     return vec[i];
367     }
368    
369     OT_MATRICE_3D::OT_MATRICE_3D(double* t)
370     {
371     for(int i=0;i<3;i++)
372     {
373     for(int j=0;j<3;j++)
374     {
375     vec[i][j]=t[i*3+j];
376     }
377    
378     }
379     }
380    
381     double OT_MATRICE_3D::valeur(int iLigne, int iCol) const
382     {
383     return vec[iCol][iLigne];
384     }
385     double & OT_MATRICE_3D::valeur(int iLigne, int iCol)
386     {
387     return vec[iCol][iLigne];
388     }
389     double OT_MATRICE_3D::operator() (int iLigne, int iCol) const
390     {
391     return vec[iCol][iLigne];
392     }
393     double & OT_MATRICE_3D::operator() (int iLigne, int iCol)
394     {
395     return vec[iCol][iLigne];
396     }
397     double OT_MATRICE_3D::get_determinant()
398     {
399     double coFacteur0 = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
400     double coFacteur1 = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
401     double coFacteur2 = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
402     double determinant = valeur(0,0)*coFacteur0 + valeur(0,1)*coFacteur1 + valeur(0,2)*coFacteur2;
403     return determinant;
404     }
405     void OT_MATRICE_3D::identite(void)
406     {
407     for (unsigned i = 0; i<3; i++)
408     for (unsigned j = 0; j < 3; j++)
409     vec[i][j] = (i==j) ? 1.0 : 0.0 ;
410     }
411    
412     void OT_MATRICE_3D::transpose(OT_MATRICE_3D& res) const
413     {
414     for (unsigned i = 0; i<3; i++)
415     for (unsigned j = 0; j < 3; j++)
416     res.vec[i][j] = vec[j][i];
417     }
418    
419 souaissa 151 OT_MATRICE_3D OT_MATRICE_3D::transpose() const
420     {
421     OT_MATRICE_3D temp;
422     for (unsigned i = 0; i<3; i++)
423     for (unsigned j = 0; j < 3; j++)
424     temp.valeur(i,j) =valeur(j,i);
425    
426     return temp;
427     }
428    
429 souaissa 58 OT_MATRICE_3D OT_MATRICE_3D::inverse () const
430     {
431     // Invert a 3x3 using cofactors. This is faster than using a generic
432     // Gaussian elimination because of the loop overhead of such a method.
433    
434     OT_MATRICE_3D matInverse;
435    
436     matInverse.valeur(0,0) = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
437     matInverse.valeur(0,1) = valeur(0,2)*valeur(2,1) - valeur(0,1)*valeur(2,2);
438     matInverse.valeur(0,2) = valeur(0,1)*valeur(1,2) - valeur(0,2)*valeur(1,1);
439     matInverse.valeur(1,0) = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
440     matInverse.valeur(1,1) = valeur(0,0)*valeur(2,2) - valeur(0,2)*valeur(2,0);
441     matInverse.valeur(1,2) = valeur(0,2)*valeur(1,0) - valeur(0,0)*valeur(1,2);
442     matInverse.valeur(2,0) = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
443     matInverse.valeur(2,1) = valeur(0,1)*valeur(2,0) - valeur(0,0)*valeur(2,1);
444     matInverse.valeur(2,2) = valeur(0,0)*valeur(1,1) - valeur(0,1)*valeur(1,0);
445    
446     double det = valeur(0,0)*matInverse(0,0) + valeur(0,1)*matInverse(1,0)+
447     valeur(0,2)*matInverse(2,0);
448    
449     if ( fabs(det) <= 1E-100 )
450     {
451     matInverse.identite();
452     return matInverse;
453     }
454    
455     double invDet = 1/det;
456    
457     for (int i=0; i<3; i++)
458     for (int j=0; j<3; j++)
459     matInverse.vec[i][j] *= invDet;
460    
461     return matInverse;
462     }
463    
464     void OT_MATRICE_3D::change_vecteur1(OT_VECTEUR_3D v)
465     {
466     vec[0]=v;
467     }
468     void OT_MATRICE_3D::change_vecteur2(OT_VECTEUR_3D v)
469     {
470     vec[1]=v;
471     }
472     void OT_MATRICE_3D::change_vecteur3(OT_VECTEUR_3D v)
473     {
474     vec[2]=v;
475     }
476     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur1(void)
477     {
478     return vec[0];
479     }
480     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur2(void)
481     {
482     return vec[1];
483     }
484     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur3(void)
485     {
486     return vec[2];
487     }
488    
489    
490    
491 souaissa 69 OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
492 foucault 27 {
493 souaissa 58 OT_MATRICE_3D tmp;
494     for(int i=0;i<3;i++) {
495     for(int j=0;j<3;j++) tmp(i,j)= mdd1(i,j)+mdd2(i,j);
496     }
497     return tmp;
498 foucault 27 }
499 souaissa 58
500    
501     OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2)
502     {
503     OT_VECTEUR_3D tmp;
504     tmp(0)=mdd1(0,0)*mdd2(0)+mdd1(0,1)*mdd2(1)+mdd1(0,2)*mdd2(2);
505     tmp(1)=mdd1(1,0)*mdd2(0)+mdd1(1,1)*mdd2(1)+mdd1(1,2)*mdd2(2);
506     tmp(2)=mdd1(2,0)*mdd2(0)+mdd1(2,1)*mdd2(1)+mdd1(2,2)*mdd2(2);
507     return tmp;}
508    
509     OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
510     {
511     OT_VECTEUR_3D tmp;
512     tmp(0)=mdd1(0)+mdd2(0);
513     tmp(1)=mdd1(1)+mdd2(1);
514     tmp(2)=mdd1(2)+mdd2(2);
515     return tmp;
516     }
517    
518     OT_VECTEUR_3D operator-(const class OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
519     {
520     OT_VECTEUR_3D tmp;
521     tmp.valeur[0]=mdd1.valeur[0]-mdd2.valeur[0];
522     tmp.valeur[1]=mdd1.valeur[1]-mdd2.valeur[1];
523     tmp.valeur[2]=mdd1.valeur[2]-mdd2.valeur[2];
524     return tmp;
525     }
526    
527     OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
528     {
529     OT_MATRICE_3D tmp;
530     for (int i=0; i<3; i++)
531     for (int j=0; j<3; j++)
532     {
533     tmp(i,j) = 0;
534     for (int k=0; k<3; k++)
535     tmp(i,j) += mdd1(i,k)*mdd2(k,j);
536     }
537     return tmp;
538     }
539    
540     #ifdef ot_vecteur_4d
541     OT_VECTEUR_4D::OT_VECTEUR_4D (double v[4])
542     {
543     for (int i=0; i<4; i++)
544     valeur[i]=v[i];
545     }
546    
547     OT_VECTEUR_4D::OT_VECTEUR_4D (double x, double y, double z, double w)
548     {
549     valeur[0] = x;
550     valeur[1] = y;
551     valeur[2] = z;
552     valeur[3] = w;
553     }
554    
555     OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
556     {
557     for (int i=0; i<4; i++)
558     valeur[i]=v[i];
559     }
560    
561    
562     double & OT_VECTEUR_4D::operator()(int i)
563     {
564     return valeur[i];
565     }
566    
567     double OT_VECTEUR_4D::operator()(int i) const
568     {
569     return valeur[i];
570     }
571    
572     double & OT_VECTEUR_4D::operator[](int i)
573     {
574     return valeur[i];
575     }
576    
577     double OT_VECTEUR_4D::operator[](int i) const
578     {
579     return valeur[i];
580     }
581    
582     OT_VECTEUR_4D::operator const double* () const
583     {
584     return valeur;
585     }
586    
587     OT_VECTEUR_4D::operator double* ()
588     {
589     return valeur;
590     }
591    
592     double OT_VECTEUR_4D::get_x(void) const
593     { return valeur[0]; }
594     double & OT_VECTEUR_4D::x(void)
595     { return valeur[0]; }
596     double OT_VECTEUR_4D::get_y(void) const
597     { return valeur[1]; }
598     double & OT_VECTEUR_4D::y(void)
599     { return valeur[1]; }
600     double OT_VECTEUR_4D::get_z(void) const
601     { return valeur[2]; }
602     double & OT_VECTEUR_4D::z(void)
603     { return valeur[2]; }
604     double OT_VECTEUR_4D::get_w(void) const
605     { return valeur[3]; }
606     double & OT_VECTEUR_4D::w(void)
607     { return valeur[3]; }
608     void OT_VECTEUR_4D::change_x(double x)
609     { valeur[0] = x; }
610     void OT_VECTEUR_4D::change_y(double y)
611     { valeur[1] = y; }
612     void OT_VECTEUR_4D::change_z(double z)
613     { valeur[2] = z; }
614     void OT_VECTEUR_4D::change_w(double w)
615     { valeur[3] = w; }
616     double* OT_VECTEUR_4D::get_xyzw(void)
617     { return valeur; }
618    
619     OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
620     {
621     return OT_VECTEUR_4D(
622     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
623     );
624     }
625    
626     OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
627     {
628     return OT_VECTEUR_4D(
629     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
630     );
631     }
632    
633     OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
634     {
635     return OT_VECTEUR_4D(
636     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
637     );
638     }
639     OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
640     {
641     return OT_VECTEUR_4D(
642     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
643     );
644     }
645    
646     OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
647     {
648     double inv = 1/a;
649     return OT_VECTEUR_4D(
650     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
651     );
652     }
653    
654    
655     OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
656     {
657     double inv = 1/a;
658     return OT_VECTEUR_4D(
659     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
660     );
661     }
662    
663     double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
664     {
665     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
666     }
667    
668    
669     OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
670     {
671     valeur[0] += rkV.valeur[0];
672     valeur[1] += rkV.valeur[1];
673     valeur[2] += rkV.valeur[2];
674     valeur[3] += rkV.valeur[3];
675     return *this;
676     }
677    
678     OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
679     {
680     valeur[0] -= rkV.valeur[0];
681     valeur[1] -= rkV.valeur[1];
682     valeur[2] -= rkV.valeur[2];
683     valeur[3] -= rkV.valeur[3];
684     return *this;
685     }
686     OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
687     {
688     valeur[0] *= fScalar;
689     valeur[1] *= fScalar;
690     valeur[2] *= fScalar;
691     valeur[3] *= fScalar;
692     return *this;
693     }
694     OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
695     {
696     double a = 1/fScalar;
697     valeur[0] *= a;
698     valeur[1] *= a;
699     valeur[2] *= a;
700     valeur[3] *= a;
701     return *this;
702     }
703     OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
704     {
705     valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
706     return *this;
707     }
708    
709     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
710     {
711     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
712     return __os;
713     }
714     #endif // ot_vecteur_4d
715    
716 souaissa 69
717    
718    
719     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 v[4])
720     {
721     for (int i=0; i<4; i++)
722     valeur[i]=v[i];
723     }
724    
725     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 x, double2 y, double2 z, double2 w)
726     {
727     valeur[0] = x;
728     valeur[1] = y;
729     valeur[2] = z;
730     valeur[3] = w;
731     }
732    
733     OT_VECTEUR_4DD::OT_VECTEUR_4DD (const OT_VECTEUR_4DD & v)
734     {
735     for (int i=0; i<4; i++)
736     valeur[i]=v[i];
737     }
738    
739    
740     double2 & OT_VECTEUR_4DD::operator()(int i)
741     {
742     return valeur[i];
743     }
744    
745     double2 OT_VECTEUR_4DD::operator()(int i) const
746     {
747     return valeur[i];
748     }
749    
750     double2 & OT_VECTEUR_4DD::operator[](int i)
751     {
752     return valeur[i];
753     }
754    
755     double2 OT_VECTEUR_4DD::operator[](int i) const
756     {
757     return valeur[i];
758     }
759    
760     OT_VECTEUR_4DD::operator const double2* () const
761     {
762     return valeur;
763     }
764    
765     OT_VECTEUR_4DD::operator double2* ()
766     {
767     return valeur;
768     }
769    
770     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator =(const OT_VECTEUR_4DD& v4d)
771     {
772     if (this==&v4d) return *this;
773     valeur [0]=v4d.get_x();
774     valeur [1]=v4d.get_y();
775     valeur [2]=v4d.get_z();
776     valeur [3]=v4d.get_w();
777     return *this;
778     }
779 souaissa 86 double2 OT_VECTEUR_4DD::norme()
780     {
781     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2]+valeur [3]*valeur [3];
782     nor=nor^0.5;
783     return nor;
784     }
785     OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme()
786     {
787     OT_VECTEUR_4DD nor;
788     double2 zero=0.;
789     double2 norme= this->norme() ;
790     assert(norme!=zero) ;
791     nor=(*this)*(1./norme);
792     return nor;
793     }
794 souaissa 69
795     double2 OT_VECTEUR_4DD::get_x(void) const
796     { return valeur[0]; }
797     double2 & OT_VECTEUR_4DD::x(void)
798     { return valeur[0]; }
799     double2 OT_VECTEUR_4DD::get_y(void) const
800     { return valeur[1]; }
801     double2 & OT_VECTEUR_4DD::y(void)
802     { return valeur[1]; }
803     double2 OT_VECTEUR_4DD::get_z(void) const
804     { return valeur[2]; }
805     double2 & OT_VECTEUR_4DD::z(void)
806     { return valeur[2]; }
807     double2 OT_VECTEUR_4DD::get_w(void) const
808     { return valeur[3]; }
809     double2 & OT_VECTEUR_4DD::w(void)
810     { return valeur[3]; }
811     void OT_VECTEUR_4DD::change_x(double2 x)
812     { valeur[0] = x; }
813     void OT_VECTEUR_4DD::change_y(double2 y)
814     { valeur[1] = y; }
815     void OT_VECTEUR_4DD::change_z(double2 z)
816     { valeur[2] = z; }
817     void OT_VECTEUR_4DD::change_w(double2 w)
818     { valeur[3] = w; }
819     double2* OT_VECTEUR_4DD::get_xyzw(void)
820     { return valeur; }
821    
822     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator+ (const OT_VECTEUR_4DD & a)
823     {
824     return OT_VECTEUR_4DD(
825     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
826     );
827     }
828    
829     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator- (const OT_VECTEUR_4DD & a)
830     {
831     return OT_VECTEUR_4DD(
832     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
833     );
834     }
835    
836     OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a)
837     {
838     return OT_VECTEUR_4DD(
839     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
840     );
841     }
842     OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV)
843     {
844     return OT_VECTEUR_4DD(
845     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
846     );
847     }
848    
849     OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a)
850     {
851     double2 inv = 1/a;
852     return OT_VECTEUR_4DD(
853     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
854     );
855     }
856    
857    
858     OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV)
859     {
860     double2 inv = 1/a;
861     return OT_VECTEUR_4DD(
862     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
863     );
864     }
865 souaissa 86 OT_VECTEUR_4DD OT_VECTEUR_4DD::operator^(const OT_VECTEUR_4DD& v2)
866     {
867     OT_VECTEUR_4DD tmp;
868     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
869 souaissa 151 tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
870     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
871     tmp[3]= 0;
872     //tmp[3]= valeur[1]*v2[2]-valeur[2]*v2[1];
873 souaissa 86 return tmp;
874     }
875 souaissa 69 double2 OT_VECTEUR_4DD::operator* (const OT_VECTEUR_4DD & a)
876     {
877     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
878     }
879    
880    
881     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator+= (const OT_VECTEUR_4DD& rkV)
882     {
883     valeur[0] = valeur[0] +rkV.valeur[0];
884     valeur[1] = valeur[1] +rkV.valeur[1];
885     valeur[2] = valeur[2] +rkV.valeur[2];
886     valeur[3] = valeur[3] +rkV.valeur[3];
887     return *this;
888     }
889    
890     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator-= (const OT_VECTEUR_4DD& rkV)
891     {
892     valeur[0] = valeur[0] -rkV.valeur[0];
893     valeur[1] = valeur[1] -rkV.valeur[1];
894     valeur[2] = valeur[2] -rkV.valeur[2];
895     valeur[3] = valeur[3] -rkV.valeur[3];
896     return *this;
897     }
898     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator*= (double2 fScalar)
899     {
900     valeur[0] =valeur[0] * fScalar;
901     valeur[1] =valeur[1] * fScalar;
902     valeur[2] =valeur[2] * fScalar;
903     valeur[3] =valeur[3] * fScalar;
904     return *this;
905     }
906     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator/= (double2 fScalar)
907     {
908     double2 a = 1/fScalar;
909     valeur[0] =valeur[0] * a;
910     valeur[1] =valeur[1] * a;
911     valeur[2] =valeur[2] * a;
912     valeur[3] =valeur[3] * a;
913     return *this;
914     }
915    
916    
917     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec)
918     {
919 souaissa 70 __os << "[ "<<setw(20)<< __vec[0]<<setw(4)<<", "<<setw(20)<<__vec[1]<<", "<<setw(20)<<__vec[2]<<setw(4)<<", "<<setw(20)<<__vec[3]<<setw(4)<<"] ";
920 souaissa 69 return __os;
921     }
922    
923     int OT_VECTEUR_4DD::compare_valeur (const OT_VECTEUR_4DD& mdd) const
924     {
925 souaissa 75 if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2]&&valeur[3]==mdd.valeur[3])
926     return 1;
927     else return 0;
928    
929 souaissa 69 }
930    
931 souaissa 75 bool OT_VECTEUR_4DD::operator==(const OT_VECTEUR_4DD& mdd) const
932 souaissa 69 {
933 francois 76 return compare_valeur(mdd);
934 souaissa 69 }
935    
936    
937    
938    
939    
940    
941    
942    
943    
944    
945    
946    
947    
948    
949    
950    
951    
952    
953    
954    
955 souaissa 58 int OPERATEUR::egal(double a,double b,double eps)
956     {
957     double res=fabs(a-b);
958     if (res<eps) return(1);
959     return(0);
960     }
961    
962    
963     double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
964     {
965     OT_VECTEUR_3D vec12(noeud1,noeud2);
966     OT_VECTEUR_3D vec13(noeud1,noeud3);
967     OT_VECTEUR_3D vec23(noeud2,noeud3);
968     double d12=vec12.get_longueur();
969     double d13=vec13.get_longueur();
970     double d23=vec23.get_longueur();
971     double dmax=max(d12,d13);
972     dmax=max(dmax,d23);
973     double p=0.5*(d12+d13+d23);
974     double crit=(p-d12)*(p-d13)*(p-d23)/p;
975     if (crit<0) crit=0.;
976     crit=sqrt(crit);
977     crit=crit/dmax;
978     crit=crit*3.4641101614;
979     return crit;
980     }
981    
982     void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
983     {
984     int *p=(int*)(&(val));
985     val1=(*p);
986     val2=(*(p+1));
987     }
988    
989     double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
990     {
991     OT_VECTEUR_3D ab(noeud1,noeud2);
992     OT_VECTEUR_3D ac(noeud1,noeud3);
993     OT_VECTEUR_3D cb(noeud3,noeud2);
994     OT_VECTEUR_3D db(noeud4,noeud2);
995     OT_VECTEUR_3D da(noeud4,noeud1);
996     OT_VECTEUR_3D dc(noeud4,noeud3);
997     double dab=ab.get_longueur();
998     double dac=ac.get_longueur();
999     double dcb=cb.get_longueur();
1000     double ddb=db.get_longueur();
1001     double dda=da.get_longueur();
1002     double ddc=dc.get_longueur();
1003    
1004     double dmax=max(dab,dac);
1005     dmax=max(dmax,dcb);
1006     dmax=max(dmax,ddb);
1007     dmax=max(dmax,dda);
1008     dmax=max(dmax,ddc);
1009    
1010     OT_VECTEUR_3D pvec=ab&ac;
1011     double vol=pvec*da;
1012     if (vol>0.) return 0.;
1013     vol=fabs(vol);
1014     double som=pvec.get_longueur()/2.;
1015     pvec=ab&da;
1016     som=som+pvec.get_longueur()/2.;
1017     pvec=ac&dc;
1018     som=som+pvec.get_longueur()/2.;
1019     pvec=cb&db;
1020     som=som+pvec.get_longueur()/2.;
1021     double crit=vol/som/dmax/0.408249;
1022     return crit;
1023     }
1024    
1025    
1026    
1027     template <int N> DOUBLEN<N>::DOUBLEN()
1028     {
1029     tab[0]=-1;
1030     }
1031    
1032     template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
1033     {
1034     for (int i=0;i<N;i++)
1035     tab[i]=mdd.tab[i];
1036     }
1037    
1038     template <int N> DOUBLEN<N>::DOUBLEN(double *v)
1039     {
1040     for (int i=0;i<N;i++)
1041     tab[i]=v[i];
1042     }
1043    
1044     template <int N> DOUBLEN<N>::~DOUBLEN()
1045     {
1046     }
1047    
1048     template <int N> double DOUBLEN<N>::get_valeur(int num)
1049     {
1050     return tab[num];
1051     }
1052    
1053     template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
1054     {
1055     tab[num]=val;
1056     }
1057    
1058     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
1059     {
1060     for (int i=0;i<N;i++)
1061     tab[i]=mdd.tab[i];
1062     return *this;
1063     }
1064    
1065     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
1066     {
1067     for (int i=0;i<N;i++)
1068     tab[i]=mdd.tab[i];
1069     return *this;
1070     }
1071    
1072    
1073     #ifdef BORLANDCPP
1074     // instanciation pour Windows (Borland c++)
1075     template class __export DOUBLEN<1>;
1076     template class __export DOUBLEN<4>;
1077     template class __export DOUBLEN<10>;
1078     #else
1079     #ifdef GCC
1080     // instanciation pour Unix (g++)
1081     template class DOUBLEN<1>;
1082     template class DOUBLEN<4>;
1083     template class DOUBLEN<10>;
1084     #else
1085     // instanciation pour Windows (Visual Studio)
1086     #endif
1087     #endif
1088    
1089