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

File Contents

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