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