ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.h
Revision: 151
Committed: Tue Sep 9 18:51:20 2008 UTC (16 years, 8 months ago) by souaissa
Content type: text/plain
Original Path: magic/lib/outil/outil/src/ot_mathematique.h
File size: 12168 byte(s)
Log Message:
mise a jour des classes outils

File Contents

# User Rev Content
1 souaissa 58 //------------------------------------------------------------
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 souaissa 69 #include "ot_doubleprecision.h"
37 souaissa 58 #include <iostream>
38     #include <vector>
39    
40     class DLLPORTOUTIL OT_VECTEUR_3D
41     {
42     public :
43     // construction
44     OT_VECTEUR_3D(double x,double y,double z);
45     OT_VECTEUR_3D(double *xyz);
46     OT_VECTEUR_3D(double *xyz1,double *xyz2);
47     OT_VECTEUR_3D(void);
48     OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd);
49     OT_VECTEUR_3D(OT_VECTEUR_3D& mdd);
50     OT_VECTEUR_3D unite(int i);
51     // stream string output
52     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
53    
54     // comparison
55     bool operator== (const OT_VECTEUR_3D& mdd) const;
56     bool operator!= (const OT_VECTEUR_3D& mdd) const;
57     bool operator< (const OT_VECTEUR_3D& mdd) const;
58     bool operator<= (const OT_VECTEUR_3D& mdd) const;
59     bool operator> (const OT_VECTEUR_3D& mdd) const;
60     bool operator>= (const OT_VECTEUR_3D& mdd) const;
61     int compare_valeur (const OT_VECTEUR_3D& mdd) const;
62    
63     // coordinate access
64     virtual double get_x(void) const ;
65     virtual double get_y(void) const ;
66     virtual double get_z(void) const ;
67     virtual void change_x(double x);
68     virtual void change_y(double y);
69     virtual void change_z(double z);
70     virtual double* get_xyz(void);
71    
72     operator const double* () const;
73     operator double* ();
74     double operator[] (int i) const;
75     double& operator[] (int i);
76     double operator() (int i) const;
77     double & operator() (int i);
78    
79     // arithmetic operations
80     friend OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
81     friend OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
82     friend double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
83     friend OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
84     friend OT_VECTEUR_3D operator*(const class OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
85     friend OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
86     friend OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
87     friend OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
88    
89     // arithmetic updates
90     OT_VECTEUR_3D& operator+= (const OT_VECTEUR_3D& rkV);
91     OT_VECTEUR_3D& operator-= (const OT_VECTEUR_3D& rkV);
92     OT_VECTEUR_3D& operator*= (double fScalar);
93     OT_VECTEUR_3D& operator/= (double fScalar);
94    
95     // vector operations
96     virtual double get_longueur(void) const ;
97     virtual double get_longueur2(void) const ;
98     virtual void norme(void);
99     OT_VECTEUR_3D gram_shmidt(const OT_VECTEUR_3D& vint);
100     virtual double diff(void);
101    
102    
103     private:
104     double valeur[3];
105     };
106    
107     class DLLPORTOUTIL OT_MATRICE_3D
108     {
109     public:
110     OT_MATRICE_3D(OT_VECTEUR_3D& v1,OT_VECTEUR_3D& v2,OT_VECTEUR_3D& v3);
111 souaissa 151 OT_MATRICE_3D(void);
112 souaissa 58 OT_MATRICE_3D(double* t);
113     OT_MATRICE_3D(const OT_MATRICE_3D& mdd);
114    
115     // stream string output
116     friend std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
117    
118     // access to matrix elements
119     double operator() (int iLigne, int iCol) const;
120     double & operator() (int iLigne, int iCol);
121     double valeur(int iLigne, int iCol) const;
122     double & valeur(int iLigne, int iCol);
123     OT_VECTEUR_3D& get_vecteur1(void);
124     OT_VECTEUR_3D& get_vecteur2(void);
125     OT_VECTEUR_3D& get_vecteur3(void);
126     void change_vecteur1(OT_VECTEUR_3D v);
127     void change_vecteur2(OT_VECTEUR_3D v);
128     void change_vecteur3(OT_VECTEUR_3D v);
129     OT_VECTEUR_3D & operator [](int i);
130     // return inverse matrix
131     OT_MATRICE_3D inverse() const;
132     // assignements methods
133     void identite(void);
134     double get_determinant();
135     void transpose(OT_MATRICE_3D& res) const;
136 souaissa 151 OT_MATRICE_3D transpose() const;
137 souaissa 58 friend OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
138    
139     private:
140     OT_VECTEUR_3D vec[3]; // attention ! vecteurs colonne
141     friend OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
142     };
143    
144     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
145     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
146     DLLPORTOUTIL OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
147     DLLPORTOUTIL OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
148     DLLPORTOUTIL double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
149     DLLPORTOUTIL OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
150     DLLPORTOUTIL OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
151     DLLPORTOUTIL OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
152     DLLPORTOUTIL OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
153     DLLPORTOUTIL OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
154     DLLPORTOUTIL OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
155     DLLPORTOUTIL OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
156    
157    
158    
159     #define ot_vecteur_4d
160     #ifdef ot_vecteur_4d
161     class DLLPORTOUTIL OT_VECTEUR_4D
162     {
163     public :
164     //construction
165     OT_VECTEUR_4D(double x,double y,double z,double w);
166     OT_VECTEUR_4D(double *xyzw);
167     OT_VECTEUR_4D(void){};
168     OT_VECTEUR_4D(const OT_VECTEUR_4D& mdd);
169     OT_VECTEUR_4D & operator= (double);
170    
171     // stream string output
172     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
173    
174     // comparison
175     bool operator== (const OT_VECTEUR_4D& mdd) const;
176     bool operator!= (const OT_VECTEUR_4D& mdd) const;
177     bool operator< (const OT_VECTEUR_4D& mdd) const;
178     bool operator<= (const OT_VECTEUR_4D& mdd) const;
179     bool operator> (const OT_VECTEUR_4D& mdd) const;
180     bool operator>= (const OT_VECTEUR_4D& mdd) const;
181     int compare_valeur (const OT_VECTEUR_4D& mdd) const;
182    
183     // coordinate access
184     virtual double get_x(void) const ;
185     virtual double get_y(void) const ;
186     virtual double get_z(void) const ;
187     virtual double get_w(void) const ;
188     virtual double & x(void);
189     virtual double & y(void);
190     virtual double & z(void);
191     virtual double & w(void);
192     virtual void change_x(double x);
193     virtual void change_y(double y);
194     virtual void change_z(double z);
195     virtual void change_w(double w);
196     virtual double* get_xyzw(void);
197     operator const double* () const;
198     operator double* ();
199     double operator[] (int i) const;
200     double& operator[] (int i);
201     double operator() (int i) const;
202     double & operator() (int i);
203    
204     // arithmetic operations
205     OT_VECTEUR_4D operator+ (const OT_VECTEUR_4D& rkV);
206     OT_VECTEUR_4D operator- (const OT_VECTEUR_4D& rkV);
207     double operator* (const OT_VECTEUR_4D & a);
208    
209     // arithmetic updates
210     OT_VECTEUR_4D& operator+= (const OT_VECTEUR_4D& rkV);
211     OT_VECTEUR_4D& operator-= (const OT_VECTEUR_4D& rkV);
212     OT_VECTEUR_4D& operator*= (double fScalar);
213     OT_VECTEUR_4D& operator/= (double fScalar);
214    
215     private:
216     double valeur[4];
217     };
218    
219     DLLPORTOUTIL OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a);
220     DLLPORTOUTIL OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV);
221     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a);
222     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV);
223     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
224     #endif // ot_vecteur_4d
225    
226    
227 souaissa 69
228     class DLLPORTOUTIL OT_VECTEUR_4DD
229     {
230     public :
231     //construction
232     OT_VECTEUR_4DD(double2 x,double2 y,double2 z,double2 w);
233     OT_VECTEUR_4DD(double2 *xyzw);
234     OT_VECTEUR_4DD(){};
235     OT_VECTEUR_4DD(const OT_VECTEUR_4DD& mdd);
236     //OT_VECTEUR_4DD & operator= (double2);
237     OT_VECTEUR_4DD & operator= (const OT_VECTEUR_4DD&);
238    
239     // stream string output
240     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
241    
242     // comparison
243     bool operator== (const OT_VECTEUR_4DD& mdd) const;
244     bool operator!= (const OT_VECTEUR_4DD& mdd) const;
245     bool operator< (const OT_VECTEUR_4DD& mdd) const;
246     bool operator<= (const OT_VECTEUR_4DD& mdd) const;
247     bool operator> (const OT_VECTEUR_4DD& mdd) const;
248     bool operator>= (const OT_VECTEUR_4DD& mdd) const;
249     int compare_valeur (const OT_VECTEUR_4DD& mdd) const;
250    
251     // coordinate access
252     virtual double2 get_x(void) const ;
253     virtual double2 get_y(void) const ;
254     virtual double2 get_z(void) const ;
255     virtual double2 get_w(void) const ;
256     virtual double2 & x(void);
257     virtual double2 & y(void);
258     virtual double2 & z(void);
259     virtual double2 & w(void);
260     virtual void change_x(double2 x);
261     virtual void change_y(double2 y);
262     virtual void change_z(double2 z);
263     virtual void change_w(double2 w);
264     virtual double2* get_xyzw(void);
265 souaissa 86 double2 norme();
266     OT_VECTEUR_4DD vecteur_norme() ;
267 souaissa 69 operator const double2* () const;
268     operator double2* ();
269     double2 operator[] (int i) const;
270     double2& operator[] (int i);
271     double2 operator() (int i) const;
272     double2 & operator() (int i);
273    
274     // arithmetic operations
275     OT_VECTEUR_4DD operator+ (const OT_VECTEUR_4DD& rkV);
276     OT_VECTEUR_4DD operator- (const OT_VECTEUR_4DD& rkV);
277     double2 operator* (const OT_VECTEUR_4DD & a);
278    
279     // arithmetic updates
280     OT_VECTEUR_4DD& operator+= (const OT_VECTEUR_4DD& rkV);
281     OT_VECTEUR_4DD& operator-= (const OT_VECTEUR_4DD& rkV);
282     OT_VECTEUR_4DD& operator*= (double2 fScalar);
283     OT_VECTEUR_4DD& operator/= (double2 fScalar);
284 souaissa 86 OT_VECTEUR_4DD operator^(const OT_VECTEUR_4DD& v2);
285 souaissa 69
286    
287     private:
288     double2 valeur[4];
289     };
290    
291     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a);
292     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV);
293     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a);
294     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV);
295     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
296    
297    
298    
299    
300    
301 souaissa 86
302 souaissa 58 class DLLPORTOUTIL OPERATEUR
303     {
304     public:
305     static int egal(double a,double b,double eps);
306     static double qualite_triangle(double* noeud1,double* noeud2,double* noeud3);
307     static double qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
308     static void doubleto2int(double val,int& val1,int& val2);
309     };
310    
311    
312     template <int N=4>
313     class DLLPORTOUTIL DOUBLEN
314     {
315     public:
316     DOUBLEN();
317     DOUBLEN(double *v);
318     DOUBLEN(DOUBLEN& mdd);
319     DOUBLEN(const DOUBLEN& mdd);
320     ~DOUBLEN();
321     double get_valeur(int num);
322     void change_valeur(int num,double val);
323     DOUBLEN<N> & operator=(DOUBLEN<N> & mdd);
324     DOUBLEN<N> & operator=(const DOUBLEN<N> & mdd);
325     private:
326     double tab[N];
327     };
328    
329    
330    
331    
332     #endif