ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 151
Committed: Tue Sep 9 18:51:20 2008 UTC (16 years, 8 months ago) by souaissa
Original Path: magic/lib/outil/outil/src/ot_mathematique.cpp
File size: 25641 byte(s)
Log Message:
mise a jour des classes outils

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