ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 919
Committed: Tue Mar 6 17:51:54 2018 UTC (7 years, 2 months ago) by couturad
File size: 38880 byte(s)
Log Message:
Correction des bugs lors de l'execution en mode RELWITHDEBINFO.
Ajouts de fichiers pour la librairie MICROSTRUCTURE

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
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     #include <iomanip>
27     #include <math.h>
28     #include <string.h>
29     #include <assert.h>
30     #include <algorithm>
31     #include "ot_mathematique.h"
32    
33     using namespace std;
34    
35 couturad 919
36     OT_HISTOGRAMME::OT_HISTOGRAMME(double largeur_colonne):m_largeur_colonne(largeur_colonne)
37     {
38     m_i_min=0;
39     m_i_max=0;
40     m_init=false;
41     }
42    
43     OT_HISTOGRAMME::~OT_HISTOGRAMME(void)
44     {
45     m_map_colonne.clear();
46     }
47    
48     void OT_HISTOGRAMME::ajouter_valeur(double x,double val)
49     {
50     long i = (long)(x/m_largeur_colonne);
51     ajouter_valeur(i,val);
52     }
53    
54     void OT_HISTOGRAMME::ajouter_valeur(long int i, double val)
55     {
56     if(m_init)
57     {
58     m_i_min=i;
59     m_i_max=i;
60     m_map_colonne.insert(std::pair<long,double>(i,val));
61     m_init=true;
62     }
63     else if(i>m_i_max)
64     {
65     for(long j=m_i_max+1;j<i;j++)
66     m_map_colonne.insert(std::pair<long,double>(j,0.0));
67     m_i_max=i;
68     m_map_colonne.insert(std::pair<long,double>(i,val));
69     }
70     else if(i<m_i_min)
71     {
72     for(long j=i+1;j<m_i_min;j++)
73     m_map_colonne.insert(std::pair<long,double>(j,0.0));
74     m_i_min=i;
75     m_map_colonne.insert(std::pair<long,double>(i,val));
76     }
77     else
78     {
79     m_map_colonne[i]+=val;
80     }
81     }
82    
83     double OT_HISTOGRAMME::get_valeur(double x)
84     {
85     long i = (long)(x/m_largeur_colonne);
86     std::map<long,double>::iterator it;
87     it=m_map_colonne.find(i);
88     if(it==m_map_colonne.end())
89     {
90     std::cerr << "*** ERREUR: OT_HISTOGRAMME::get hors de portee ***" << std::endl;
91     return 1e300;
92     }
93     return it->second;
94     }
95    
96     int OT_HISTOGRAMME::get_premiere_valeur(std::map< long, double >::iterator& it,double &valeur,double &borne_min)
97     {
98     it=m_map_colonne.begin();
99     if(it==m_map_colonne.end())
100     {
101     std::cerr << "*** ERREUR: OT_HISTOGRAMME::get hors de portee ***" << std::endl;
102     return -1;
103     }
104     valeur = it->second;
105     borne_min=(it->first)*m_largeur_colonne;
106     return 0;
107     }
108    
109     int OT_HISTOGRAMME::get_suivante_valeur(std::map< long, double >::iterator& it,double &valeur,double &borne_min)
110     {
111     it++;
112     if(it==m_map_colonne.end())
113     {
114     std::cerr << "*** ERREUR: OT_HISTOGRAMME::get hors de portee ***" << std::endl;
115     return -1;
116     }
117     valeur = it->second;
118     borne_min=(it->first)*m_largeur_colonne;
119     return 0;
120     }
121    
122     long int OT_HISTOGRAMME::get_nb_colonne(void)
123     {
124     return m_map_colonne.size();
125     }
126    
127     double OT_HISTOGRAMME::get_x_min(void)
128     {
129     return m_i_min*m_largeur_colonne;
130     }
131    
132     double OT_HISTOGRAMME::get_x_max(void)
133     {
134     return m_i_max*m_largeur_colonne;
135     }
136    
137    
138 couturad 906 OT_QUATERNION::OT_QUATERNION(void)
139     {
140     valeur[0]=0;
141     valeur[1]=0;
142     valeur[2]=0;
143     valeur[3]=0;
144     }
145 francois 283
146 couturad 906 OT_QUATERNION::OT_QUATERNION(double x, double y, double z, double w)
147     {
148     valeur[0]=x;
149     valeur[1]=y;
150     valeur[2]=z;
151     valeur[3]=w;
152     }
153    
154     OT_QUATERNION::OT_QUATERNION(OT_QUATERNION& mdd)
155     {
156     valeur[0]=mdd.valeur[0];
157     valeur[1]=mdd.valeur[1];
158     valeur[2]=mdd.valeur[2];
159     valeur[3]=mdd.valeur[3];
160     }
161    
162     double OT_QUATERNION::get_x(void)
163     {
164     return valeur[0];
165     }
166    
167     void OT_QUATERNION::change_x(double x)
168     {
169     valeur[0]=x;
170     }
171    
172     double OT_QUATERNION::get_y(void)
173     {
174     return valeur[1];
175     }
176    
177     void OT_QUATERNION::change_y(double y)
178     {
179     valeur[1]=y;
180     }
181    
182     double OT_QUATERNION::get_z(void)
183     {
184     return valeur[2];
185     }
186    
187     void OT_QUATERNION::change_z(double z)
188     {
189     valeur[2]=z;
190     }
191    
192     double OT_QUATERNION::get_w(void)
193     {
194     return valeur[3];
195     }
196    
197     void OT_QUATERNION::change_w(double w)
198     {
199     valeur[3]=w;
200     }
201    
202     OT_QUATERNION& OT_QUATERNION::operator=(OT_QUATERNION& mdd)
203     {
204     valeur[0]=mdd.valeur[0];
205     valeur[1]=mdd.valeur[1];
206     valeur[2]=mdd.valeur[2];
207     valeur[3]=mdd.valeur[3];
208     return *this;
209     }
210    
211    
212 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double x,double y,double z)
213 foucault 27 {
214 francois 283 valeur[0]=x;
215     valeur[1]=y;
216     valeur[2]=z;
217 foucault 27 }
218 francois 249
219    
220 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz)
221     {
222     valeur[0]=xyz[0];
223     valeur[1]=xyz[1];
224     valeur[2]=xyz[2];
225     }
226 francois 249
227 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz1,double *xyz2)
228     {
229     valeur[0]=xyz2[0]-xyz1[0];
230     valeur[1]=xyz2[1]-xyz1[1];
231     valeur[2]=xyz2[2]-xyz1[2];
232     }
233 souaissa 69
234 francois 283 OT_VECTEUR_3D::OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd)
235     {
236     valeur[0]=mdd.valeur[0];
237     valeur[1]=mdd.valeur[1];
238     valeur[2]=mdd.valeur[2];
239     }
240    
241     OT_VECTEUR_3D::OT_VECTEUR_3D(void)
242     {
243     valeur[0]=0.;
244     valeur[1]=0.;
245     valeur[2]=0.;
246     }
247    
248     double OT_VECTEUR_3D::get_x(void) const
249     {
250     return valeur[0];
251     }
252    
253    
254     double OT_VECTEUR_3D::get_y(void) const
255     {
256     return valeur[1];
257     }
258    
259    
260     double OT_VECTEUR_3D::get_z(void) const
261     {
262     return valeur[2];
263     }
264    
265     void OT_VECTEUR_3D::change_x(double x)
266     {
267     valeur[0]=x;
268     }
269    
270     void OT_VECTEUR_3D::change_y(double y)
271     {
272     valeur[1]=y;
273     }
274    
275     void OT_VECTEUR_3D::change_z(double z)
276     {
277     valeur[2]=z;
278     }
279    
280     double* OT_VECTEUR_3D::get_xyz(void)
281     {
282     return valeur;
283     }
284    
285     OT_VECTEUR_3D::operator const double* () const
286     {
287     return valeur;
288     }
289    
290     OT_VECTEUR_3D::operator double* ()
291     {
292     return valeur;
293     }
294    
295     double OT_VECTEUR_3D::operator[] (int i) const
296     {
297     return valeur[i];
298     }
299    
300     double & OT_VECTEUR_3D::operator[] (int i)
301     {
302     return valeur[i];
303     }
304    
305     double OT_VECTEUR_3D::operator() (int i) const
306     {
307     return valeur[i];
308     }
309     double & OT_VECTEUR_3D::operator() (int i)
310     {
311     return valeur[i];
312     }
313    
314     double OT_VECTEUR_3D::get_longueur(void) const
315     {
316     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
317     }
318    
319     double OT_VECTEUR_3D::get_longueur2(void) const
320     {
321     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
322     }
323    
324    
325     void OT_VECTEUR_3D::norme(void)
326     {
327     double longueur=get_longueur();
328     if (longueur != 0)
329     {
330     valeur[0]=valeur[0]/longueur;
331     valeur[2]=valeur[2]/longueur;
332     valeur[1]=valeur[1]/longueur;
333     }
334     }
335    
336     OT_VECTEUR_3D OT_VECTEUR_3D::gram_shmidt(const OT_VECTEUR_3D& vint)
337     {
338     OT_VECTEUR_3D v(0.,0.,0.);
339     double alpha=(*this)*vint;
340     v= *this-alpha*vint;
341     return v;
342     }
343    
344     OT_VECTEUR_3D OT_VECTEUR_3D::unite(int i)
345     {
346     OT_VECTEUR_3D v(0.,0.,0.);
347     v[i]=1.;
348     return v;
349     }
350    
351    
352     int OT_VECTEUR_3D::compare_valeur (const OT_VECTEUR_3D& mdd) const
353     {
354     return memcmp(valeur, mdd.valeur, 3*sizeof(double));
355     }
356    
357     bool OT_VECTEUR_3D::operator== (const OT_VECTEUR_3D& mdd) const
358     {
359     return compare_valeur(mdd) == 0;
360     }
361    
362     bool OT_VECTEUR_3D::operator!= (const OT_VECTEUR_3D& mdd) const
363     {
364     return compare_valeur(mdd) != 0;
365     }
366    
367     bool OT_VECTEUR_3D::operator< (const OT_VECTEUR_3D& mdd) const
368     {
369     return compare_valeur(mdd) < 0;
370     }
371    
372     bool OT_VECTEUR_3D::operator<= (const OT_VECTEUR_3D& mdd) const
373     {
374     return compare_valeur(mdd) <= 0;
375     }
376    
377     bool OT_VECTEUR_3D::operator> (const OT_VECTEUR_3D& mdd) const
378     {
379     return compare_valeur(mdd) > 0;
380     }
381    
382     bool OT_VECTEUR_3D::operator>= (const OT_VECTEUR_3D& mdd) const
383     {
384     return compare_valeur(mdd) >= 0;
385     }
386    
387     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec)
388     {
389     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<"}, ";
390     return __os;
391     }
392    
393     OT_VECTEUR_3D operator/ (const OT_VECTEUR_3D& mdd1, double diviseur)
394     {
395     OT_VECTEUR_3D kQuot;
396    
397     if ( diviseur != (double)0.0 )
398     {
399     double facteur = ((double)1.0)/diviseur;
400     kQuot.valeur[0] = facteur*mdd1.valeur[0];
401     kQuot.valeur[1] = facteur*mdd1.valeur[1];
402     kQuot.valeur[2] = facteur*mdd1.valeur[2];
403     }
404     else
405     {
406     kQuot.valeur[0] = 1E300;
407     kQuot.valeur[1] = 1E300;
408     kQuot.valeur[2] = 1E300;
409     }
410    
411     return kQuot;
412     }
413    
414     OT_VECTEUR_3D operator- (const OT_VECTEUR_3D& mdd1)
415     {
416     return OT_VECTEUR_3D(
417     -mdd1.valeur[0],
418     -mdd1.valeur[1],
419     -mdd1.valeur[2]);
420     }
421    
422     double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
423     {
424     double tmp;
425     tmp=mdd1.valeur[0]*mdd2.valeur[0]+mdd1.valeur[1]*mdd2.valeur[1]+mdd1.valeur[2]*mdd2.valeur[2];
426     return tmp;
427     }
428    
429     OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2)
430     {
431     OT_VECTEUR_3D tmp;
432     tmp.valeur[0]=mdd1*mdd2.valeur[0];
433     tmp.valeur[1]=mdd1*mdd2.valeur[1];
434     tmp.valeur[2]=mdd1*mdd2.valeur[2];
435     return tmp;
436     }
437    
438     OT_VECTEUR_3D& OT_VECTEUR_3D::operator+= (const OT_VECTEUR_3D& mdd)
439     {
440     valeur[0] += mdd.valeur[0];
441     valeur[1] += mdd.valeur[1];
442     valeur[2] += mdd.valeur[2];
443     return *this;
444     }
445     OT_VECTEUR_3D& OT_VECTEUR_3D::operator-= (const OT_VECTEUR_3D& mdd)
446     {
447     valeur[0] -= mdd.valeur[0];
448     valeur[1] -= mdd.valeur[1];
449     valeur[2] -= mdd.valeur[2];
450     return *this;
451     }
452     OT_VECTEUR_3D& OT_VECTEUR_3D::operator*= (double facteur)
453     {
454     valeur[0] *= facteur;
455     valeur[1] *= facteur;
456     valeur[2] *= facteur;
457     return *this;
458     }
459     OT_VECTEUR_3D& OT_VECTEUR_3D::operator/= (double diviseur)
460     {
461     if ( diviseur != (double)0.0 )
462     {
463     double facteur = ((double)1.0)/diviseur;
464     valeur[0] *= facteur;
465     valeur[1] *= facteur;
466     valeur[2] *= facteur;
467     }
468     else
469     {
470     valeur[0] = 1E300;
471     valeur[1] = 1E300;
472     valeur[2] = 1E300;
473     }
474    
475     return *this;
476     }
477    
478     OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
479     {
480     OT_VECTEUR_3D tmp;
481     tmp.valeur[0]=mdd1.valeur[1]*mdd2.valeur[2]-mdd1.valeur[2]*mdd2.valeur[1];
482     tmp.valeur[1]=mdd1.valeur[2]*mdd2.valeur[0]-mdd1.valeur[0]*mdd2.valeur[2];
483     tmp.valeur[2]=mdd1.valeur[0]*mdd2.valeur[1]-mdd1.valeur[1]*mdd2.valeur[0];
484     return tmp;
485     }
486    
487     double OT_VECTEUR_3D::diff(void)
488     {
489     return 0.33333333333333*(fabs(valeur[0])+fabs(valeur[1])+fabs(valeur[2]));
490     }
491    
492    
493     OT_MATRICE_3D::OT_MATRICE_3D(OT_VECTEUR_3D& colonne1,OT_VECTEUR_3D& colonne2,OT_VECTEUR_3D& colonne3)
494     {
495     vec[0]=colonne1;
496     vec[1]=colonne2;
497     vec[2]=colonne3;
498     }
499    
500     OT_MATRICE_3D::OT_MATRICE_3D(const OT_MATRICE_3D& mdd)
501     {
502     vec[0]=mdd.vec[0];
503     vec[1]=mdd.vec[1];
504     vec[2]=mdd.vec[2];
505     }
506    
507     OT_MATRICE_3D::OT_MATRICE_3D(void)
508     {
509     for (int i=0;i<3;i++)
510     {
511     for (int j=0;j<3;j++)
512     {
513     vec[i][j]=0.;
514     }
515    
516     }
517    
518     }
519     std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat)
520     {
521    
522     __os << "{ ";
523     for (unsigned i=0; i<3; i++)
524     {
525     __os << "[ "<< __mat(i,0)<<" ]\t [ "<<__mat(i,1) <<" ]\t [ "<<__mat(i,2);
526     if (i+1 < 3)
527     __os << std::endl << " ";
528     }
529     __os << " }" << std::endl;
530     return __os;
531     }
532    
533     OT_VECTEUR_3D & OT_MATRICE_3D::operator [](int i)
534     {
535     return vec[i];
536     }
537    
538     OT_MATRICE_3D::OT_MATRICE_3D(double* t)
539     {
540     for (int i=0;i<3;i++)
541     {
542     for (int j=0;j<3;j++)
543     {
544     vec[i][j]=t[i*3+j];
545     }
546    
547     }
548     }
549    
550     double OT_MATRICE_3D::valeur(int iLigne, int iCol) const
551     {
552     return vec[iCol][iLigne];
553     }
554     double & OT_MATRICE_3D::valeur(int iLigne, int iCol)
555     {
556     return vec[iCol][iLigne];
557     }
558     double OT_MATRICE_3D::operator() (int iLigne, int iCol) const
559     {
560     return vec[iCol][iLigne];
561     }
562     double & OT_MATRICE_3D::operator() (int iLigne, int iCol)
563     {
564     return vec[iCol][iLigne];
565     }
566     double OT_MATRICE_3D::get_determinant()
567     {
568     double coFacteur0 = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
569     double coFacteur1 = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
570     double coFacteur2 = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
571     double determinant = valeur(0,0)*coFacteur0 + valeur(0,1)*coFacteur1 + valeur(0,2)*coFacteur2;
572     return determinant;
573     }
574     void OT_MATRICE_3D::identite(void)
575     {
576     for (unsigned i = 0; i<3; i++)
577     for (unsigned j = 0; j < 3; j++)
578     vec[i][j] = (i==j) ? 1.0 : 0.0 ;
579     }
580    
581     void OT_MATRICE_3D::transpose(OT_MATRICE_3D& res) const
582     {
583     for (unsigned i = 0; i<3; i++)
584     for (unsigned j = 0; j < 3; j++)
585     res.vec[i][j] = vec[j][i];
586     }
587    
588     OT_MATRICE_3D OT_MATRICE_3D::transpose() const
589     {
590     OT_MATRICE_3D temp;
591     for (unsigned i = 0; i<3; i++)
592     for (unsigned j = 0; j < 3; j++)
593     temp.valeur(i,j) =valeur(j,i);
594    
595     return temp;
596     }
597    
598     OT_MATRICE_3D OT_MATRICE_3D::inverse () const
599     {
600     // Invert a 3x3 using cofactors. This is faster than using a generic
601     // Gaussian elimination because of the loop overhead of such a method.
602    
603     OT_MATRICE_3D matInverse;
604    
605     matInverse.valeur(0,0) = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
606     matInverse.valeur(0,1) = valeur(0,2)*valeur(2,1) - valeur(0,1)*valeur(2,2);
607     matInverse.valeur(0,2) = valeur(0,1)*valeur(1,2) - valeur(0,2)*valeur(1,1);
608     matInverse.valeur(1,0) = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
609     matInverse.valeur(1,1) = valeur(0,0)*valeur(2,2) - valeur(0,2)*valeur(2,0);
610     matInverse.valeur(1,2) = valeur(0,2)*valeur(1,0) - valeur(0,0)*valeur(1,2);
611     matInverse.valeur(2,0) = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
612     matInverse.valeur(2,1) = valeur(0,1)*valeur(2,0) - valeur(0,0)*valeur(2,1);
613     matInverse.valeur(2,2) = valeur(0,0)*valeur(1,1) - valeur(0,1)*valeur(1,0);
614    
615     double det = valeur(0,0)*matInverse(0,0) + valeur(0,1)*matInverse(1,0)+
616     valeur(0,2)*matInverse(2,0);
617    
618     if ( fabs(det) <= 1E-100 )
619     {
620     matInverse.identite();
621     return matInverse;
622     }
623    
624     double invDet = 1/det;
625    
626     for (int i=0; i<3; i++)
627     for (int j=0; j<3; j++)
628     matInverse.vec[i][j] *= invDet;
629    
630     return matInverse;
631     }
632    
633     void OT_MATRICE_3D::change_vecteur1(OT_VECTEUR_3D v)
634     {
635     vec[0]=v;
636     }
637     void OT_MATRICE_3D::change_vecteur2(OT_VECTEUR_3D v)
638     {
639     vec[1]=v;
640     }
641     void OT_MATRICE_3D::change_vecteur3(OT_VECTEUR_3D v)
642     {
643     vec[2]=v;
644     }
645     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur1(void)
646     {
647     return vec[0];
648     }
649     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur2(void)
650     {
651     return vec[1];
652     }
653     OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur3(void)
654     {
655     return vec[2];
656     }
657    
658    
659    
660     OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
661     {
662     OT_MATRICE_3D tmp;
663     for (int i=0;i<3;i++) {
664     for (int j=0;j<3;j++) tmp(i,j)= mdd1(i,j)+mdd2(i,j);
665     }
666     return tmp;
667     }
668    
669    
670     OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2)
671     {
672     OT_VECTEUR_3D tmp;
673     tmp(0)=mdd1(0,0)*mdd2(0)+mdd1(0,1)*mdd2(1)+mdd1(0,2)*mdd2(2);
674     tmp(1)=mdd1(1,0)*mdd2(0)+mdd1(1,1)*mdd2(1)+mdd1(1,2)*mdd2(2);
675     tmp(2)=mdd1(2,0)*mdd2(0)+mdd1(2,1)*mdd2(1)+mdd1(2,2)*mdd2(2);
676     return tmp;
677     }
678    
679     OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
680     {
681     OT_VECTEUR_3D tmp;
682     tmp(0)=mdd1(0)+mdd2(0);
683     tmp(1)=mdd1(1)+mdd2(1);
684     tmp(2)=mdd1(2)+mdd2(2);
685     return tmp;
686     }
687    
688     OT_VECTEUR_3D operator-(const class OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
689     {
690     OT_VECTEUR_3D tmp;
691     tmp.valeur[0]=mdd1.valeur[0]-mdd2.valeur[0];
692     tmp.valeur[1]=mdd1.valeur[1]-mdd2.valeur[1];
693     tmp.valeur[2]=mdd1.valeur[2]-mdd2.valeur[2];
694     return tmp;
695     }
696    
697     OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
698     {
699     OT_MATRICE_3D tmp;
700     for (int i=0; i<3; i++)
701     for (int j=0; j<3; j++)
702     {
703     tmp(i,j) = 0;
704     for (int k=0; k<3; k++)
705     tmp(i,j) += mdd1(i,k)*mdd2(k,j);
706     }
707     return tmp;
708     }
709    
710     #ifdef ot_vecteur_4d
711     OT_VECTEUR_4D::OT_VECTEUR_4D (double v[4])
712     {
713     for (int i=0; i<4; i++)
714     valeur[i]=v[i];
715     }
716    
717     OT_VECTEUR_4D::OT_VECTEUR_4D (double x, double y, double z, double w)
718     {
719     valeur[0] = x;
720     valeur[1] = y;
721     valeur[2] = z;
722     valeur[3] = w;
723     }
724    
725     OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
726     {
727     for (int i=0; i<4; i++)
728     valeur[i]=v[i];
729     }
730    
731    
732     double & OT_VECTEUR_4D::operator()(int i)
733     {
734     return valeur[i];
735     }
736    
737     double OT_VECTEUR_4D::operator()(int i) const
738     {
739     return valeur[i];
740     }
741    
742     double & OT_VECTEUR_4D::operator[](int i)
743     {
744     return valeur[i];
745     }
746    
747     double OT_VECTEUR_4D::operator[](int i) const
748     {
749     return valeur[i];
750     }
751    
752     OT_VECTEUR_4D::operator const double* () const
753     {
754     return valeur;
755     }
756    
757     OT_VECTEUR_4D::operator double* ()
758     {
759     return valeur;
760     }
761    
762     double OT_VECTEUR_4D::get_x(void) const
763     {
764     return valeur[0];
765     }
766     double & OT_VECTEUR_4D::x(void)
767     {
768     return valeur[0];
769     }
770     double OT_VECTEUR_4D::get_y(void) const
771     {
772     return valeur[1];
773     }
774     double & OT_VECTEUR_4D::y(void)
775     {
776     return valeur[1];
777     }
778     double OT_VECTEUR_4D::get_z(void) const
779     {
780     return valeur[2];
781     }
782     double & OT_VECTEUR_4D::z(void)
783     {
784     return valeur[2];
785     }
786     double OT_VECTEUR_4D::get_w(void) const
787     {
788     return valeur[3];
789     }
790     double & OT_VECTEUR_4D::w(void)
791     {
792     return valeur[3];
793     }
794     void OT_VECTEUR_4D::change_x(double x)
795     {
796     valeur[0] = x;
797     }
798     void OT_VECTEUR_4D::change_y(double y)
799     {
800     valeur[1] = y;
801     }
802     void OT_VECTEUR_4D::change_z(double z)
803     {
804     valeur[2] = z;
805     }
806     void OT_VECTEUR_4D::change_w(double w)
807     {
808     valeur[3] = w;
809     }
810     double* OT_VECTEUR_4D::get_xyzw(void)
811     {
812     return valeur;
813     }
814    
815     OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
816     {
817     return OT_VECTEUR_4D(
818     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
819     );
820     }
821    
822     OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
823     {
824     return OT_VECTEUR_4D(
825     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
826     );
827     }
828    
829     OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
830     {
831     return OT_VECTEUR_4D(
832     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
833     );
834     }
835     OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
836     {
837     return OT_VECTEUR_4D(
838     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
839     );
840     }
841    
842     OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
843     {
844     double inv = 1/a;
845     return OT_VECTEUR_4D(
846     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
847     );
848     }
849    
850    
851     OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
852     {
853     double inv = 1/a;
854     return OT_VECTEUR_4D(
855     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
856     );
857     }
858    
859     double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
860     {
861     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
862     }
863    
864    
865     OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
866     {
867     valeur[0] += rkV.valeur[0];
868     valeur[1] += rkV.valeur[1];
869     valeur[2] += rkV.valeur[2];
870     valeur[3] += rkV.valeur[3];
871     return *this;
872     }
873    
874     OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
875     {
876     valeur[0] -= rkV.valeur[0];
877     valeur[1] -= rkV.valeur[1];
878     valeur[2] -= rkV.valeur[2];
879     valeur[3] -= rkV.valeur[3];
880     return *this;
881     }
882     OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
883     {
884     valeur[0] *= fScalar;
885     valeur[1] *= fScalar;
886     valeur[2] *= fScalar;
887     valeur[3] *= fScalar;
888     return *this;
889     }
890     OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
891     {
892     double a = 1/fScalar;
893     valeur[0] *= a;
894     valeur[1] *= a;
895     valeur[2] *= a;
896     valeur[3] *= a;
897     return *this;
898     }
899     OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
900     {
901     valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
902     return *this;
903     }
904    
905     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
906     {
907     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
908     return __os;
909     }
910     #endif // ot_vecteur_4d
911    
912    
913    
914     // ot_vecteur_3d
915    
916    
917    
918     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 v[3])
919     {
920     for (int i=0; i<3; i++)
921     valeur[i]=v[i];
922     }
923    
924     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 x, double2 y, double2 z)
925     {
926     valeur[0] = x;
927     valeur[1] = y;
928     valeur[2] = z;
929     }
930    
931 francois 550 OT_VECTEUR_3DD::OT_VECTEUR_3DD(double2 *xyz1,double2 *xyz2)
932     {
933     valeur[0]=xyz2[0]-xyz1[0];
934     valeur[1]=xyz2[1]-xyz1[1];
935     valeur[2]=xyz2[2]-xyz1[2];
936     }
937    
938 francois 283 OT_VECTEUR_3DD::OT_VECTEUR_3DD (const OT_VECTEUR_3DD & v)
939     {
940     for (int i=0; i<3; i++)
941     valeur[i]=v[i];
942     }
943    
944    
945     double2 & OT_VECTEUR_3DD::operator()(int i)
946     {
947     return valeur[i];
948     }
949    
950     double2 OT_VECTEUR_3DD::operator()(int i) const
951     {
952     return valeur[i];
953     }
954    
955     double2 & OT_VECTEUR_3DD::operator[](int i)
956     {
957     return valeur[i];
958     }
959    
960     double2 OT_VECTEUR_3DD::operator[](int i) const
961     {
962     return valeur[i];
963     }
964    
965     OT_VECTEUR_3DD::operator const double2* () const
966     {
967     return valeur;
968     }
969    
970     OT_VECTEUR_3DD::operator double2* ()
971     {
972     return valeur;
973     }
974    
975     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator =(const OT_VECTEUR_3DD& v3d)
976     {
977     if (this==&v3d) return *this;
978     valeur [0]=v3d.get_x();
979     valeur [1]=v3d.get_y();
980     valeur [2]=v3d.get_z();
981     return *this;
982     }
983     double2 OT_VECTEUR_3DD::norme()
984     {
985     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
986     nor=sqrt(nor);
987     return nor;
988     }
989     OT_VECTEUR_3DD OT_VECTEUR_3DD::vecteur_norme()
990     {
991     OT_VECTEUR_3DD nor;
992     double2 zero=0.;
993     double2 norme= this->norme() ;
994     nor=(*this)*(1./norme);
995     return nor;
996     }
997 francois 550 double2 OT_VECTEUR_3DD::get_longueur(void)
998     {
999     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1000     }
1001 francois 283
1002 francois 550 double2 OT_VECTEUR_3DD::get_longueur2(void)
1003     {
1004     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1005     }
1006    
1007 francois 283 double2 OT_VECTEUR_3DD::get_x(void) const
1008     {
1009     return valeur[0];
1010     }
1011     double2 & OT_VECTEUR_3DD::x(void)
1012     {
1013     return valeur[0];
1014     }
1015     double2 OT_VECTEUR_3DD::get_y(void) const
1016     {
1017     return valeur[1];
1018     }
1019     double2 & OT_VECTEUR_3DD::y(void)
1020     {
1021     return valeur[1];
1022     }
1023     double2 OT_VECTEUR_3DD::get_z(void) const
1024     {
1025     return valeur[2];
1026     }
1027     double2 & OT_VECTEUR_3DD::z(void)
1028     {
1029     return valeur[2];
1030     }
1031     void OT_VECTEUR_3DD::change_x(double2 x)
1032     {
1033     valeur[0] = x;
1034     }
1035     void OT_VECTEUR_3DD::change_y(double2 y)
1036     {
1037     valeur[1] = y;
1038     }
1039     void OT_VECTEUR_3DD::change_z(double2 z)
1040     {
1041     valeur[2] = z;
1042     }
1043     double2* OT_VECTEUR_3DD::get_xyz(void)
1044     {
1045     return valeur;
1046     }
1047    
1048     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator+ (const OT_VECTEUR_3DD & a)
1049     {
1050     return OT_VECTEUR_3DD(
1051     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2]);
1052     }
1053    
1054     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator- (const OT_VECTEUR_3DD & a)
1055     {
1056     return OT_VECTEUR_3DD(
1057     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2));
1058     }
1059    
1060     OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a)
1061     {
1062     return OT_VECTEUR_3DD(
1063     a*rkV[0],a*rkV[1],a*rkV[2]);
1064     }
1065     OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV)
1066     {
1067     return OT_VECTEUR_3DD(
1068     a*rkV[0],a*rkV[1],a*rkV[2]);
1069     }
1070    
1071     OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a)
1072     {
1073     double2 inv = 1/a;
1074     return OT_VECTEUR_3DD(
1075     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1076     }
1077    
1078    
1079     OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV)
1080     {
1081     double2 inv = 1/a;
1082     return OT_VECTEUR_3DD(
1083     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1084     }
1085     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator&(const OT_VECTEUR_3DD& v2)
1086     {
1087     OT_VECTEUR_3DD tmp;
1088     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1089     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1090     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1091     return tmp;
1092     }
1093     double2 OT_VECTEUR_3DD::operator* (const OT_VECTEUR_3DD & a)
1094     {
1095     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2];
1096     }
1097    
1098    
1099     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator+= (const OT_VECTEUR_3DD& rkV)
1100     {
1101     valeur[0] = valeur[0] +rkV.valeur[0];
1102     valeur[1] = valeur[1] +rkV.valeur[1];
1103     valeur[2] = valeur[2] +rkV.valeur[2];
1104     return *this;
1105     }
1106    
1107     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator-= (const OT_VECTEUR_3DD& rkV)
1108     {
1109     valeur[0] = valeur[0] -rkV.valeur[0];
1110     valeur[1] = valeur[1] -rkV.valeur[1];
1111     valeur[2] = valeur[2] -rkV.valeur[2];
1112     return *this;
1113     }
1114     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator*= (double2 fScalar)
1115     {
1116     valeur[0] =valeur[0] * fScalar;
1117     valeur[1] =valeur[1] * fScalar;
1118     valeur[2] =valeur[2] * fScalar;
1119     return *this;
1120     }
1121     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator/= (double2 fScalar)
1122     {
1123     double2 a = 1/fScalar;
1124     valeur[0] =valeur[0] * a;
1125     valeur[1] =valeur[1] * a;
1126     valeur[2] =valeur[2] * a;
1127     return *this;
1128     }
1129    
1130    
1131     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec)
1132     {
1133     __os << "[ "<<setw(20)<< __vec[0]<<setw(4)<<", "<<setw(20)<<__vec[1]<<", "<<setw(20)<<__vec[2]<<setw(4)<<", "<<setw(20)<<"] ";
1134     return __os;
1135     }
1136    
1137     int OT_VECTEUR_3DD::compare_valeur (const OT_VECTEUR_3DD& mdd) const
1138     {
1139     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2])
1140     return 1;
1141     else return 0;
1142    
1143     }
1144    
1145     bool OT_VECTEUR_3DD::operator==(const OT_VECTEUR_3DD& mdd) const
1146     {
1147     return compare_valeur(mdd);
1148     }
1149    
1150    
1151    
1152    
1153    
1154    
1155    
1156    
1157    
1158    
1159     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 v[4])
1160     {
1161     for (int i=0; i<4; i++)
1162     valeur[i]=v[i];
1163     }
1164    
1165     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 x, double2 y, double2 z, double2 w)
1166     {
1167     valeur[0] = x;
1168     valeur[1] = y;
1169     valeur[2] = z;
1170     valeur[3] = w;
1171     }
1172    
1173     OT_VECTEUR_4DD::OT_VECTEUR_4DD (const OT_VECTEUR_4DD & v)
1174     {
1175     for (int i=0; i<4; i++)
1176     valeur[i]=v[i];
1177     }
1178    
1179    
1180     double2 & OT_VECTEUR_4DD::operator()(int i)
1181     {
1182     return valeur[i];
1183     }
1184    
1185     double2 OT_VECTEUR_4DD::operator()(int i) const
1186     {
1187     return valeur[i];
1188     }
1189    
1190     double2 & OT_VECTEUR_4DD::operator[](int i)
1191     {
1192     return valeur[i];
1193     }
1194    
1195     double2 OT_VECTEUR_4DD::operator[](int i) const
1196     {
1197     return valeur[i];
1198     }
1199    
1200     OT_VECTEUR_4DD::operator const double2* () const
1201     {
1202     return valeur;
1203     }
1204    
1205     OT_VECTEUR_4DD::operator double2* ()
1206     {
1207     return valeur;
1208     }
1209    
1210     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator =(const OT_VECTEUR_4DD& v4d)
1211     {
1212     if (this==&v4d) return *this;
1213     valeur [0]=v4d.get_x();
1214     valeur [1]=v4d.get_y();
1215     valeur [2]=v4d.get_z();
1216     valeur [3]=v4d.get_w();
1217     return *this;
1218     }
1219     double2 OT_VECTEUR_4DD::norme()
1220     {
1221     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2]+valeur [3]*valeur [3];
1222     nor=nor^0.5;
1223     return nor;
1224     }
1225     OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme()
1226     {
1227     OT_VECTEUR_4DD nor;
1228     double2 zero=0.;
1229     double2 norme= this->norme() ;
1230     assert(norme!=zero) ;
1231     nor=(*this)*(1./norme);
1232     return nor;
1233     }
1234    
1235 francois 363 OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme_3d()
1236     {
1237     double2 norme= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1238     norme=norme^0.5;
1239     OT_VECTEUR_4DD nor;
1240     double2 zero=0.;
1241     assert(norme!=zero) ;
1242     nor.change_x(valeur[0]/norme);
1243     nor.change_y(valeur[1]/norme);
1244     nor.change_z(valeur[2]/norme);
1245     nor.change_w(valeur[3]);
1246     return nor;
1247     }
1248 francois 283 double2 OT_VECTEUR_4DD::get_x(void) const
1249     {
1250     return valeur[0];
1251     }
1252     double2 & OT_VECTEUR_4DD::x(void)
1253     {
1254     return valeur[0];
1255     }
1256     double2 OT_VECTEUR_4DD::get_y(void) const
1257     {
1258     return valeur[1];
1259     }
1260     double2 & OT_VECTEUR_4DD::y(void)
1261     {
1262     return valeur[1];
1263     }
1264     double2 OT_VECTEUR_4DD::get_z(void) const
1265     {
1266     return valeur[2];
1267     }
1268     double2 & OT_VECTEUR_4DD::z(void)
1269     {
1270     return valeur[2];
1271     }
1272     double2 OT_VECTEUR_4DD::get_w(void) const
1273     {
1274     return valeur[3];
1275     }
1276     double2 & OT_VECTEUR_4DD::w(void)
1277     {
1278     return valeur[3];
1279     }
1280     void OT_VECTEUR_4DD::change_x(double2 x)
1281     {
1282     valeur[0] = x;
1283     }
1284     void OT_VECTEUR_4DD::change_y(double2 y)
1285     {
1286     valeur[1] = y;
1287     }
1288     void OT_VECTEUR_4DD::change_z(double2 z)
1289     {
1290     valeur[2] = z;
1291     }
1292     void OT_VECTEUR_4DD::change_w(double2 w)
1293     {
1294     valeur[3] = w;
1295     }
1296     double2* OT_VECTEUR_4DD::get_xyzw(void)
1297     {
1298     return valeur;
1299     }
1300    
1301     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator+ (const OT_VECTEUR_4DD & a)
1302     {
1303     return OT_VECTEUR_4DD(
1304     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
1305     );
1306     }
1307    
1308     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator- (const OT_VECTEUR_4DD & a)
1309     {
1310     return OT_VECTEUR_4DD(
1311     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
1312     );
1313     }
1314    
1315     OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a)
1316     {
1317     return OT_VECTEUR_4DD(
1318     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1319     );
1320     }
1321     OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV)
1322     {
1323     return OT_VECTEUR_4DD(
1324     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1325     );
1326     }
1327    
1328     OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a)
1329     {
1330     double2 inv = 1/a;
1331     return OT_VECTEUR_4DD(
1332     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1333     );
1334     }
1335    
1336    
1337     OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV)
1338     {
1339     double2 inv = 1/a;
1340     return OT_VECTEUR_4DD(
1341     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1342     );
1343     }
1344     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator^(const OT_VECTEUR_4DD& v2)
1345     {
1346     OT_VECTEUR_4DD tmp;
1347     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1348     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1349     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1350     tmp[3]= 0;
1351     //tmp[3]= valeur[1]*v2[2]-valeur[2]*v2[1];
1352     return tmp;
1353     }
1354     double2 OT_VECTEUR_4DD::operator* (const OT_VECTEUR_4DD & a)
1355     {
1356     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
1357     }
1358    
1359    
1360     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator+= (const OT_VECTEUR_4DD& rkV)
1361     {
1362     valeur[0] = valeur[0] +rkV.valeur[0];
1363     valeur[1] = valeur[1] +rkV.valeur[1];
1364     valeur[2] = valeur[2] +rkV.valeur[2];
1365     valeur[3] = valeur[3] +rkV.valeur[3];
1366     return *this;
1367     }
1368    
1369     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator-= (const OT_VECTEUR_4DD& rkV)
1370     {
1371     valeur[0] = valeur[0] -rkV.valeur[0];
1372     valeur[1] = valeur[1] -rkV.valeur[1];
1373     valeur[2] = valeur[2] -rkV.valeur[2];
1374     valeur[3] = valeur[3] -rkV.valeur[3];
1375     return *this;
1376     }
1377     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator*= (double2 fScalar)
1378     {
1379     valeur[0] =valeur[0] * fScalar;
1380     valeur[1] =valeur[1] * fScalar;
1381     valeur[2] =valeur[2] * fScalar;
1382     valeur[3] =valeur[3] * fScalar;
1383     return *this;
1384     }
1385     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator/= (double2 fScalar)
1386     {
1387     double2 a = 1/fScalar;
1388     valeur[0] =valeur[0] * a;
1389     valeur[1] =valeur[1] * a;
1390     valeur[2] =valeur[2] * a;
1391     valeur[3] =valeur[3] * a;
1392     return *this;
1393     }
1394    
1395    
1396     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec)
1397     {
1398     __os << "[ "<<setw(20)<< __vec[0]<<setw(4)<<", "<<setw(20)<<__vec[1]<<", "<<setw(20)<<__vec[2]<<setw(4)<<", "<<setw(20)<<__vec[3]<<setw(4)<<"] ";
1399     return __os;
1400     }
1401    
1402     int OT_VECTEUR_4DD::compare_valeur (const OT_VECTEUR_4DD& mdd) const
1403     {
1404     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2]&&valeur[3]==mdd.valeur[3])
1405     return 1;
1406     else return 0;
1407    
1408     }
1409    
1410     bool OT_VECTEUR_4DD::operator==(const OT_VECTEUR_4DD& mdd) const
1411     {
1412     return compare_valeur(mdd);
1413     }
1414    
1415    
1416    
1417 francois 743 bool OT_VECTEUR_4DD::est_nul(void)
1418     {
1419     double2 ZERO(0.);
1420     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO&&valeur[3]==ZERO)
1421     return true;
1422     return false;
1423     }
1424 francois 283
1425 francois 743 bool OT_VECTEUR_4DD::est_nul_3d(void)
1426     {
1427     double2 ZERO(0.);
1428     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO)
1429     return true;
1430     return false;
1431     }
1432 francois 283
1433    
1434    
1435    
1436    
1437    
1438    
1439    
1440    
1441    
1442    
1443 francois 743
1444 francois 283 int OPERATEUR::egal(double a,double b,double eps)
1445     {
1446     double res=fabs(a-b);
1447     if (res<eps) return(1);
1448     return(0);
1449     }
1450    
1451 couturad 906 int OPERATEUR::egal(double* xyz1, double* xyz2, double eps)
1452     {
1453     if(fabs(xyz1[0]-xyz2[0])<eps)
1454     if(fabs(xyz1[1]-xyz2[1])<eps)
1455     if(fabs(xyz1[2]-xyz2[2])<eps)
1456     return 1;
1457     return 0;
1458     }
1459 francois 283
1460 couturad 906
1461    
1462 francois 283 double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
1463     {
1464     OT_VECTEUR_3D vec12(noeud1,noeud2);
1465     OT_VECTEUR_3D vec13(noeud1,noeud3);
1466     OT_VECTEUR_3D vec23(noeud2,noeud3);
1467     double d12=vec12.get_longueur();
1468     double d13=vec13.get_longueur();
1469     double d23=vec23.get_longueur();
1470     double dmax=max(d12,d13);
1471     dmax=max(dmax,d23);
1472     double p=0.5*(d12+d13+d23);
1473     double crit=(p-d12)*(p-d13)*(p-d23)/p;
1474     if (crit<0) crit=0.;
1475     crit=sqrt(crit);
1476     crit=crit/dmax;
1477     crit=crit*3.4641101614;
1478     return crit;
1479     }
1480    
1481     void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
1482     {
1483     int *p=(int*)(&(val));
1484     val1=(*p);
1485     val2=(*(p+1));
1486     }
1487    
1488     double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
1489     {
1490     OT_VECTEUR_3D ab(noeud1,noeud2);
1491     OT_VECTEUR_3D ac(noeud1,noeud3);
1492     OT_VECTEUR_3D cb(noeud3,noeud2);
1493     OT_VECTEUR_3D db(noeud4,noeud2);
1494     OT_VECTEUR_3D da(noeud4,noeud1);
1495     OT_VECTEUR_3D dc(noeud4,noeud3);
1496     double dab=ab.get_longueur();
1497     double dac=ac.get_longueur();
1498     double dcb=cb.get_longueur();
1499     double ddb=db.get_longueur();
1500     double dda=da.get_longueur();
1501     double ddc=dc.get_longueur();
1502    
1503     double dmax=max(dab,dac);
1504     dmax=max(dmax,dcb);
1505     dmax=max(dmax,ddb);
1506     dmax=max(dmax,dda);
1507     dmax=max(dmax,ddc);
1508    
1509     OT_VECTEUR_3D pvec=ab&ac;
1510     double vol=pvec*da;
1511     if (vol>0.) return 0.;
1512     vol=fabs(vol);
1513     double som=pvec.get_longueur()/2.;
1514     pvec=ab&da;
1515     som=som+pvec.get_longueur()/2.;
1516     pvec=ac&dc;
1517     som=som+pvec.get_longueur()/2.;
1518     pvec=cb&db;
1519     som=som+pvec.get_longueur()/2.;
1520     double crit=vol/som/dmax/0.408249;
1521     return crit;
1522     }
1523    
1524 francois 418 int OPERATEUR::estdansletetra(double *xyz1,double *xyz2,double *xyz3,double *xyz4,double x,double y, double z)
1525     {
1526     OT_VECTEUR_3D v1(xyz2[0]-xyz1[0],xyz2[1]-xyz1[1],xyz2[2]-xyz1[2]);
1527     OT_VECTEUR_3D v2(xyz3[0]-xyz1[0],xyz3[1]-xyz1[1],xyz3[2]-xyz1[2]);
1528     OT_VECTEUR_3D v3(xyz4[0]-xyz1[0],xyz4[1]-xyz1[1],xyz4[2]-xyz1[2]);
1529     OT_VECTEUR_3D v4(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1530     OT_MATRICE_3D mat(v1,v2,v3);
1531     OT_MATRICE_3D mat1(v4,v2,v3);
1532     OT_MATRICE_3D mat2(v1,v4,v3);
1533     OT_MATRICE_3D mat3(v1,v2,v4);
1534     double det=mat.get_determinant();
1535     double xsi=mat1.get_determinant()/det;
1536     double eta=mat2.get_determinant()/det;
1537     double dseta=mat3.get_determinant()/det;
1538     int reponse1=1;
1539     int reponse2=1;
1540     double eps=0.0000001;
1541     if (xsi<-eps) reponse1=0;
1542     if (eta<-eps) reponse1=0;
1543     if (dseta<-eps) reponse1=0;
1544     if (xsi+eta+dseta>1.+eps) reponse1=0;
1545     if (xsi<eps) reponse2=0;
1546     if (eta<eps) reponse2=0;
1547     if (dseta<eps) reponse2=0;
1548     if (xsi+eta+dseta>1.-eps) reponse2=0;
1549     int face1=0,face2=0,face3=0,face4=0;
1550     if ((reponse1==1) && (reponse2==0))
1551     {
1552     if (dseta<eps) face1=1;
1553     if (eta<eps) face2=1;
1554     if (xsi<eps) face3=1;
1555     if (xsi+eta+dseta>1.-eps) face4=1;
1556     }
1557     return reponse1+2*reponse2+4*face1+8*face2+16*face3+32*face4;
1558     }
1559 francois 283
1560    
1561 francois 418
1562    
1563     int OPERATEUR::projeteestdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1564     {
1565     OT_VECTEUR_3D vec1(xyz1,xyz2);
1566     OT_VECTEUR_3D vec2(xyz1,xyz3);
1567     OT_VECTEUR_3D n=vec1&vec2;
1568     n.norme();
1569     double d=-(n.get_x()*xyz1[0]+n.get_y()*xyz1[1]+n.get_z()*xyz1[2]);
1570     double t=-(n.get_x()*x+n.get_y()*y+n.get_z()*z+d);
1571     double xx=x+t*n.get_x();
1572     double yy=y+t*n.get_y();
1573     double zz=z+t*n.get_z();
1574     return estdansletriangle(xyz1,xyz2,xyz3,xx,yy,zz);
1575     }
1576    
1577    
1578     int OPERATEUR::estdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1579     {
1580     OT_VECTEUR_3D vec1(xyz1,xyz2);
1581     OT_VECTEUR_3D vec2(xyz1,xyz3);
1582     OT_VECTEUR_3D vecb(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1583     OT_MATRICE_3D m(vec1,vec2,vecb);
1584     double det=m.get_determinant();
1585     double eps=1e-10*((vec1&vec2)*(vec1&vec2));
1586     if (fabs(det)>eps) return 0;
1587     double ab[3]={vec1.get_x(),vec1.get_y(),vec1.get_z()};
1588     double ac[3]={vec2.get_x(),vec2.get_y(),vec2.get_z()};
1589     double b[3]={vecb.get_x(),vecb.get_y(),vecb.get_z()};
1590     det=ab[0]*ac[1]-ab[1]*ac[0];
1591     int n1,n2;
1592     if (fabs(det)>eps)
1593     {
1594     n1=0;
1595     n2=1;
1596     }
1597     else
1598     {
1599     det=ab[0]*ac[2]-ab[2]*ac[0];
1600     if (fabs(det)>eps)
1601     {
1602     n1=0;
1603     n2=2;
1604     }
1605     else
1606     {
1607     det=ab[1]*ac[2]-ab[2]*ac[1];
1608     n1=1;
1609     n2=2;
1610     }
1611     }
1612     double xsi=(b[n1]*ac[n2]-b[n2]*ac[n1])/det;
1613     double eta=(ab[n1]*b[n2]-ab[n2]*b[n1])/det;
1614     int reponse1=1;
1615     int reponse2=1;
1616     eps=0.0000001;
1617     if (xsi<-eps) reponse1=0;
1618     if (eta<-eps) reponse1=0;
1619     if (xsi+eta>1.+eps) reponse1=0;
1620     if (xsi<eps) reponse2=0;
1621     if (eta<eps) reponse2=0;
1622     if (xsi+eta>1.-eps) reponse2=0;
1623     int arete1=0,arete2=0,arete3=0;
1624     if ((reponse1==1) && (reponse2==0))
1625     {
1626     if (eta<eps) arete1=1;
1627     if (xsi<eps) arete3=1;
1628     if (xsi+eta>1.-eps) arete2=1;
1629     }
1630     return reponse1+2*reponse2+4*arete1+8*arete2+16*arete3;
1631     }
1632    
1633    
1634    
1635    
1636     int OPERATEUR::compare_etat_tetra(int etat,int valeur)
1637     {
1638     int faceinte=etat&1;
1639     int inte=(etat&2)>>1;
1640     int face1=(etat&4)>>2;
1641     int face2=(etat&8)>>3;
1642     int face3=(etat&16)>>4;
1643     int face4=(etat&32)>>5;
1644     if ((faceinte==1) && (valeur==INTERIEUR)) return 1;
1645     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1646     if (/*(face==0) && */(inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1647     if ((faceinte==1) && (inte==0) && (valeur==SUR_FACE)) return 1;
1648     if ((face1==1) && (valeur==FACE1)) return 1;
1649     if ((face2==1) && (valeur==FACE2)) return 1;
1650     if ((face3==1) && (valeur==FACE3)) return 1;
1651     if ((face4==1) && (valeur==FACE4)) return 1;
1652     if ((face1==1) && (face2==1) && (valeur==ARETE1)) return 1;
1653     if ((face1==1) && (face3==1) && (valeur==ARETE2)) return 1;
1654     if ((face2==1) && (face3==1) && (valeur==ARETE3)) return 1;
1655     if ((face1==1) && (face4==1) && (valeur==ARETE4)) return 1;
1656     if ((face2==1) && (face4==1) && (valeur==ARETE5)) return 1;
1657     if ((face3==1) && (face4==1) && (valeur==ARETE6)) return 1;
1658     if ((face1==1) && (face2==1) && (face3==1) && (valeur==SOMMET1)) return 1;
1659     if ((face1==1) && (face2==1) && (face4==1) && (valeur==SOMMET2)) return 1;
1660     if ((face1==1) && (face3==1) && (face4==1) && (valeur==SOMMET3)) return 1;
1661     if ((face2==1) && (face3==1) && (face4==1) && (valeur==SOMMET4)) return 1;
1662     return 0;
1663     }
1664    
1665     int OPERATEUR::compare_etat_triangle(int etat,int valeur)
1666     {
1667     int areteinte=etat&1;
1668     int inte=(etat&2)>>1;
1669     int arete1=(etat&4)>>2;
1670     int arete2=(etat&8)>>3;
1671     int arete3=(etat&16)>>4;
1672     if ((areteinte==1) && (valeur==INTERIEUR)) return 1;
1673     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1674     if ((inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1675     if ((areteinte==1) && (inte==0) && (valeur==SUR_ARETE)) return 1;
1676     if ((arete1==1) && (valeur==ARETE1)) return 1;
1677     if ((arete2==1) && (valeur==ARETE2)) return 1;
1678     if ((arete3==1) && (valeur==ARETE3)) return 1;
1679     if ((arete1==1) && (arete2==1) && (valeur==SOMMET2)) return 1;
1680     if ((arete2==1) && (arete3==1) && (valeur==SOMMET3)) return 1;
1681     if ((arete3==1) && (arete1==1) && (valeur==SOMMET1)) return 1;
1682     return 0;
1683     }
1684    
1685    
1686 francois 283 template <int N> DOUBLEN<N>::DOUBLEN()
1687     {
1688     tab[0]=-1;
1689     }
1690    
1691     template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
1692     {
1693     for (int i=0;i<N;i++)
1694     tab[i]=mdd.tab[i];
1695     }
1696    
1697     template <int N> DOUBLEN<N>::DOUBLEN(double *v)
1698     {
1699     for (int i=0;i<N;i++)
1700     tab[i]=v[i];
1701     }
1702    
1703     template <int N> DOUBLEN<N>::~DOUBLEN()
1704     {
1705     }
1706    
1707     template <int N> double DOUBLEN<N>::get_valeur(int num)
1708     {
1709     return tab[num];
1710     }
1711    
1712     template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
1713     {
1714     tab[num]=val;
1715     }
1716    
1717     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
1718     {
1719     for (int i=0;i<N;i++)
1720     tab[i]=mdd.tab[i];
1721     return *this;
1722     }
1723    
1724     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
1725     {
1726     for (int i=0;i<N;i++)
1727     tab[i]=mdd.tab[i];
1728     return *this;
1729     }
1730    
1731    
1732     #ifdef BORLANDCPP
1733     // instanciation pour Windows (Borland c++)
1734     template class __export DOUBLEN<1>;
1735     template class __export DOUBLEN<4>;
1736     template class __export DOUBLEN<10>;
1737     #else
1738     #ifdef GCC
1739     // instanciation pour Unix (g++)
1740     template class DOUBLEN<1>;
1741     template class DOUBLEN<4>;
1742     template class DOUBLEN<10>;
1743     #else
1744     // instanciation pour Windows (Visual Studio)
1745     #endif
1746     #endif
1747    
1748