ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.h
Revision: 418
Committed: Mon Sep 9 15:10:25 2013 UTC (11 years, 8 months ago) by francois
Content type: text/plain
File size: 15768 byte(s)
Log Message:
Procedure pour savoir si un point est dans un tetra ou un point est dans un triangle. valide avec MG element et FEM element.
Procedure d'interpretation du resultat

File Contents

# User Rev Content
1 francois 283 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�re et Vincent FRANCOIS
5     // D�partement de G�nie M�canique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�partement
8     // de g�nie m�canique de l'Universit� du Qu�bec �
9     // Trois Rivi�res
10     // Les librairies ne peuvent �tre utilis�es sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // ot_mathematique.h
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 � 11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23     #ifndef _OTMATHEMATIQUE_
24     #define _OTMATHEMATIQUE_
25    
26     #ifdef WINDOWS_VERSION
27     #ifdef BUILT_DLL_OUTIL
28     #define DLLPORTOUTIL __declspec(dllexport)
29     #else
30     #define DLLPORTOUTIL __declspec(dllimport)
31     #endif
32     #else
33     #define DLLPORTOUTIL
34     #endif
35    
36     #include "ot_doubleprecision.h"
37     #include <iostream>
38     #include <vector>
39    
40    
41    
42    
43    
44    
45     class DLLPORTOUTIL OT_VECTEUR_3D
46     {
47     public :
48     // construction
49     OT_VECTEUR_3D(double x,double y,double z);
50     OT_VECTEUR_3D(double *xyz);
51     OT_VECTEUR_3D(double *xyz1,double *xyz2);
52     OT_VECTEUR_3D(void);
53     OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd);
54     OT_VECTEUR_3D unite(int i);
55     // stream string output
56     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
57    
58     // comparison
59     bool operator== (const OT_VECTEUR_3D& mdd) const;
60     bool operator!= (const OT_VECTEUR_3D& mdd) const;
61     bool operator< (const OT_VECTEUR_3D& mdd) const;
62     bool operator<= (const OT_VECTEUR_3D& mdd) const;
63     bool operator> (const OT_VECTEUR_3D& mdd) const;
64     bool operator>= (const OT_VECTEUR_3D& mdd) const;
65     int compare_valeur (const OT_VECTEUR_3D& mdd) const;
66    
67     // coordinate access
68     virtual double get_x(void) const ;
69     virtual double get_y(void) const ;
70     virtual double get_z(void) const ;
71     virtual void change_x(double x);
72     virtual void change_y(double y);
73     virtual void change_z(double z);
74     virtual double* get_xyz(void);
75    
76     operator const double* () const;
77     operator double* ();
78     double operator[] (int i) const;
79     double& operator[] (int i);
80     double operator() (int i) const;
81     double & operator() (int i);
82    
83     // arithmetic operations
84     friend OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
85     friend OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
86     friend double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
87     friend OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
88     friend OT_VECTEUR_3D operator*(const class OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
89     friend OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
90     friend OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
91     friend OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
92    
93     // arithmetic updates
94     OT_VECTEUR_3D& operator+= (const OT_VECTEUR_3D& rkV);
95     OT_VECTEUR_3D& operator-= (const OT_VECTEUR_3D& rkV);
96     OT_VECTEUR_3D& operator*= (double fScalar);
97     OT_VECTEUR_3D& operator/= (double fScalar);
98    
99     // vector operations
100     virtual double get_longueur(void) const ;
101     virtual double get_longueur2(void) const ;
102     virtual void norme(void);
103     OT_VECTEUR_3D gram_shmidt(const OT_VECTEUR_3D& vint);
104     virtual double diff(void);
105    
106    
107     private:
108     double valeur[3];
109     };
110    
111     class DLLPORTOUTIL OT_MATRICE_3D
112     {
113     public:
114     OT_MATRICE_3D(OT_VECTEUR_3D& v1,OT_VECTEUR_3D& v2,OT_VECTEUR_3D& v3);
115     OT_MATRICE_3D(void);
116     OT_MATRICE_3D(double* t);
117     OT_MATRICE_3D(const OT_MATRICE_3D& mdd);
118    
119     // stream string output
120     friend std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
121    
122     // access to matrix elements
123     double operator() (int iLigne, int iCol) const;
124     double & operator() (int iLigne, int iCol);
125     double valeur(int iLigne, int iCol) const;
126     double & valeur(int iLigne, int iCol);
127     OT_VECTEUR_3D& get_vecteur1(void);
128     OT_VECTEUR_3D& get_vecteur2(void);
129     OT_VECTEUR_3D& get_vecteur3(void);
130     void change_vecteur1(OT_VECTEUR_3D v);
131     void change_vecteur2(OT_VECTEUR_3D v);
132     void change_vecteur3(OT_VECTEUR_3D v);
133     OT_VECTEUR_3D & operator [](int i);
134     // return inverse matrix
135     OT_MATRICE_3D inverse() const;
136     // assignements methods
137     void identite(void);
138     double get_determinant();
139     void transpose(OT_MATRICE_3D& res) const;
140     OT_MATRICE_3D transpose() const;
141     friend OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
142    
143     private:
144     OT_VECTEUR_3D vec[3]; // attention ! vecteurs colonne
145     friend OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
146     };
147    
148     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
149     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
150     DLLPORTOUTIL OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
151     DLLPORTOUTIL OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
152     DLLPORTOUTIL double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
153     DLLPORTOUTIL OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
154     DLLPORTOUTIL OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
155     DLLPORTOUTIL OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
156     DLLPORTOUTIL OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
157     DLLPORTOUTIL OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
158     DLLPORTOUTIL OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
159     DLLPORTOUTIL OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
160    
161    
162    
163     #define ot_vecteur_4d
164     #ifdef ot_vecteur_4d
165     class DLLPORTOUTIL OT_VECTEUR_4D
166     {
167     public :
168     //construction
169     OT_VECTEUR_4D(double x,double y,double z,double w);
170     OT_VECTEUR_4D(double *xyzw);
171     OT_VECTEUR_4D(void) {};
172     OT_VECTEUR_4D(const OT_VECTEUR_4D& mdd);
173     OT_VECTEUR_4D & operator= (double);
174    
175     // stream string output
176     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
177    
178     // comparison
179     bool operator== (const OT_VECTEUR_4D& mdd) const;
180     bool operator!= (const OT_VECTEUR_4D& mdd) const;
181     bool operator< (const OT_VECTEUR_4D& mdd) const;
182     bool operator<= (const OT_VECTEUR_4D& mdd) const;
183     bool operator> (const OT_VECTEUR_4D& mdd) const;
184     bool operator>= (const OT_VECTEUR_4D& mdd) const;
185     int compare_valeur (const OT_VECTEUR_4D& mdd) const;
186    
187     // coordinate access
188     virtual double get_x(void) const ;
189     virtual double get_y(void) const ;
190     virtual double get_z(void) const ;
191     virtual double get_w(void) const ;
192     virtual double & x(void);
193     virtual double & y(void);
194     virtual double & z(void);
195     virtual double & w(void);
196     virtual void change_x(double x);
197     virtual void change_y(double y);
198     virtual void change_z(double z);
199     virtual void change_w(double w);
200     virtual double* get_xyzw(void);
201     operator const double* () const;
202     operator double* ();
203     double operator[] (int i) const;
204     double& operator[] (int i);
205     double operator() (int i) const;
206     double & operator() (int i);
207    
208     // arithmetic operations
209     OT_VECTEUR_4D operator+ (const OT_VECTEUR_4D& rkV);
210     OT_VECTEUR_4D operator- (const OT_VECTEUR_4D& rkV);
211     double operator* (const OT_VECTEUR_4D & a);
212    
213     // arithmetic updates
214     OT_VECTEUR_4D& operator+= (const OT_VECTEUR_4D& rkV);
215     OT_VECTEUR_4D& operator-= (const OT_VECTEUR_4D& rkV);
216     OT_VECTEUR_4D& operator*= (double fScalar);
217     OT_VECTEUR_4D& operator/= (double fScalar);
218    
219     private:
220     double valeur[4];
221     };
222    
223     DLLPORTOUTIL OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a);
224     DLLPORTOUTIL OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV);
225     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a);
226     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV);
227     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
228     #endif // ot_vecteur_4d
229    
230    
231    
232     class DLLPORTOUTIL OT_VECTEUR_4DD
233     {
234     public :
235     //construction
236     OT_VECTEUR_4DD(double2 x,double2 y,double2 z,double2 w);
237     OT_VECTEUR_4DD(double2 *xyzw);
238     OT_VECTEUR_4DD() {};
239     OT_VECTEUR_4DD(const OT_VECTEUR_4DD& mdd);
240     //OT_VECTEUR_4DD & operator= (double2);
241     OT_VECTEUR_4DD & operator= (const OT_VECTEUR_4DD&);
242    
243     // stream string output
244     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
245    
246     // comparison
247     bool operator== (const OT_VECTEUR_4DD& mdd) const;
248     bool operator!= (const OT_VECTEUR_4DD& mdd) const;
249     bool operator< (const OT_VECTEUR_4DD& mdd) const;
250     bool operator<= (const OT_VECTEUR_4DD& mdd) const;
251     bool operator> (const OT_VECTEUR_4DD& mdd) const;
252     bool operator>= (const OT_VECTEUR_4DD& mdd) const;
253     int compare_valeur (const OT_VECTEUR_4DD& mdd) const;
254    
255     // coordinate access
256     virtual double2 get_x(void) const ;
257     virtual double2 get_y(void) const ;
258     virtual double2 get_z(void) const ;
259     virtual double2 get_w(void) const ;
260     virtual double2 & x(void);
261     virtual double2 & y(void);
262     virtual double2 & z(void);
263     virtual double2 & w(void);
264     virtual void change_x(double2 x);
265     virtual void change_y(double2 y);
266     virtual void change_z(double2 z);
267     virtual void change_w(double2 w);
268     virtual double2* get_xyzw(void);
269     double2 norme();
270     OT_VECTEUR_4DD vecteur_norme() ;
271 francois 363 OT_VECTEUR_4DD vecteur_norme_3d() ;
272 francois 283 operator const double2* () const;
273     operator double2* ();
274     double2 operator[] (int i) const;
275     double2& operator[] (int i);
276     double2 operator() (int i) const;
277     double2 & operator() (int i);
278    
279     // arithmetic operations
280     OT_VECTEUR_4DD operator+ (const OT_VECTEUR_4DD& rkV);
281     OT_VECTEUR_4DD operator- (const OT_VECTEUR_4DD& rkV);
282     double2 operator* (const OT_VECTEUR_4DD & a);
283    
284     // arithmetic updates
285     OT_VECTEUR_4DD& operator+= (const OT_VECTEUR_4DD& rkV);
286     OT_VECTEUR_4DD& operator-= (const OT_VECTEUR_4DD& rkV);
287     OT_VECTEUR_4DD& operator*= (double2 fScalar);
288     OT_VECTEUR_4DD& operator/= (double2 fScalar);
289     OT_VECTEUR_4DD operator^(const OT_VECTEUR_4DD& v2);
290    
291    
292     private:
293     double2 valeur[4];
294     };
295    
296    
297    
298     class DLLPORTOUTIL OT_VECTEUR_3DD
299     {
300     public :
301     //construction
302     OT_VECTEUR_3DD(double2 x,double2 y,double2 z);
303     OT_VECTEUR_3DD(double2 *xyzw);
304     OT_VECTEUR_3DD() {};
305     OT_VECTEUR_3DD(const OT_VECTEUR_3DD& mdd);
306     OT_VECTEUR_3DD & operator= (const OT_VECTEUR_3DD&);
307    
308     // stream string output
309     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec);
310    
311     // comparison
312     bool operator== (const OT_VECTEUR_3DD& mdd) const;
313     bool operator!= (const OT_VECTEUR_3DD& mdd) const;
314     bool operator< (const OT_VECTEUR_3DD& mdd) const;
315     bool operator<= (const OT_VECTEUR_3DD& mdd) const;
316     bool operator> (const OT_VECTEUR_3DD& mdd) const;
317     bool operator>= (const OT_VECTEUR_3DD& mdd) const;
318     int compare_valeur (const OT_VECTEUR_3DD& mdd) const;
319    
320     // coordinate access
321     virtual double2 get_x(void) const ;
322     virtual double2 get_y(void) const ;
323     virtual double2 get_z(void) const ;
324     virtual double2 & x(void);
325     virtual double2 & y(void);
326     virtual double2 & z(void);
327     virtual void change_x(double2 x);
328     virtual void change_y(double2 y);
329     virtual void change_z(double2 z);
330     virtual double2* get_xyz(void);
331     double2 norme();
332     OT_VECTEUR_3DD vecteur_norme() ;
333     operator const double2* () const;
334     operator double2* ();
335     double2 operator[] (int i) const;
336     double2& operator[] (int i);
337     double2 operator() (int i) const;
338     double2 & operator() (int i);
339    
340     // arithmetic operations
341     OT_VECTEUR_3DD operator+ (const OT_VECTEUR_3DD& rkV);
342     OT_VECTEUR_3DD operator- (const OT_VECTEUR_3DD& rkV);
343     double2 operator* (const OT_VECTEUR_3DD & a);
344    
345     // arithmetic updates
346     OT_VECTEUR_3DD& operator+= (const OT_VECTEUR_3DD& rkV);
347     OT_VECTEUR_3DD& operator-= (const OT_VECTEUR_3DD& rkV);
348     OT_VECTEUR_3DD& operator*= (double2 fScalar);
349     OT_VECTEUR_3DD& operator/= (double2 fScalar);
350     OT_VECTEUR_3DD operator&(const OT_VECTEUR_3DD& v2);
351    
352    
353     private:
354     double2 valeur[3];
355     };
356    
357    
358    
359    
360    
361    
362     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a);
363     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV);
364     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a);
365     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV);
366     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
367     DLLPORTOUTIL OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a);
368     DLLPORTOUTIL OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV);
369     DLLPORTOUTIL OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a);
370     DLLPORTOUTIL OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV);
371     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
372    
373    
374    
375    
376    
377    
378     class DLLPORTOUTIL OPERATEUR
379     {
380     public:
381 francois 418 enum ETAT {EXTERIEUR=0,INTERIEUR=4,STRICTINTERIEUR=3,SUR_FACE=1,SUR_ARETE=5,FACE1=10,FACE2=11,FACE3=12,FACE4=13,ARETE1=20,ARETE2=21,ARETE3=22,ARETE4=23,ARETE5=24,ARETE6=25,SOMMET1=30,SOMMET2=31,SOMMET3=32,SOMMET4=33};
382    
383 francois 283 static int egal(double a,double b,double eps);
384     static double qualite_triangle(double* noeud1,double* noeud2,double* noeud3);
385     static double qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
386     static void doubleto2int(double val,int& val1,int& val2);
387 francois 418 static int estdansletetra(double *xyz1,double *xyz2,double *xyz3,double *xyz4,double x,double y, double z);
388     static int estdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z);
389     static int projeteestdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z);
390    
391     static int compare_etat_tetra(int etat,int valeur);
392     static int compare_etat_triangle(int etat,int valeur);
393 francois 283 };
394    
395    
396     template <int N=4>
397     class DLLPORTOUTIL DOUBLEN
398     {
399     public:
400     DOUBLEN();
401     DOUBLEN(double *v);
402     DOUBLEN(DOUBLEN& mdd);
403     DOUBLEN(const DOUBLEN& mdd);
404     ~DOUBLEN();
405     double get_valeur(int num);
406     void change_valeur(int num,double val);
407     DOUBLEN<N> & operator=(DOUBLEN<N> & mdd);
408     DOUBLEN<N> & operator=(const DOUBLEN<N> & mdd);
409     private:
410     double tab[N];
411     };
412    
413     struct lessOT_VECTEUR_4DD : binary_function<OT_VECTEUR_4DD, OT_VECTEUR_4DD, bool>
414     {
415     bool operator() ( OT_VECTEUR_4DD v1, OT_VECTEUR_4DD v2)
416     {
417     if (v1[0]!=v2[0]) return v1[0]<v2[0] ;
418     if (v1[1]!=v2[1]) return v1[1]<v2[1] ;
419     if (v1[2]!=v2[2]) return v1[2]<v2[2] ;
420     if (v1[3]!=v2[3]) return v1[3]<v2[3] ;
421     return 0;
422    
423     }
424     ;
425     };
426    
427     struct lessOT_VECTEUR_3DD : binary_function<OT_VECTEUR_3DD, OT_VECTEUR_3DD, bool>
428     {
429     bool operator() ( OT_VECTEUR_3DD v1, OT_VECTEUR_3DD v2)
430     {
431     if (v1[0]!=v2[0]) return v1[0]<v2[0] ;
432     if (v1[1]!=v2[1]) return v1[1]<v2[1] ;
433     if (v1[2]!=v2[2]) return v1[2]<v2[2] ;
434     return 0;
435    
436     }
437     ;
438     };
439    
440    
441     #endif