ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/outil/src/ot_mathematique.cpp
Revision: 1025
Committed: Thu Jun 20 20:14:36 2019 UTC (6 years ago) by francois
File size: 44614 byte(s)
Log Message:
Prise en compte et correction du fait qu'opencascade en trouve pas forcement toutes les surfaces fermees

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