ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 966
Committed: Thu Sep 6 16:46:34 2018 UTC (6 years, 8 months ago) by couturad
File size: 43374 byte(s)
Log Message:
Ajout de l'histogramme a MAGIC_PLOT
Ajout d'une sortie OK ou FAIL (int) au MAILLEUR afin de gerer certaines exceptions
Ajout d'une phase RSA a la fin du generateur DCR

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