ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 951
Committed: Fri Aug 10 15:17:17 2018 UTC (6 years, 9 months ago) by couturad
File size: 43125 byte(s)
Log Message:
-> Ajout de Project Chrono (voir CMakeLists.txt).
-> Ajout d'un générateur de microstructure basé sur la dynamique des corps rigides (MSTRUCT_GENERATEUR_DCR).
-> Ajout d'un opérateur de décallage de la topologie (MG_CG_OP_TRANSF_DECALLAGE).
-> Retrait de «using namespace std»  (conflit avec namespace chrono) et modification des fichiers affectés.
-> Modification de mailleur2d.cpp afin d'enregistrer un fichier MAGiC (void.magic) lorsque le nombre d'itération dépasse la valeur maximale.

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