ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/addin/outil/src/ot_mathematique.cpp
Revision: 1075
Committed: Tue Aug 10 17:02:54 2021 UTC (4 years ago) by francois
File size: 44646 byte(s)
Log Message:
suppression de warning avec le dernier compilateur

File Contents

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