ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/outil/src/ot_mathematique.cpp
Revision: 1156
Committed: Thu Jun 13 22:02:48 2024 UTC (14 months, 2 weeks ago) by francois
File size: 45092 byte(s)
Log Message:
compatibilité Ubuntu 22.04
Suppression des refeences à Windows
Ajout d'une banière

File Contents

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