ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/outil/src/ot_mathematique.cpp
Revision: 1111
Committed: Tue Apr 4 13:48:28 2023 UTC (2 years, 4 months ago) by francois
File size: 45289 byte(s)
Log Message:
mailleur STL avec surface ouverte + liste de noeud contraint 

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