ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.h
Revision: 27
Committed: Thu Jul 5 15:26:40 2007 UTC (17 years, 10 months ago) by foucault
Content type: text/plain
Original Path: magic/lib/outil/outil/src/ot_mathematique.h
File size: 9017 byte(s)
Log Message:

File Contents

# User Rev Content
1 foucault 27 //------------------------------------------------------------
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     OT_VECTEUR_3D & operator [](int i);
126     // return inverse matrix
127     OT_MATRICE_3D inverse() const;
128     // assignements methods
129     void identite(void);
130     double get_determinant();
131     void transpose(OT_MATRICE_3D& res) const;
132    
133     OT_MATRICE_3D VecteursPropres(OT_VECTEUR_3D& val_propre,double Eps,int ItMax);
134    
135    
136     private:
137     OT_VECTEUR_3D vec[3]; // attention ! vecteurs colonne
138     friend OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
139     };
140    
141     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
142     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
143     DLLPORTOUTIL OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
144     DLLPORTOUTIL OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
145     DLLPORTOUTIL double operator*(const OT_VECTEUR_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_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
148     DLLPORTOUTIL OT_VECTEUR_3D 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_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
151     DLLPORTOUTIL OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
152    
153    
154    
155     #define ot_vecteur_4d
156     #ifdef ot_vecteur_4d
157     class DLLPORTOUTIL OT_VECTEUR_4D
158     {
159     public :
160     // construction
161     OT_VECTEUR_4D(double x,double y,double z,double w);
162     OT_VECTEUR_4D(double *xyzw);
163     OT_VECTEUR_4D(void){};
164     OT_VECTEUR_4D(const OT_VECTEUR_4D& mdd);
165     OT_VECTEUR_4D & operator= (double);
166    
167     // stream string output
168     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
169    
170     // comparison
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     bool operator> (const OT_VECTEUR_4D& mdd) const;
176     bool operator>= (const OT_VECTEUR_4D& mdd) const;
177     int compare_valeur (const OT_VECTEUR_4D& mdd) const;
178    
179     // coordinate access
180     virtual double get_x(void) const ;
181     virtual double get_y(void) const ;
182     virtual double get_z(void) const ;
183     virtual double get_w(void) const ;
184     virtual double & x(void);
185     virtual double & y(void);
186     virtual double & z(void);
187     virtual double & w(void);
188     virtual void change_x(double x);
189     virtual void change_y(double y);
190     virtual void change_z(double z);
191     virtual void change_w(double w);
192     virtual double* get_xyzw(void);
193     operator const double* () const;
194     operator double* ();
195     double operator[] (int i) const;
196     double& operator[] (int i);
197     double operator() (int i) const;
198     double & operator() (int i);
199    
200     // arithmetic operations
201     OT_VECTEUR_4D operator+ (const OT_VECTEUR_4D& rkV);
202     OT_VECTEUR_4D operator- (const OT_VECTEUR_4D& rkV);
203     double operator* (const OT_VECTEUR_4D & a);
204    
205     // arithmetic updates
206     OT_VECTEUR_4D& operator+= (const OT_VECTEUR_4D& rkV);
207     OT_VECTEUR_4D& operator-= (const OT_VECTEUR_4D& rkV);
208     OT_VECTEUR_4D& operator*= (double fScalar);
209     OT_VECTEUR_4D& operator/= (double fScalar);
210    
211     private:
212     double valeur[4];
213     };
214    
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 OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a);
218     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV);
219     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
220     #endif // ot_vecteur_4d
221    
222    
223     class DLLPORTOUTIL OPERATEUR
224     {
225     public:
226     static int egal(double a,double b,double eps);
227     static double qualite_triangle(double* noeud1,double* noeud2,double* noeud3);
228     static double qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
229     static void doubleto2int(double val,int& val1,int& val2);
230     };
231    
232    
233     template <int N=4>
234     class DLLPORTOUTIL DOUBLEN
235     {
236     public:
237     DOUBLEN();
238     DOUBLEN(double *v);
239     DOUBLEN(DOUBLEN& mdd);
240     DOUBLEN(const DOUBLEN& mdd);
241     ~DOUBLEN();
242     double get_valeur(int num);
243     void change_valeur(int num,double val);
244     DOUBLEN<N> & operator=(DOUBLEN<N> & mdd);
245     DOUBLEN<N> & operator=(const DOUBLEN<N> & mdd);
246     private:
247     double tab[N];
248     };
249    
250    
251     #endif