ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.h
Revision: 5
Committed: Tue Jun 12 20:26:34 2007 UTC (17 years, 11 months ago)
Content type: text/plain
Original Path: magic/lib/outil/outil/src/ot_mathematique.h
File size: 9153 byte(s)
Log Message:

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
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    
37     #include <iostream>
38    
39     class DLLPORTOUTIL OT_VECTEUR_3D
40     {
41     public :
42     // construction
43     OT_VECTEUR_3D(double x,double y,double z);
44     OT_VECTEUR_3D(double *xyz);
45     OT_VECTEUR_3D(double *xyz1,double *xyz2);
46     OT_VECTEUR_3D(void){};
47     OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd);
48     OT_VECTEUR_3D(OT_VECTEUR_3D& mdd);
49    
50     // stream string output
51     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
52    
53     // comparison
54     bool operator== (const OT_VECTEUR_3D& mdd) const;
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     int compare_valeur (const OT_VECTEUR_3D& mdd) const;
61    
62     // coordinate access
63     virtual double get_x(void) const ;
64     virtual double get_y(void) const ;
65     virtual double get_z(void) const ;
66     virtual void change_x(double x);
67     virtual void change_y(double y);
68     virtual void change_z(double z);
69     virtual double* get_xyz(void);
70     operator const double* () const;
71     operator double* ();
72     double operator[] (int i) const;
73     double& operator[] (int i);
74     double operator() (int i) const;
75     double & operator() (int i);
76    
77     // arithmetic operations
78     friend OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
79     friend OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
80     friend double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
81     friend OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
82     friend OT_VECTEUR_3D operator*(const class OT_MATRICE_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 OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
85     friend OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
86    
87     // arithmetic updates
88     OT_VECTEUR_3D& operator+= (const OT_VECTEUR_3D& rkV);
89     OT_VECTEUR_3D& operator-= (const OT_VECTEUR_3D& rkV);
90     OT_VECTEUR_3D& operator*= (double fScalar);
91     OT_VECTEUR_3D& operator/= (double fScalar);
92    
93     // vector operations
94     virtual double get_longueur(void) const ;
95     virtual double get_longueur2(void) const ;
96     virtual void norme(void);
97     virtual double diff(void);
98    
99    
100     private:
101     double valeur[3];
102     };
103    
104     class DLLPORTOUTIL OT_MATRICE_3D
105     {
106     public:
107     OT_MATRICE_3D(OT_VECTEUR_3D& v1,OT_VECTEUR_3D& v2,OT_VECTEUR_3D& v3);
108     OT_MATRICE_3D(void){};
109     OT_MATRICE_3D(const OT_MATRICE_3D& mdd);
110    
111     // stream string output
112     friend std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
113    
114     // access to matrix elements
115     double operator() (int iLigne, int iCol) const;
116     double & operator() (int iLigne, int iCol);
117     double valeur(int iLigne, int iCol) const;
118     double & valeur(int iLigne, int iCol);
119     OT_VECTEUR_3D& get_vecteur1(void);
120     OT_VECTEUR_3D& get_vecteur2(void);
121     OT_VECTEUR_3D& get_vecteur3(void);
122     void change_vecteur1(OT_VECTEUR_3D& v);
123     void change_vecteur2(OT_VECTEUR_3D& v);
124     void change_vecteur3(OT_VECTEUR_3D& v);
125    
126     // assignements methods
127     void identite(void);
128     double get_determinant();
129     void transpose(OT_MATRICE_3D& res) const;
130    
131     // return inverse matrix
132     OT_MATRICE_3D inverse() const;
133    
134     private:
135     OT_VECTEUR_3D vec[3]; // attention ! vecteurs colonne
136     friend OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
137     };
138    
139     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
140     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
141     DLLPORTOUTIL OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
142     DLLPORTOUTIL OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
143     DLLPORTOUTIL double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
144     DLLPORTOUTIL OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
145     DLLPORTOUTIL OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
146     DLLPORTOUTIL OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
147     DLLPORTOUTIL OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
148     DLLPORTOUTIL OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
149     DLLPORTOUTIL OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
150    
151    
152    
153     #define ot_vecteur_4d
154     #ifdef ot_vecteur_4d
155     class DLLPORTOUTIL OT_VECTEUR_4D
156     {
157     public :
158     // construction
159     OT_VECTEUR_4D(double x,double y,double z,double w);
160     OT_VECTEUR_4D(double *xyzw);
161     OT_VECTEUR_4D(void){};
162     OT_VECTEUR_4D(const OT_VECTEUR_4D& mdd);
163     OT_VECTEUR_4D & operator= (double);
164    
165     // stream string output
166     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
167    
168     // comparison
169     bool operator== (const OT_VECTEUR_4D& mdd) const;
170     bool operator!= (const OT_VECTEUR_4D& mdd) const;
171     bool operator< (const OT_VECTEUR_4D& mdd) const;
172     bool operator<= (const OT_VECTEUR_4D& mdd) const;
173     bool operator> (const OT_VECTEUR_4D& mdd) const;
174     bool operator>= (const OT_VECTEUR_4D& mdd) const;
175     int compare_valeur (const OT_VECTEUR_4D& mdd) const;
176    
177     // coordinate access
178     virtual double get_x(void) const ;
179     virtual double get_y(void) const ;
180     virtual double get_z(void) const ;
181     virtual double get_w(void) const ;
182     virtual double & x(void);
183     virtual double & y(void);
184     virtual double & z(void);
185     virtual double & w(void);
186     virtual void change_x(double x);
187     virtual void change_y(double y);
188     virtual void change_z(double z);
189     virtual void change_w(double w);
190     virtual double* get_xyzw(void);
191     operator const double* () const;
192     operator double* ();
193     double operator[] (int i) const;
194     double& operator[] (int i);
195     double operator() (int i) const;
196     double & operator() (int i);
197    
198     // arithmetic operations
199     OT_VECTEUR_4D operator+ (const OT_VECTEUR_4D& rkV);
200     OT_VECTEUR_4D operator- (const OT_VECTEUR_4D& rkV);
201     double operator* (const OT_VECTEUR_4D & a);
202    
203     // arithmetic updates
204     OT_VECTEUR_4D& operator+= (const OT_VECTEUR_4D& rkV);
205     OT_VECTEUR_4D& operator-= (const OT_VECTEUR_4D& rkV);
206     OT_VECTEUR_4D& operator*= (double fScalar);
207     OT_VECTEUR_4D& operator/= (double fScalar);
208    
209     private:
210     double valeur[4];
211     };
212    
213     DLLPORTOUTIL OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a);
214     DLLPORTOUTIL OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV);
215     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a);
216     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV);
217     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
218     #endif // ot_vecteur_4d
219    
220    
221     class DLLPORTOUTIL OPERATEUR
222     {
223     public:
224     static int egal(double a,double b,double eps);
225     static double qualite_triangle(double* noeud1,double* noeud2,double* noeud3);
226     static double qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
227     static void doubleto2int(double val,int& val1,int& val2);
228     };
229    
230    
231     template <int N=4>
232     class DLLPORTOUTIL DOUBLEN
233     {
234     public:
235     DOUBLEN();
236     DOUBLEN(double *v);
237     DOUBLEN(DOUBLEN& mdd);
238     DOUBLEN(const DOUBLEN& mdd);
239     ~DOUBLEN();
240     double get_valeur(int num);
241     void change_valeur(int num,double val);
242     DOUBLEN<N> & operator=(DOUBLEN<N> & mdd);
243     DOUBLEN<N> & operator=(const DOUBLEN<N> & mdd);
244     private:
245     double tab[N];
246     };
247    
248    
249     #endif