ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/outil/src/ot_mathematique.cpp
Revision: 1019
Committed: Tue Jun 4 21:16:50 2019 UTC (6 years ago) by francois
File size: 44131 byte(s)
Log Message:
restructuration de magic
outil est sorti de lib pour pouvoir etre utiliser en dehors de lib
template est merge avec outil
poly_occ et un sous projet de magic qui utilise le nouveau outil

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     OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
898     {
899     for (int i=0; i<4; i++)
900     valeur[i]=v[i];
901     }
902    
903    
904     double & OT_VECTEUR_4D::operator()(int i)
905     {
906     return valeur[i];
907     }
908    
909     double OT_VECTEUR_4D::operator()(int i) const
910     {
911     return valeur[i];
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     OT_VECTEUR_4D::operator const double* () const
925     {
926     return valeur;
927     }
928    
929     OT_VECTEUR_4D::operator double* ()
930     {
931     return valeur;
932     }
933    
934     double OT_VECTEUR_4D::get_x(void) const
935     {
936     return valeur[0];
937     }
938     double & OT_VECTEUR_4D::x(void)
939     {
940     return valeur[0];
941     }
942     double OT_VECTEUR_4D::get_y(void) const
943     {
944     return valeur[1];
945     }
946     double & OT_VECTEUR_4D::y(void)
947     {
948     return valeur[1];
949     }
950     double OT_VECTEUR_4D::get_z(void) const
951     {
952     return valeur[2];
953     }
954     double & OT_VECTEUR_4D::z(void)
955     {
956     return valeur[2];
957     }
958     double OT_VECTEUR_4D::get_w(void) const
959     {
960     return valeur[3];
961     }
962     double & OT_VECTEUR_4D::w(void)
963     {
964     return valeur[3];
965     }
966     void OT_VECTEUR_4D::change_x(double x)
967     {
968     valeur[0] = x;
969     }
970     void OT_VECTEUR_4D::change_y(double y)
971     {
972     valeur[1] = y;
973     }
974     void OT_VECTEUR_4D::change_z(double z)
975     {
976     valeur[2] = z;
977     }
978     void OT_VECTEUR_4D::change_w(double w)
979     {
980     valeur[3] = w;
981     }
982     double* OT_VECTEUR_4D::get_xyzw(void)
983     {
984     return valeur;
985     }
986    
987     OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
988     {
989     return OT_VECTEUR_4D(
990     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
991     );
992     }
993    
994     OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
995     {
996     return OT_VECTEUR_4D(
997     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
998     );
999     }
1000    
1001     OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
1002     {
1003     return OT_VECTEUR_4D(
1004     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1005     );
1006     }
1007     OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
1008     {
1009     return OT_VECTEUR_4D(
1010     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1011     );
1012     }
1013    
1014     OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
1015     {
1016     double inv = 1/a;
1017     return OT_VECTEUR_4D(
1018     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1019     );
1020     }
1021    
1022    
1023     OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
1024     {
1025     double inv = 1/a;
1026     return OT_VECTEUR_4D(
1027     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1028     );
1029     }
1030    
1031     double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
1032     {
1033     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
1034     }
1035    
1036    
1037     OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
1038     {
1039     valeur[0] += rkV.valeur[0];
1040     valeur[1] += rkV.valeur[1];
1041     valeur[2] += rkV.valeur[2];
1042     valeur[3] += rkV.valeur[3];
1043     return *this;
1044     }
1045    
1046     OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
1047     {
1048     valeur[0] -= rkV.valeur[0];
1049     valeur[1] -= rkV.valeur[1];
1050     valeur[2] -= rkV.valeur[2];
1051     valeur[3] -= rkV.valeur[3];
1052     return *this;
1053     }
1054     OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
1055     {
1056     valeur[0] *= fScalar;
1057     valeur[1] *= fScalar;
1058     valeur[2] *= fScalar;
1059     valeur[3] *= fScalar;
1060     return *this;
1061     }
1062     OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
1063     {
1064     double a = 1/fScalar;
1065     valeur[0] *= a;
1066     valeur[1] *= a;
1067     valeur[2] *= a;
1068     valeur[3] *= a;
1069     return *this;
1070     }
1071     OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
1072     {
1073     valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
1074     return *this;
1075     }
1076    
1077     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
1078     {
1079     __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
1080     return __os;
1081     }
1082     #endif // ot_vecteur_4d
1083    
1084    
1085    
1086     // ot_vecteur_3d
1087    
1088    
1089    
1090     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 v[3])
1091     {
1092     for (int i=0; i<3; i++)
1093     valeur[i]=v[i];
1094     }
1095    
1096     OT_VECTEUR_3DD::OT_VECTEUR_3DD (double2 x, double2 y, double2 z)
1097     {
1098     valeur[0] = x;
1099     valeur[1] = y;
1100     valeur[2] = z;
1101     }
1102    
1103 francois 550 OT_VECTEUR_3DD::OT_VECTEUR_3DD(double2 *xyz1,double2 *xyz2)
1104     {
1105     valeur[0]=xyz2[0]-xyz1[0];
1106     valeur[1]=xyz2[1]-xyz1[1];
1107     valeur[2]=xyz2[2]-xyz1[2];
1108     }
1109    
1110 francois 283 OT_VECTEUR_3DD::OT_VECTEUR_3DD (const OT_VECTEUR_3DD & v)
1111     {
1112     for (int i=0; i<3; i++)
1113     valeur[i]=v[i];
1114     }
1115    
1116    
1117     double2 & OT_VECTEUR_3DD::operator()(int i)
1118     {
1119     return valeur[i];
1120     }
1121    
1122     double2 OT_VECTEUR_3DD::operator()(int i) const
1123     {
1124     return valeur[i];
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     OT_VECTEUR_3DD::operator const double2* () const
1138     {
1139     return valeur;
1140     }
1141    
1142     OT_VECTEUR_3DD::operator double2* ()
1143     {
1144     return valeur;
1145     }
1146    
1147     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator =(const OT_VECTEUR_3DD& v3d)
1148     {
1149     if (this==&v3d) return *this;
1150     valeur [0]=v3d.get_x();
1151     valeur [1]=v3d.get_y();
1152     valeur [2]=v3d.get_z();
1153     return *this;
1154     }
1155     double2 OT_VECTEUR_3DD::norme()
1156     {
1157     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1158     nor=sqrt(nor);
1159     return nor;
1160     }
1161     OT_VECTEUR_3DD OT_VECTEUR_3DD::vecteur_norme()
1162     {
1163     OT_VECTEUR_3DD nor;
1164     double2 zero=0.;
1165     double2 norme= this->norme() ;
1166     nor=(*this)*(1./norme);
1167     return nor;
1168     }
1169 francois 550 double2 OT_VECTEUR_3DD::get_longueur(void)
1170     {
1171     return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1172     }
1173 francois 283
1174 francois 550 double2 OT_VECTEUR_3DD::get_longueur2(void)
1175     {
1176     return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
1177     }
1178    
1179 francois 283 double2 OT_VECTEUR_3DD::get_x(void) const
1180     {
1181     return valeur[0];
1182     }
1183     double2 & OT_VECTEUR_3DD::x(void)
1184     {
1185     return valeur[0];
1186     }
1187     double2 OT_VECTEUR_3DD::get_y(void) const
1188     {
1189     return valeur[1];
1190     }
1191     double2 & OT_VECTEUR_3DD::y(void)
1192     {
1193     return valeur[1];
1194     }
1195     double2 OT_VECTEUR_3DD::get_z(void) const
1196     {
1197     return valeur[2];
1198     }
1199     double2 & OT_VECTEUR_3DD::z(void)
1200     {
1201     return valeur[2];
1202     }
1203     void OT_VECTEUR_3DD::change_x(double2 x)
1204     {
1205     valeur[0] = x;
1206     }
1207     void OT_VECTEUR_3DD::change_y(double2 y)
1208     {
1209     valeur[1] = y;
1210     }
1211     void OT_VECTEUR_3DD::change_z(double2 z)
1212     {
1213     valeur[2] = z;
1214     }
1215     double2* OT_VECTEUR_3DD::get_xyz(void)
1216     {
1217     return valeur;
1218     }
1219    
1220     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator+ (const OT_VECTEUR_3DD & a)
1221     {
1222     return OT_VECTEUR_3DD(
1223     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2]);
1224     }
1225    
1226     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator- (const OT_VECTEUR_3DD & a)
1227     {
1228     return OT_VECTEUR_3DD(
1229     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2));
1230     }
1231    
1232     OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a)
1233     {
1234     return OT_VECTEUR_3DD(
1235     a*rkV[0],a*rkV[1],a*rkV[2]);
1236     }
1237     OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV)
1238     {
1239     return OT_VECTEUR_3DD(
1240     a*rkV[0],a*rkV[1],a*rkV[2]);
1241     }
1242    
1243     OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a)
1244     {
1245     double2 inv = 1/a;
1246     return OT_VECTEUR_3DD(
1247     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1248     }
1249    
1250    
1251     OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV)
1252     {
1253     double2 inv = 1/a;
1254     return OT_VECTEUR_3DD(
1255     inv*rkV[0],inv*rkV[1],inv*rkV[2]);
1256     }
1257     OT_VECTEUR_3DD OT_VECTEUR_3DD::operator&(const OT_VECTEUR_3DD& v2)
1258     {
1259     OT_VECTEUR_3DD tmp;
1260     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1261     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1262     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1263     return tmp;
1264     }
1265     double2 OT_VECTEUR_3DD::operator* (const OT_VECTEUR_3DD & a)
1266     {
1267     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2];
1268     }
1269    
1270    
1271     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator+= (const OT_VECTEUR_3DD& rkV)
1272     {
1273     valeur[0] = valeur[0] +rkV.valeur[0];
1274     valeur[1] = valeur[1] +rkV.valeur[1];
1275     valeur[2] = valeur[2] +rkV.valeur[2];
1276     return *this;
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     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator*= (double2 fScalar)
1287     {
1288     valeur[0] =valeur[0] * fScalar;
1289     valeur[1] =valeur[1] * fScalar;
1290     valeur[2] =valeur[2] * fScalar;
1291     return *this;
1292     }
1293     OT_VECTEUR_3DD& OT_VECTEUR_3DD::operator/= (double2 fScalar)
1294     {
1295     double2 a = 1/fScalar;
1296     valeur[0] =valeur[0] * a;
1297     valeur[1] =valeur[1] * a;
1298     valeur[2] =valeur[2] * a;
1299     return *this;
1300     }
1301    
1302    
1303     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec)
1304     {
1305 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)<<"] ";
1306 francois 283 return __os;
1307     }
1308    
1309     int OT_VECTEUR_3DD::compare_valeur (const OT_VECTEUR_3DD& mdd) const
1310     {
1311     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2])
1312     return 1;
1313     else return 0;
1314    
1315     }
1316    
1317     bool OT_VECTEUR_3DD::operator==(const OT_VECTEUR_3DD& mdd) const
1318     {
1319     return compare_valeur(mdd);
1320     }
1321    
1322    
1323    
1324    
1325    
1326    
1327    
1328    
1329    
1330    
1331     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 v[4])
1332     {
1333     for (int i=0; i<4; i++)
1334     valeur[i]=v[i];
1335     }
1336    
1337     OT_VECTEUR_4DD::OT_VECTEUR_4DD (double2 x, double2 y, double2 z, double2 w)
1338     {
1339     valeur[0] = x;
1340     valeur[1] = y;
1341     valeur[2] = z;
1342     valeur[3] = w;
1343     }
1344    
1345     OT_VECTEUR_4DD::OT_VECTEUR_4DD (const OT_VECTEUR_4DD & v)
1346     {
1347     for (int i=0; i<4; i++)
1348     valeur[i]=v[i];
1349     }
1350    
1351    
1352     double2 & OT_VECTEUR_4DD::operator()(int i)
1353     {
1354     return valeur[i];
1355     }
1356    
1357     double2 OT_VECTEUR_4DD::operator()(int i) const
1358     {
1359     return valeur[i];
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     OT_VECTEUR_4DD::operator const double2* () const
1373     {
1374     return valeur;
1375     }
1376    
1377     OT_VECTEUR_4DD::operator double2* ()
1378     {
1379     return valeur;
1380     }
1381    
1382     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator =(const OT_VECTEUR_4DD& v4d)
1383     {
1384     if (this==&v4d) return *this;
1385     valeur [0]=v4d.get_x();
1386     valeur [1]=v4d.get_y();
1387     valeur [2]=v4d.get_z();
1388     valeur [3]=v4d.get_w();
1389     return *this;
1390     }
1391     double2 OT_VECTEUR_4DD::norme()
1392     {
1393     double2 nor= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2]+valeur [3]*valeur [3];
1394     nor=nor^0.5;
1395     return nor;
1396     }
1397     OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme()
1398     {
1399     OT_VECTEUR_4DD nor;
1400     double2 zero=0.;
1401     double2 norme= this->norme() ;
1402     assert(norme!=zero) ;
1403     nor=(*this)*(1./norme);
1404     return nor;
1405     }
1406    
1407 francois 363 OT_VECTEUR_4DD OT_VECTEUR_4DD::vecteur_norme_3d()
1408     {
1409     double2 norme= valeur [0]*valeur [0]+valeur [1]*valeur [1]+valeur [2]*valeur [2];
1410     norme=norme^0.5;
1411     OT_VECTEUR_4DD nor;
1412     double2 zero=0.;
1413     assert(norme!=zero) ;
1414     nor.change_x(valeur[0]/norme);
1415     nor.change_y(valeur[1]/norme);
1416     nor.change_z(valeur[2]/norme);
1417     nor.change_w(valeur[3]);
1418     return nor;
1419     }
1420 francois 283 double2 OT_VECTEUR_4DD::get_x(void) const
1421     {
1422     return valeur[0];
1423     }
1424     double2 & OT_VECTEUR_4DD::x(void)
1425     {
1426     return valeur[0];
1427     }
1428     double2 OT_VECTEUR_4DD::get_y(void) const
1429     {
1430     return valeur[1];
1431     }
1432     double2 & OT_VECTEUR_4DD::y(void)
1433     {
1434     return valeur[1];
1435     }
1436     double2 OT_VECTEUR_4DD::get_z(void) const
1437     {
1438     return valeur[2];
1439     }
1440     double2 & OT_VECTEUR_4DD::z(void)
1441     {
1442     return valeur[2];
1443     }
1444     double2 OT_VECTEUR_4DD::get_w(void) const
1445     {
1446     return valeur[3];
1447     }
1448     double2 & OT_VECTEUR_4DD::w(void)
1449     {
1450     return valeur[3];
1451     }
1452     void OT_VECTEUR_4DD::change_x(double2 x)
1453     {
1454     valeur[0] = x;
1455     }
1456     void OT_VECTEUR_4DD::change_y(double2 y)
1457     {
1458     valeur[1] = y;
1459     }
1460     void OT_VECTEUR_4DD::change_z(double2 z)
1461     {
1462     valeur[2] = z;
1463     }
1464     void OT_VECTEUR_4DD::change_w(double2 w)
1465     {
1466     valeur[3] = w;
1467     }
1468     double2* OT_VECTEUR_4DD::get_xyzw(void)
1469     {
1470     return valeur;
1471     }
1472    
1473     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator+ (const OT_VECTEUR_4DD & a)
1474     {
1475     return OT_VECTEUR_4DD(
1476     a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
1477     );
1478     }
1479    
1480     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator- (const OT_VECTEUR_4DD & a)
1481     {
1482     return OT_VECTEUR_4DD(
1483     valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
1484     );
1485     }
1486    
1487     OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a)
1488     {
1489     return OT_VECTEUR_4DD(
1490     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1491     );
1492     }
1493     OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV)
1494     {
1495     return OT_VECTEUR_4DD(
1496     a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
1497     );
1498     }
1499    
1500     OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a)
1501     {
1502     double2 inv = 1/a;
1503     return OT_VECTEUR_4DD(
1504     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1505     );
1506     }
1507    
1508    
1509     OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV)
1510     {
1511     double2 inv = 1/a;
1512     return OT_VECTEUR_4DD(
1513     inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
1514     );
1515     }
1516     OT_VECTEUR_4DD OT_VECTEUR_4DD::operator^(const OT_VECTEUR_4DD& v2)
1517     {
1518     OT_VECTEUR_4DD tmp;
1519     tmp[0]= valeur[1]*v2[2]-valeur[2]*v2[1];
1520     tmp[1]= valeur[2]*v2[0]-valeur[0]*v2[2];
1521     tmp[2]= valeur[0]*v2[1]-valeur[1]*v2[0];
1522     tmp[3]= 0;
1523     //tmp[3]= valeur[1]*v2[2]-valeur[2]*v2[1];
1524     return tmp;
1525     }
1526     double2 OT_VECTEUR_4DD::operator* (const OT_VECTEUR_4DD & a)
1527     {
1528     return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
1529     }
1530    
1531    
1532     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator+= (const OT_VECTEUR_4DD& rkV)
1533     {
1534     valeur[0] = valeur[0] +rkV.valeur[0];
1535     valeur[1] = valeur[1] +rkV.valeur[1];
1536     valeur[2] = valeur[2] +rkV.valeur[2];
1537     valeur[3] = valeur[3] +rkV.valeur[3];
1538     return *this;
1539     }
1540    
1541     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator-= (const OT_VECTEUR_4DD& rkV)
1542     {
1543     valeur[0] = valeur[0] -rkV.valeur[0];
1544     valeur[1] = valeur[1] -rkV.valeur[1];
1545     valeur[2] = valeur[2] -rkV.valeur[2];
1546     valeur[3] = valeur[3] -rkV.valeur[3];
1547     return *this;
1548     }
1549     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator*= (double2 fScalar)
1550     {
1551     valeur[0] =valeur[0] * fScalar;
1552     valeur[1] =valeur[1] * fScalar;
1553     valeur[2] =valeur[2] * fScalar;
1554     valeur[3] =valeur[3] * fScalar;
1555     return *this;
1556     }
1557     OT_VECTEUR_4DD& OT_VECTEUR_4DD::operator/= (double2 fScalar)
1558     {
1559     double2 a = 1/fScalar;
1560     valeur[0] =valeur[0] * a;
1561     valeur[1] =valeur[1] * a;
1562     valeur[2] =valeur[2] * a;
1563     valeur[3] =valeur[3] * a;
1564     return *this;
1565     }
1566    
1567    
1568     std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec)
1569     {
1570 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)<<"] ";
1571 francois 283 return __os;
1572     }
1573    
1574     int OT_VECTEUR_4DD::compare_valeur (const OT_VECTEUR_4DD& mdd) const
1575     {
1576     if (valeur[0]==mdd.valeur[0]&&valeur[1]==mdd.valeur[1] &&valeur[2]==mdd.valeur[2]&&valeur[3]==mdd.valeur[3])
1577     return 1;
1578     else return 0;
1579    
1580     }
1581    
1582     bool OT_VECTEUR_4DD::operator==(const OT_VECTEUR_4DD& mdd) const
1583     {
1584     return compare_valeur(mdd);
1585     }
1586    
1587    
1588    
1589 francois 743 bool OT_VECTEUR_4DD::est_nul(void)
1590     {
1591     double2 ZERO(0.);
1592     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO&&valeur[3]==ZERO)
1593     return true;
1594     return false;
1595     }
1596 francois 283
1597 francois 743 bool OT_VECTEUR_4DD::est_nul_3d(void)
1598     {
1599     double2 ZERO(0.);
1600     if (valeur[0]==ZERO&&valeur[1]==ZERO &&valeur[2]==ZERO)
1601     return true;
1602     return false;
1603     }
1604 francois 283
1605    
1606    
1607    
1608    
1609    
1610    
1611    
1612    
1613    
1614    
1615 francois 743
1616 francois 283 int OPERATEUR::egal(double a,double b,double eps)
1617     {
1618     double res=fabs(a-b);
1619     if (res<eps) return(1);
1620     return(0);
1621     }
1622    
1623 couturad 906 int OPERATEUR::egal(double* xyz1, double* xyz2, double eps)
1624     {
1625     if(fabs(xyz1[0]-xyz2[0])<eps)
1626     if(fabs(xyz1[1]-xyz2[1])<eps)
1627     if(fabs(xyz1[2]-xyz2[2])<eps)
1628     return 1;
1629     return 0;
1630     }
1631 francois 283
1632 couturad 906
1633    
1634 francois 283 double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
1635     {
1636     OT_VECTEUR_3D vec12(noeud1,noeud2);
1637     OT_VECTEUR_3D vec13(noeud1,noeud3);
1638     OT_VECTEUR_3D vec23(noeud2,noeud3);
1639     double d12=vec12.get_longueur();
1640     double d13=vec13.get_longueur();
1641     double d23=vec23.get_longueur();
1642 couturad 951 double dmax=std::max(d12,d13);
1643     dmax=std::max(dmax,d23);
1644 francois 283 double p=0.5*(d12+d13+d23);
1645     double crit=(p-d12)*(p-d13)*(p-d23)/p;
1646     if (crit<0) crit=0.;
1647     crit=sqrt(crit);
1648     crit=crit/dmax;
1649     crit=crit*3.4641101614;
1650     return crit;
1651     }
1652    
1653     void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
1654     {
1655     int *p=(int*)(&(val));
1656     val1=(*p);
1657     val2=(*(p+1));
1658     }
1659    
1660     double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
1661     {
1662     OT_VECTEUR_3D ab(noeud1,noeud2);
1663     OT_VECTEUR_3D ac(noeud1,noeud3);
1664     OT_VECTEUR_3D cb(noeud3,noeud2);
1665     OT_VECTEUR_3D db(noeud4,noeud2);
1666     OT_VECTEUR_3D da(noeud4,noeud1);
1667     OT_VECTEUR_3D dc(noeud4,noeud3);
1668     double dab=ab.get_longueur();
1669     double dac=ac.get_longueur();
1670     double dcb=cb.get_longueur();
1671     double ddb=db.get_longueur();
1672     double dda=da.get_longueur();
1673     double ddc=dc.get_longueur();
1674    
1675 couturad 951 double dmax=std::max(dab,dac);
1676     dmax=std::max(dmax,dcb);
1677     dmax=std::max(dmax,ddb);
1678     dmax=std::max(dmax,dda);
1679     dmax=std::max(dmax,ddc);
1680 francois 283
1681     OT_VECTEUR_3D pvec=ab&ac;
1682     double vol=pvec*da;
1683     if (vol>0.) return 0.;
1684     vol=fabs(vol);
1685     double som=pvec.get_longueur()/2.;
1686     pvec=ab&da;
1687     som=som+pvec.get_longueur()/2.;
1688     pvec=ac&dc;
1689     som=som+pvec.get_longueur()/2.;
1690     pvec=cb&db;
1691     som=som+pvec.get_longueur()/2.;
1692     double crit=vol/som/dmax/0.408249;
1693     return crit;
1694     }
1695    
1696 francois 418 int OPERATEUR::estdansletetra(double *xyz1,double *xyz2,double *xyz3,double *xyz4,double x,double y, double z)
1697     {
1698     OT_VECTEUR_3D v1(xyz2[0]-xyz1[0],xyz2[1]-xyz1[1],xyz2[2]-xyz1[2]);
1699     OT_VECTEUR_3D v2(xyz3[0]-xyz1[0],xyz3[1]-xyz1[1],xyz3[2]-xyz1[2]);
1700     OT_VECTEUR_3D v3(xyz4[0]-xyz1[0],xyz4[1]-xyz1[1],xyz4[2]-xyz1[2]);
1701     OT_VECTEUR_3D v4(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1702     OT_MATRICE_3D mat(v1,v2,v3);
1703     OT_MATRICE_3D mat1(v4,v2,v3);
1704     OT_MATRICE_3D mat2(v1,v4,v3);
1705     OT_MATRICE_3D mat3(v1,v2,v4);
1706     double det=mat.get_determinant();
1707     double xsi=mat1.get_determinant()/det;
1708     double eta=mat2.get_determinant()/det;
1709     double dseta=mat3.get_determinant()/det;
1710     int reponse1=1;
1711     int reponse2=1;
1712     double eps=0.0000001;
1713     if (xsi<-eps) reponse1=0;
1714     if (eta<-eps) reponse1=0;
1715     if (dseta<-eps) reponse1=0;
1716     if (xsi+eta+dseta>1.+eps) reponse1=0;
1717     if (xsi<eps) reponse2=0;
1718     if (eta<eps) reponse2=0;
1719     if (dseta<eps) reponse2=0;
1720     if (xsi+eta+dseta>1.-eps) reponse2=0;
1721     int face1=0,face2=0,face3=0,face4=0;
1722     if ((reponse1==1) && (reponse2==0))
1723     {
1724     if (dseta<eps) face1=1;
1725     if (eta<eps) face2=1;
1726     if (xsi<eps) face3=1;
1727     if (xsi+eta+dseta>1.-eps) face4=1;
1728     }
1729     return reponse1+2*reponse2+4*face1+8*face2+16*face3+32*face4;
1730     }
1731 francois 283
1732    
1733 francois 418
1734    
1735     int OPERATEUR::projeteestdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1736     {
1737     OT_VECTEUR_3D vec1(xyz1,xyz2);
1738     OT_VECTEUR_3D vec2(xyz1,xyz3);
1739     OT_VECTEUR_3D n=vec1&vec2;
1740     n.norme();
1741     double d=-(n.get_x()*xyz1[0]+n.get_y()*xyz1[1]+n.get_z()*xyz1[2]);
1742     double t=-(n.get_x()*x+n.get_y()*y+n.get_z()*z+d);
1743     double xx=x+t*n.get_x();
1744     double yy=y+t*n.get_y();
1745     double zz=z+t*n.get_z();
1746     return estdansletriangle(xyz1,xyz2,xyz3,xx,yy,zz);
1747     }
1748    
1749    
1750     int OPERATEUR::estdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z)
1751     {
1752     OT_VECTEUR_3D vec1(xyz1,xyz2);
1753     OT_VECTEUR_3D vec2(xyz1,xyz3);
1754     OT_VECTEUR_3D vecb(x-xyz1[0],y-xyz1[1],z-xyz1[2]);
1755     OT_MATRICE_3D m(vec1,vec2,vecb);
1756     double det=m.get_determinant();
1757     double eps=1e-10*((vec1&vec2)*(vec1&vec2));
1758     if (fabs(det)>eps) return 0;
1759     double ab[3]={vec1.get_x(),vec1.get_y(),vec1.get_z()};
1760     double ac[3]={vec2.get_x(),vec2.get_y(),vec2.get_z()};
1761     double b[3]={vecb.get_x(),vecb.get_y(),vecb.get_z()};
1762     det=ab[0]*ac[1]-ab[1]*ac[0];
1763     int n1,n2;
1764     if (fabs(det)>eps)
1765     {
1766     n1=0;
1767     n2=1;
1768     }
1769     else
1770     {
1771     det=ab[0]*ac[2]-ab[2]*ac[0];
1772     if (fabs(det)>eps)
1773     {
1774     n1=0;
1775     n2=2;
1776     }
1777     else
1778     {
1779     det=ab[1]*ac[2]-ab[2]*ac[1];
1780     n1=1;
1781     n2=2;
1782     }
1783     }
1784     double xsi=(b[n1]*ac[n2]-b[n2]*ac[n1])/det;
1785     double eta=(ab[n1]*b[n2]-ab[n2]*b[n1])/det;
1786     int reponse1=1;
1787     int reponse2=1;
1788     eps=0.0000001;
1789     if (xsi<-eps) reponse1=0;
1790     if (eta<-eps) reponse1=0;
1791     if (xsi+eta>1.+eps) reponse1=0;
1792     if (xsi<eps) reponse2=0;
1793     if (eta<eps) reponse2=0;
1794     if (xsi+eta>1.-eps) reponse2=0;
1795     int arete1=0,arete2=0,arete3=0;
1796     if ((reponse1==1) && (reponse2==0))
1797     {
1798     if (eta<eps) arete1=1;
1799     if (xsi<eps) arete3=1;
1800     if (xsi+eta>1.-eps) arete2=1;
1801     }
1802     return reponse1+2*reponse2+4*arete1+8*arete2+16*arete3;
1803     }
1804    
1805    
1806    
1807    
1808     int OPERATEUR::compare_etat_tetra(int etat,int valeur)
1809     {
1810     int faceinte=etat&1;
1811     int inte=(etat&2)>>1;
1812     int face1=(etat&4)>>2;
1813     int face2=(etat&8)>>3;
1814     int face3=(etat&16)>>4;
1815     int face4=(etat&32)>>5;
1816     if ((faceinte==1) && (valeur==INTERIEUR)) return 1;
1817     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1818     if (/*(face==0) && */(inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1819     if ((faceinte==1) && (inte==0) && (valeur==SUR_FACE)) return 1;
1820     if ((face1==1) && (valeur==FACE1)) return 1;
1821     if ((face2==1) && (valeur==FACE2)) return 1;
1822     if ((face3==1) && (valeur==FACE3)) return 1;
1823     if ((face4==1) && (valeur==FACE4)) return 1;
1824     if ((face1==1) && (face2==1) && (valeur==ARETE1)) return 1;
1825     if ((face1==1) && (face3==1) && (valeur==ARETE2)) return 1;
1826     if ((face2==1) && (face3==1) && (valeur==ARETE3)) return 1;
1827     if ((face1==1) && (face4==1) && (valeur==ARETE4)) return 1;
1828     if ((face2==1) && (face4==1) && (valeur==ARETE5)) return 1;
1829     if ((face3==1) && (face4==1) && (valeur==ARETE6)) return 1;
1830     if ((face1==1) && (face2==1) && (face3==1) && (valeur==SOMMET1)) return 1;
1831     if ((face1==1) && (face2==1) && (face4==1) && (valeur==SOMMET2)) return 1;
1832     if ((face1==1) && (face3==1) && (face4==1) && (valeur==SOMMET3)) return 1;
1833     if ((face2==1) && (face3==1) && (face4==1) && (valeur==SOMMET4)) return 1;
1834     return 0;
1835     }
1836    
1837     int OPERATEUR::compare_etat_triangle(int etat,int valeur)
1838     {
1839     int areteinte=etat&1;
1840     int inte=(etat&2)>>1;
1841     int arete1=(etat&4)>>2;
1842     int arete2=(etat&8)>>3;
1843     int arete3=(etat&16)>>4;
1844     if ((areteinte==1) && (valeur==INTERIEUR)) return 1;
1845     if ((inte==1) && (valeur==INTERIEUR)) return 1;
1846     if ((inte==1) && (valeur==STRICTINTERIEUR)) return 1;
1847     if ((areteinte==1) && (inte==0) && (valeur==SUR_ARETE)) return 1;
1848     if ((arete1==1) && (valeur==ARETE1)) return 1;
1849     if ((arete2==1) && (valeur==ARETE2)) return 1;
1850     if ((arete3==1) && (valeur==ARETE3)) return 1;
1851     if ((arete1==1) && (arete2==1) && (valeur==SOMMET2)) return 1;
1852     if ((arete2==1) && (arete3==1) && (valeur==SOMMET3)) return 1;
1853     if ((arete3==1) && (arete1==1) && (valeur==SOMMET1)) return 1;
1854     return 0;
1855     }
1856    
1857 couturad 926 double OPERATEUR::taille_tetra(double* noeud1, double* noeud2, double* noeud3, double* noeud4)
1858     {
1859     OT_VECTEUR_3D ab(noeud1,noeud2);
1860     OT_VECTEUR_3D ac(noeud1,noeud3);
1861     OT_VECTEUR_3D cb(noeud3,noeud2);
1862     OT_VECTEUR_3D db(noeud4,noeud2);
1863     OT_VECTEUR_3D da(noeud4,noeud1);
1864     OT_VECTEUR_3D dc(noeud4,noeud3);
1865     double dab=ab.get_longueur();
1866     double dac=ac.get_longueur();
1867     double dcb=cb.get_longueur();
1868     double ddb=db.get_longueur();
1869     double dda=da.get_longueur();
1870     double ddc=dc.get_longueur();
1871 couturad 951 double dmax=std::max(dab,dac);
1872     dmax=std::max(dmax,dcb);
1873     dmax=std::max(dmax,ddb);
1874     dmax=std::max(dmax,dda);
1875     dmax=std::max(dmax,ddc);
1876 couturad 926 return dmax;
1877     }
1878 francois 418
1879 couturad 926 double OPERATEUR::taille_triangle(double* noeud1, double* noeud2, double* noeud3)
1880     {
1881     OT_VECTEUR_3D vec12(noeud1,noeud2);
1882     OT_VECTEUR_3D vec13(noeud1,noeud3);
1883     OT_VECTEUR_3D vec23(noeud2,noeud3);
1884     double d12=vec12.get_longueur();
1885     double d13=vec13.get_longueur();
1886     double d23=vec23.get_longueur();
1887 couturad 951 double dmax=std::max(d12,d13);
1888     dmax=std::max(dmax,d23);
1889 couturad 926 return dmax;
1890     }
1891    
1892    
1893 francois 283 template <int N> DOUBLEN<N>::DOUBLEN()
1894     {
1895     tab[0]=-1;
1896     }
1897    
1898     template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
1899     {
1900     for (int i=0;i<N;i++)
1901     tab[i]=mdd.tab[i];
1902     }
1903    
1904     template <int N> DOUBLEN<N>::DOUBLEN(double *v)
1905     {
1906     for (int i=0;i<N;i++)
1907     tab[i]=v[i];
1908     }
1909    
1910     template <int N> DOUBLEN<N>::~DOUBLEN()
1911     {
1912     }
1913    
1914     template <int N> double DOUBLEN<N>::get_valeur(int num)
1915     {
1916     return tab[num];
1917     }
1918    
1919     template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
1920     {
1921     tab[num]=val;
1922     }
1923    
1924     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
1925     {
1926     for (int i=0;i<N;i++)
1927     tab[i]=mdd.tab[i];
1928     return *this;
1929     }
1930    
1931     template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
1932     {
1933     for (int i=0;i<N;i++)
1934     tab[i]=mdd.tab[i];
1935     return *this;
1936     }
1937    
1938    
1939 francois 1019
1940 francois 283 // instanciation pour Unix (g++)
1941     template class DOUBLEN<1>;
1942     template class DOUBLEN<4>;
1943     template class DOUBLEN<10>;
1944    
1945