ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.cpp
Revision: 58
Committed: Fri Sep 28 21:00:16 2007 UTC (17 years, 7 months ago) by souaissa
Original Path: magic/lib/outil/outil/src/ot_mathematique.cpp
File size: 22173 byte(s)
Error occurred while calculating annotation data.
Log Message:
vectorisation de geometrie pour comparaison

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 "gestionversion.h"
26
27 #include <math.h>
28 #include <algorithm>
29 #include "ot_mathematique.h"
30
31 using namespace std;
32
33
34 OT_VECTEUR_3D::OT_VECTEUR_3D(double x,double y,double z)
35 {
36 valeur[0]=x;
37 valeur[1]=y;
38 valeur[2]=z;
39 }
40
41
42 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz)
43 {
44 valeur[0]=xyz[0];
45 valeur[1]=xyz[1];
46 valeur[2]=xyz[2];
47 }
48
49 OT_VECTEUR_3D::OT_VECTEUR_3D(double *xyz1,double *xyz2)
50 {
51 valeur[0]=xyz2[0]-xyz1[0];
52 valeur[1]=xyz2[1]-xyz1[1];
53 valeur[2]=xyz2[2]-xyz1[2];
54 }
55
56 OT_VECTEUR_3D::OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd)
57 {
58 valeur[0]=mdd.valeur[0];
59 valeur[1]=mdd.valeur[1];
60 valeur[2]=mdd.valeur[2];
61 }
62
63 OT_VECTEUR_3D::OT_VECTEUR_3D(OT_VECTEUR_3D& mdd)
64 {
65 valeur[0]=mdd.valeur[0];
66 valeur[1]=mdd.valeur[1];
67 valeur[2]=mdd.valeur[2];
68 }
69
70 OT_VECTEUR_3D::OT_VECTEUR_3D(void)
71 {
72 valeur[0]=0.;
73 valeur[1]=0.;
74 valeur[2]=0.;
75 }
76
77 double OT_VECTEUR_3D::get_x(void) const
78 {
79 return valeur[0];
80 }
81
82
83 double OT_VECTEUR_3D::get_y(void) const
84 {
85 return valeur[1];
86 }
87
88
89 double OT_VECTEUR_3D::get_z(void) const
90 {
91 return valeur[2];
92 }
93
94 void OT_VECTEUR_3D::change_x(double x)
95 {
96 valeur[0]=x;
97 }
98
99 void OT_VECTEUR_3D::change_y(double y)
100 {
101 valeur[1]=y;
102 }
103
104 void OT_VECTEUR_3D::change_z(double z)
105 {
106 valeur[2]=z;
107 }
108
109 double* OT_VECTEUR_3D::get_xyz(void)
110 {
111 return valeur;
112 }
113
114 OT_VECTEUR_3D::operator const double* () const
115 {
116 return valeur;
117 }
118
119 OT_VECTEUR_3D::operator double* ()
120 {
121 return valeur;
122 }
123
124 double OT_VECTEUR_3D::operator[] (int i) const
125 {
126 return valeur[i];
127 }
128
129 double & OT_VECTEUR_3D::operator[] (int i)
130 {
131 return valeur[i];
132 }
133
134 double OT_VECTEUR_3D::operator() (int i) const
135 {
136 return valeur[i];
137 }
138 double & OT_VECTEUR_3D::operator() (int i)
139 {
140 return valeur[i];
141 }
142
143 double OT_VECTEUR_3D::get_longueur(void) const
144 {
145 return sqrt(valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
146 }
147
148 double OT_VECTEUR_3D::get_longueur2(void) const
149 {
150 return (valeur[0]*valeur[0]+valeur[1]*valeur[1]+valeur[2]*valeur[2]);
151 }
152
153
154 void OT_VECTEUR_3D::norme(void)
155 {
156 double longueur=get_longueur();
157 if (longueur != 0)
158 {
159 valeur[0]=valeur[0]/longueur;
160 valeur[2]=valeur[2]/longueur;
161 valeur[1]=valeur[1]/longueur;
162 }
163 }
164
165 OT_VECTEUR_3D OT_VECTEUR_3D::gram_shmidt(const OT_VECTEUR_3D& vint)
166 {
167 OT_VECTEUR_3D v(0.,0.,0.);
168 double alpha=(*this)*vint;
169 v= *this-alpha*vint;
170 return v;
171 }
172
173 OT_VECTEUR_3D OT_VECTEUR_3D::unite(int i)
174 {
175 OT_VECTEUR_3D v(0.,0.,0.);
176 v[i]=1.;
177 return v;
178 }
179
180
181 int OT_VECTEUR_3D::compare_valeur (const OT_VECTEUR_3D& mdd) const
182 {
183 return memcmp(valeur, mdd.valeur, 3*sizeof(double));
184 }
185
186 bool OT_VECTEUR_3D::operator== (const OT_VECTEUR_3D& mdd) const
187 {
188 return compare_valeur(mdd) == 0;
189 }
190
191 bool OT_VECTEUR_3D::operator!= (const OT_VECTEUR_3D& mdd) const
192 {
193 return compare_valeur(mdd) != 0;
194 }
195
196 bool OT_VECTEUR_3D::operator< (const OT_VECTEUR_3D& mdd) const
197 {
198 return compare_valeur(mdd) < 0;
199 }
200
201 bool OT_VECTEUR_3D::operator<= (const OT_VECTEUR_3D& mdd) const
202 {
203 return compare_valeur(mdd) <= 0;
204 }
205
206 bool OT_VECTEUR_3D::operator> (const OT_VECTEUR_3D& mdd) const
207 {
208 return compare_valeur(mdd) > 0;
209 }
210
211 bool OT_VECTEUR_3D::operator>= (const OT_VECTEUR_3D& mdd) const
212 {
213 return compare_valeur(mdd) >= 0;
214 }
215
216 std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec)
217 {
218 __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<"}, ";
219 return __os;
220 }
221
222 OT_VECTEUR_3D operator/ (const OT_VECTEUR_3D& mdd1, double diviseur)
223 {
224 OT_VECTEUR_3D kQuot;
225
226 if ( diviseur != (double)0.0 )
227 {
228 double facteur = ((double)1.0)/diviseur;
229 kQuot.valeur[0] = facteur*mdd1.valeur[0];
230 kQuot.valeur[1] = facteur*mdd1.valeur[1];
231 kQuot.valeur[2] = facteur*mdd1.valeur[2];
232 }
233 else
234 {
235 kQuot.valeur[0] = 1E300;
236 kQuot.valeur[1] = 1E300;
237 kQuot.valeur[2] = 1E300;
238 }
239
240 return kQuot;
241 }
242
243 OT_VECTEUR_3D operator- (const OT_VECTEUR_3D& mdd1)
244 {
245 return OT_VECTEUR_3D(
246 -mdd1.valeur[0],
247 -mdd1.valeur[1],
248 -mdd1.valeur[2]);
249 }
250
251 double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
252 {
253 double tmp;
254 tmp=mdd1.valeur[0]*mdd2.valeur[0]+mdd1.valeur[1]*mdd2.valeur[1]+mdd1.valeur[2]*mdd2.valeur[2];
255 return tmp;
256 }
257
258 OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2)
259 {
260 OT_VECTEUR_3D tmp;
261 tmp.valeur[0]=mdd1*mdd2.valeur[0];
262 tmp.valeur[1]=mdd1*mdd2.valeur[1];
263 tmp.valeur[2]=mdd1*mdd2.valeur[2];
264 return tmp;
265 }
266
267 OT_VECTEUR_3D& OT_VECTEUR_3D::operator+= (const OT_VECTEUR_3D& mdd)
268 {
269 valeur[0] += mdd.valeur[0];
270 valeur[1] += mdd.valeur[1];
271 valeur[2] += mdd.valeur[2];
272 return *this;
273 }
274 OT_VECTEUR_3D& OT_VECTEUR_3D::operator-= (const OT_VECTEUR_3D& mdd)
275 {
276 valeur[0] -= mdd.valeur[0];
277 valeur[1] -= mdd.valeur[1];
278 valeur[2] -= mdd.valeur[2];
279 return *this;
280 }
281 OT_VECTEUR_3D& OT_VECTEUR_3D::operator*= (double facteur)
282 {
283 valeur[0] *= facteur;
284 valeur[1] *= facteur;
285 valeur[2] *= facteur;
286 return *this;
287 }
288 OT_VECTEUR_3D& OT_VECTEUR_3D::operator/= (double diviseur)
289 {
290 if ( diviseur != (double)0.0 )
291 {
292 double facteur = ((double)1.0)/diviseur;
293 valeur[0] *= facteur;
294 valeur[1] *= facteur;
295 valeur[2] *= facteur;
296 }
297 else
298 {
299 valeur[0] = 1E300;
300 valeur[1] = 1E300;
301 valeur[2] = 1E300;
302 }
303
304 return *this;
305 }
306
307 OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
308 {
309 OT_VECTEUR_3D tmp;
310 tmp.valeur[0]=mdd1.valeur[1]*mdd2.valeur[2]-mdd1.valeur[2]*mdd2.valeur[1];
311 tmp.valeur[1]=mdd1.valeur[2]*mdd2.valeur[0]-mdd1.valeur[0]*mdd2.valeur[2];
312 tmp.valeur[2]=mdd1.valeur[0]*mdd2.valeur[1]-mdd1.valeur[1]*mdd2.valeur[0];
313 return tmp;
314 }
315
316 double OT_VECTEUR_3D::diff(void)
317 {
318 return 0.33333333333333*(fabs(valeur[0])+fabs(valeur[1])+fabs(valeur[2]));
319 }
320
321
322 OT_MATRICE_3D::OT_MATRICE_3D(OT_VECTEUR_3D& colonne1,OT_VECTEUR_3D& colonne2,OT_VECTEUR_3D& colonne3)
323 {
324 vec[0]=colonne1;
325 vec[1]=colonne2;
326 vec[2]=colonne3;
327 }
328
329 OT_MATRICE_3D::OT_MATRICE_3D(const OT_MATRICE_3D& mdd)
330 {
331 vec[0]=mdd.vec[0];
332 vec[1]=mdd.vec[1];
333 vec[2]=mdd.vec[2];
334 }
335
336
337 std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat)
338 {
339
340 __os << "{ ";
341 for (unsigned i=0; i<3; i++)
342 {
343 __os << "[ "<< __mat(i,0)<<" ]\t [ "<<__mat(i,1) <<" ]\t [ "<<__mat(i,2);
344 if (i+1 < 3)
345 __os << std::endl << " ";
346 }
347 __os << " }" << std::endl;
348 return __os;
349 }
350
351 OT_VECTEUR_3D & OT_MATRICE_3D::operator [](int i)
352 {
353 return vec[i];
354 }
355
356 OT_MATRICE_3D::OT_MATRICE_3D(double* t)
357 {
358 for(int i=0;i<3;i++)
359 {
360 for(int j=0;j<3;j++)
361 {
362 vec[i][j]=t[i*3+j];
363 }
364
365 }
366 }
367
368 double OT_MATRICE_3D::valeur(int iLigne, int iCol) const
369 {
370 return vec[iCol][iLigne];
371 }
372 double & OT_MATRICE_3D::valeur(int iLigne, int iCol)
373 {
374 return vec[iCol][iLigne];
375 }
376 double OT_MATRICE_3D::operator() (int iLigne, int iCol) const
377 {
378 return vec[iCol][iLigne];
379 }
380 double & OT_MATRICE_3D::operator() (int iLigne, int iCol)
381 {
382 return vec[iCol][iLigne];
383 }
384 double OT_MATRICE_3D::get_determinant()
385 {
386 double coFacteur0 = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
387 double coFacteur1 = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
388 double coFacteur2 = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
389 double determinant = valeur(0,0)*coFacteur0 + valeur(0,1)*coFacteur1 + valeur(0,2)*coFacteur2;
390 return determinant;
391 }
392 void OT_MATRICE_3D::identite(void)
393 {
394 for (unsigned i = 0; i<3; i++)
395 for (unsigned j = 0; j < 3; j++)
396 vec[i][j] = (i==j) ? 1.0 : 0.0 ;
397 }
398
399 void OT_MATRICE_3D::transpose(OT_MATRICE_3D& res) const
400 {
401 for (unsigned i = 0; i<3; i++)
402 for (unsigned j = 0; j < 3; j++)
403 res.vec[i][j] = vec[j][i];
404 }
405
406 OT_MATRICE_3D OT_MATRICE_3D::inverse () const
407 {
408 // Invert a 3x3 using cofactors. This is faster than using a generic
409 // Gaussian elimination because of the loop overhead of such a method.
410
411 OT_MATRICE_3D matInverse;
412
413 matInverse.valeur(0,0) = valeur(1,1)*valeur(2,2) - valeur(1,2)*valeur(2,1);
414 matInverse.valeur(0,1) = valeur(0,2)*valeur(2,1) - valeur(0,1)*valeur(2,2);
415 matInverse.valeur(0,2) = valeur(0,1)*valeur(1,2) - valeur(0,2)*valeur(1,1);
416 matInverse.valeur(1,0) = valeur(1,2)*valeur(2,0) - valeur(1,0)*valeur(2,2);
417 matInverse.valeur(1,1) = valeur(0,0)*valeur(2,2) - valeur(0,2)*valeur(2,0);
418 matInverse.valeur(1,2) = valeur(0,2)*valeur(1,0) - valeur(0,0)*valeur(1,2);
419 matInverse.valeur(2,0) = valeur(1,0)*valeur(2,1) - valeur(1,1)*valeur(2,0);
420 matInverse.valeur(2,1) = valeur(0,1)*valeur(2,0) - valeur(0,0)*valeur(2,1);
421 matInverse.valeur(2,2) = valeur(0,0)*valeur(1,1) - valeur(0,1)*valeur(1,0);
422
423 double det = valeur(0,0)*matInverse(0,0) + valeur(0,1)*matInverse(1,0)+
424 valeur(0,2)*matInverse(2,0);
425
426 if ( fabs(det) <= 1E-100 )
427 {
428 matInverse.identite();
429 return matInverse;
430 }
431
432 double invDet = 1/det;
433
434 for (int i=0; i<3; i++)
435 for (int j=0; j<3; j++)
436 matInverse.vec[i][j] *= invDet;
437
438 return matInverse;
439 }
440
441 void OT_MATRICE_3D::change_vecteur1(OT_VECTEUR_3D v)
442 {
443 vec[0]=v;
444 }
445 void OT_MATRICE_3D::change_vecteur2(OT_VECTEUR_3D v)
446 {
447 vec[1]=v;
448 }
449 void OT_MATRICE_3D::change_vecteur3(OT_VECTEUR_3D v)
450 {
451 vec[2]=v;
452 }
453 OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur1(void)
454 {
455 return vec[0];
456 }
457 OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur2(void)
458 {
459 return vec[1];
460 }
461 OT_VECTEUR_3D& OT_MATRICE_3D::get_vecteur3(void)
462 {
463 return vec[2];
464 }
465
466
467
468 void OT_MATRICE_3D::jacobi(double* a,double* d,double* v,int n,int&nrot)
469 {
470 //#define a(i,j)=(*(a+(i)*(n)+j))
471 // #define v(r,s)=(*(v+(r)*(n)+s))
472 static const int ITMAX=50;
473 int n1=n-1,n2=1/(n*n),ip1,iq1;// ,ip,j,i,iq// n=3,
474 double tresh,theta,tau,t,sm,s,h,g,c;
475 double *b=new double[n]; // OT_VECTEUR_3D b,z;
476 double *z=new double[n];
477
478 for(int ip=0;ip<n;ip++)
479 {
480 for(int iq=0;iq<n;iq++)
481 v[ip*n+iq]=0.0;
482 v[ip*n+ip]=1.0;
483 b[(unsigned int)ip]=d[(unsigned int)ip]=a[ip*n+ip];
484 z[(unsigned int)ip]=0.0;
485 }
486 nrot=0;
487 for(int i=1;i<=ITMAX;i++)
488 {
489 sm=0.0;
490 for(int ip=0;ip<n1;ip++)
491 for(int iq=ip+1;iq<n;iq++)
492 sm+=fabs(a[ip*n+iq]);
493 if(sm==0.0)
494 return;
495 if(i<4)
496 tresh=0.2*sm*n2;
497 else
498 tresh=0.0;
499 for(int ip=0;ip<n1;ip++)
500 for(int iq=ip+1;iq<n;iq++)
501 {
502 g=100*fabs(a[ip*n+iq]);
503 if(i>4&&(fabs(d[(unsigned int)ip])+g)==fabs(d[(unsigned int)ip])&&(fabs(d[(unsigned int)iq])+g)==fabs(d[(unsigned int)iq]))
504 a[ip*n+iq]=0.0;
505 else if(fabs(a[ip*n+iq])>tresh)
506 {
507 h=d[(unsigned int)iq]-d[(unsigned int)ip];
508 if((fabs(h)+g)==fabs(h))
509 t=a[ip*n+iq]/h;
510 else
511 {
512 theta=0.5*h/a[ip*n+iq];
513 t=1.0/(fabs(theta)+sqrt(1.0+theta*theta));
514 if(theta<0.0)t=-t;
515 }
516 c=1.0/sqrt(1+t*t);
517 s=t*c;
518 tau=s/(1.0+c);
519 h=t*a[ip*n+iq];
520 z[(unsigned int)ip]-=h;
521 z[(unsigned int)iq]+=h;
522 d[(unsigned int)ip]-=h;
523 d[(unsigned int)iq]+=h;
524 a[ip*n+iq]=0.0;
525 ip1=ip-1;
526 iq1=iq-1;
527 for(int j=0;j<=ip1;j++)
528 {
529 g=a[j*n+ip];
530 h=a[j*n+iq];
531 a[j*n+ip]=g-s*(h+g*tau);
532 a[j*n+iq]=h+s*(g-h*tau);
533 }
534 for(int j=ip+1;j<=iq1;j++)
535 {
536 g=a[ip,j];
537 h=a[j,iq];
538 a[ip*n+j]=g-s*(h+g*tau);
539 a[j*n+iq]=h+s*(g-h*tau);
540 }
541 for(int j=iq+1;j<n;j++)
542 {
543 g=a[ip*n+j];
544 h=a[iq*n+j];
545 a[ip*n+j]=g-s*(h+g*tau);
546 a[iq*n+j]=h+s*(g-h*tau);
547 }
548 for(int j=0;j<n;j++)
549 {
550 g=v[j*n+ip];
551 h=v[j*n+iq];
552 v[j*n+ip]=g-s*(h+g*tau);
553 v[j*n+iq]=h+s*(g-h*tau);
554 }
555 ++nrot;
556 }
557 }
558 for(int ip=0;ip<n;ip++)
559 {
560 b[(unsigned int)ip]+=z[(unsigned int)ip];
561 d[(unsigned int)ip]=b[(unsigned int)ip];
562 z[(unsigned int)ip]=0.0;
563 }
564 }
565
566
567 delete [] b;
568 delete [] z;
569 //#undef a
570 //#undef v
571 }
572
573
574 OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
575 {
576 OT_MATRICE_3D tmp;
577 for(int i=0;i<3;i++) {
578 for(int j=0;j<3;j++) tmp(i,j)= mdd1(i,j)+mdd2(i,j);
579 }
580 return tmp;
581 }
582
583
584 OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2)
585 {
586 OT_VECTEUR_3D tmp;
587 tmp(0)=mdd1(0,0)*mdd2(0)+mdd1(0,1)*mdd2(1)+mdd1(0,2)*mdd2(2);
588 tmp(1)=mdd1(1,0)*mdd2(0)+mdd1(1,1)*mdd2(1)+mdd1(1,2)*mdd2(2);
589 tmp(2)=mdd1(2,0)*mdd2(0)+mdd1(2,1)*mdd2(1)+mdd1(2,2)*mdd2(2);
590 return tmp;}
591
592 OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
593 {
594 OT_VECTEUR_3D tmp;
595 tmp(0)=mdd1(0)+mdd2(0);
596 tmp(1)=mdd1(1)+mdd2(1);
597 tmp(2)=mdd1(2)+mdd2(2);
598 return tmp;
599 }
600
601 OT_VECTEUR_3D operator-(const class OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2)
602 {
603 OT_VECTEUR_3D tmp;
604 tmp.valeur[0]=mdd1.valeur[0]-mdd2.valeur[0];
605 tmp.valeur[1]=mdd1.valeur[1]-mdd2.valeur[1];
606 tmp.valeur[2]=mdd1.valeur[2]-mdd2.valeur[2];
607 return tmp;
608 }
609
610 OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2)
611 {
612 OT_MATRICE_3D tmp;
613 for (int i=0; i<3; i++)
614 for (int j=0; j<3; j++)
615 {
616 tmp(i,j) = 0;
617 for (int k=0; k<3; k++)
618 tmp(i,j) += mdd1(i,k)*mdd2(k,j);
619 }
620 return tmp;
621 }
622
623 #ifdef ot_vecteur_4d
624 OT_VECTEUR_4D::OT_VECTEUR_4D (double v[4])
625 {
626 for (int i=0; i<4; i++)
627 valeur[i]=v[i];
628 }
629
630 OT_VECTEUR_4D::OT_VECTEUR_4D (double x, double y, double z, double w)
631 {
632 valeur[0] = x;
633 valeur[1] = y;
634 valeur[2] = z;
635 valeur[3] = w;
636 }
637
638 OT_VECTEUR_4D::OT_VECTEUR_4D (const OT_VECTEUR_4D & v)
639 {
640 for (int i=0; i<4; i++)
641 valeur[i]=v[i];
642 }
643
644
645 double & OT_VECTEUR_4D::operator()(int i)
646 {
647 return valeur[i];
648 }
649
650 double OT_VECTEUR_4D::operator()(int i) const
651 {
652 return valeur[i];
653 }
654
655 double & OT_VECTEUR_4D::operator[](int i)
656 {
657 return valeur[i];
658 }
659
660 double OT_VECTEUR_4D::operator[](int i) const
661 {
662 return valeur[i];
663 }
664
665 OT_VECTEUR_4D::operator const double* () const
666 {
667 return valeur;
668 }
669
670 OT_VECTEUR_4D::operator double* ()
671 {
672 return valeur;
673 }
674
675 double OT_VECTEUR_4D::get_x(void) const
676 { return valeur[0]; }
677 double & OT_VECTEUR_4D::x(void)
678 { return valeur[0]; }
679 double OT_VECTEUR_4D::get_y(void) const
680 { return valeur[1]; }
681 double & OT_VECTEUR_4D::y(void)
682 { return valeur[1]; }
683 double OT_VECTEUR_4D::get_z(void) const
684 { return valeur[2]; }
685 double & OT_VECTEUR_4D::z(void)
686 { return valeur[2]; }
687 double OT_VECTEUR_4D::get_w(void) const
688 { return valeur[3]; }
689 double & OT_VECTEUR_4D::w(void)
690 { return valeur[3]; }
691 void OT_VECTEUR_4D::change_x(double x)
692 { valeur[0] = x; }
693 void OT_VECTEUR_4D::change_y(double y)
694 { valeur[1] = y; }
695 void OT_VECTEUR_4D::change_z(double z)
696 { valeur[2] = z; }
697 void OT_VECTEUR_4D::change_w(double w)
698 { valeur[3] = w; }
699 double* OT_VECTEUR_4D::get_xyzw(void)
700 { return valeur; }
701
702 OT_VECTEUR_4D OT_VECTEUR_4D::operator+ (const OT_VECTEUR_4D & a)
703 {
704 return OT_VECTEUR_4D(
705 a(0)+valeur[0],a(1)+valeur[1],a(2)+valeur[2],a(3)+valeur[3]
706 );
707 }
708
709 OT_VECTEUR_4D OT_VECTEUR_4D::operator- (const OT_VECTEUR_4D & a)
710 {
711 return OT_VECTEUR_4D(
712 valeur[0]-a(0),valeur[1]-a(1),valeur[2]-a(2),valeur[3]-a(3)
713 );
714 }
715
716 OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a)
717 {
718 return OT_VECTEUR_4D(
719 a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
720 );
721 }
722 OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV)
723 {
724 return OT_VECTEUR_4D(
725 a*rkV[0],a*rkV[1],a*rkV[2],a*rkV[3]
726 );
727 }
728
729 OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a)
730 {
731 double inv = 1/a;
732 return OT_VECTEUR_4D(
733 inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
734 );
735 }
736
737
738 OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV)
739 {
740 double inv = 1/a;
741 return OT_VECTEUR_4D(
742 inv*rkV[0],inv*rkV[1],inv*rkV[2],inv*rkV[3]
743 );
744 }
745
746 double OT_VECTEUR_4D::operator* (const OT_VECTEUR_4D & a)
747 {
748 return a[0]*valeur[0]+a[1]*valeur[1]+a[2]*valeur[2]+a[3]*valeur[3];
749 }
750
751
752 OT_VECTEUR_4D& OT_VECTEUR_4D::operator+= (const OT_VECTEUR_4D& rkV)
753 {
754 valeur[0] += rkV.valeur[0];
755 valeur[1] += rkV.valeur[1];
756 valeur[2] += rkV.valeur[2];
757 valeur[3] += rkV.valeur[3];
758 return *this;
759 }
760
761 OT_VECTEUR_4D& OT_VECTEUR_4D::operator-= (const OT_VECTEUR_4D& rkV)
762 {
763 valeur[0] -= rkV.valeur[0];
764 valeur[1] -= rkV.valeur[1];
765 valeur[2] -= rkV.valeur[2];
766 valeur[3] -= rkV.valeur[3];
767 return *this;
768 }
769 OT_VECTEUR_4D& OT_VECTEUR_4D::operator*= (double fScalar)
770 {
771 valeur[0] *= fScalar;
772 valeur[1] *= fScalar;
773 valeur[2] *= fScalar;
774 valeur[3] *= fScalar;
775 return *this;
776 }
777 OT_VECTEUR_4D& OT_VECTEUR_4D::operator/= (double fScalar)
778 {
779 double a = 1/fScalar;
780 valeur[0] *= a;
781 valeur[1] *= a;
782 valeur[2] *= a;
783 valeur[3] *= a;
784 return *this;
785 }
786 OT_VECTEUR_4D &OT_VECTEUR_4D::operator= (double a)
787 {
788 valeur[0]=valeur[1]=valeur[2]=valeur[3]=a;
789 return *this;
790 }
791
792 std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec)
793 {
794 __os << "{ "<< __vec[0]<<", "<<__vec[1]<<", "<<__vec[2]<<", "<<__vec[3]<<"}, ";
795 return __os;
796 }
797 #endif // ot_vecteur_4d
798
799 int OPERATEUR::egal(double a,double b,double eps)
800 {
801 double res=fabs(a-b);
802 if (res<eps) return(1);
803 return(0);
804 }
805
806
807 double OPERATEUR::qualite_triangle(double* noeud1,double* noeud2,double* noeud3)
808 {
809 OT_VECTEUR_3D vec12(noeud1,noeud2);
810 OT_VECTEUR_3D vec13(noeud1,noeud3);
811 OT_VECTEUR_3D vec23(noeud2,noeud3);
812 double d12=vec12.get_longueur();
813 double d13=vec13.get_longueur();
814 double d23=vec23.get_longueur();
815 double dmax=max(d12,d13);
816 dmax=max(dmax,d23);
817 double p=0.5*(d12+d13+d23);
818 double crit=(p-d12)*(p-d13)*(p-d23)/p;
819 if (crit<0) crit=0.;
820 crit=sqrt(crit);
821 crit=crit/dmax;
822 crit=crit*3.4641101614;
823 return crit;
824 }
825
826 void OPERATEUR::doubleto2int(double val,int& val1,int& val2)
827 {
828 int *p=(int*)(&(val));
829 val1=(*p);
830 val2=(*(p+1));
831 }
832
833 double OPERATEUR::qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4)
834 {
835 OT_VECTEUR_3D ab(noeud1,noeud2);
836 OT_VECTEUR_3D ac(noeud1,noeud3);
837 OT_VECTEUR_3D cb(noeud3,noeud2);
838 OT_VECTEUR_3D db(noeud4,noeud2);
839 OT_VECTEUR_3D da(noeud4,noeud1);
840 OT_VECTEUR_3D dc(noeud4,noeud3);
841 double dab=ab.get_longueur();
842 double dac=ac.get_longueur();
843 double dcb=cb.get_longueur();
844 double ddb=db.get_longueur();
845 double dda=da.get_longueur();
846 double ddc=dc.get_longueur();
847
848 double dmax=max(dab,dac);
849 dmax=max(dmax,dcb);
850 dmax=max(dmax,ddb);
851 dmax=max(dmax,dda);
852 dmax=max(dmax,ddc);
853
854 OT_VECTEUR_3D pvec=ab&ac;
855 double vol=pvec*da;
856 if (vol>0.) return 0.;
857 vol=fabs(vol);
858 double som=pvec.get_longueur()/2.;
859 pvec=ab&da;
860 som=som+pvec.get_longueur()/2.;
861 pvec=ac&dc;
862 som=som+pvec.get_longueur()/2.;
863 pvec=cb&db;
864 som=som+pvec.get_longueur()/2.;
865 double crit=vol/som/dmax/0.408249;
866 return crit;
867 }
868
869
870
871 template <int N> DOUBLEN<N>::DOUBLEN()
872 {
873 tab[0]=-1;
874 }
875
876 template <int N> DOUBLEN<N>::DOUBLEN(DOUBLEN& mdd)
877 {
878 for (int i=0;i<N;i++)
879 tab[i]=mdd.tab[i];
880 }
881
882 template <int N> DOUBLEN<N>::DOUBLEN(double *v)
883 {
884 for (int i=0;i<N;i++)
885 tab[i]=v[i];
886 }
887
888 template <int N> DOUBLEN<N>::~DOUBLEN()
889 {
890 }
891
892 template <int N> double DOUBLEN<N>::get_valeur(int num)
893 {
894 return tab[num];
895 }
896
897 template <int N> void DOUBLEN<N>::change_valeur(int num,double val)
898 {
899 tab[num]=val;
900 }
901
902 template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(DOUBLEN<N> & mdd)
903 {
904 for (int i=0;i<N;i++)
905 tab[i]=mdd.tab[i];
906 return *this;
907 }
908
909 template <int N> DOUBLEN<N> & DOUBLEN<N>::operator=(const DOUBLEN<N> & mdd)
910 {
911 for (int i=0;i<N;i++)
912 tab[i]=mdd.tab[i];
913 return *this;
914 }
915
916
917 #ifdef BORLANDCPP
918 // instanciation pour Windows (Borland c++)
919 template class __export DOUBLEN<1>;
920 template class __export DOUBLEN<4>;
921 template class __export DOUBLEN<10>;
922 #else
923 #ifdef GCC
924 // instanciation pour Unix (g++)
925 template class DOUBLEN<1>;
926 template class DOUBLEN<4>;
927 template class DOUBLEN<10>;
928 #else
929 // instanciation pour Windows (Visual Studio)
930 #endif
931 #endif
932
933