ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/outil/src/ot_mathematique.h
Revision: 926
Committed: Tue May 1 20:38:42 2018 UTC (7 years ago) by couturad
Content type: text/plain
File size: 17995 byte(s)
Log Message:
Ajout de nouvelles fonctionnalités de representation et d'analyse des VES
*Modification du CMakeLists.txt de microstructure

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 couturad 919 #include <map>
39 francois 283 #include <vector>
40    
41    
42 couturad 919 class DLLPORTOUTIL OT_HISTOGRAMME
43     {
44     public:
45 couturad 926 OT_HISTOGRAMME(void);
46 couturad 919 OT_HISTOGRAMME(double largeur_colonne);
47 couturad 926 OT_HISTOGRAMME(OT_HISTOGRAMME &mdd);
48 couturad 919 ~OT_HISTOGRAMME(void);
49 couturad 926 void fixe_largeur_colonne(double largeur_colonne);
50     double get_largeur_colonne(void);
51 couturad 919 void ajouter_valeur(double x,double val);
52     void ajouter_valeur(long i,double val);
53 couturad 926 double get_valeur(double x);
54     int get_premiere_valeur(std::map<long,double>::iterator &it,double &valeur);
55     int get_suivante_valeur(std::map<long,double>::iterator &it,double &valeur);
56     int get_premiere_valeur(std::map<long,double>::iterator &it,double &valeur,double &borne_min,double &borne_max);
57     int get_suivante_valeur(std::map<long,double>::iterator &it,double &valeur,double &borne_min,double &borne_max);
58     int get_premiere_valeur(std::map<long,double>::iterator &it,double &valeur,long &i);
59     int get_suivante_valeur(std::map<long,double>::iterator &it,double &valeur,long &i);
60 couturad 919 long get_nb_colonne(void);
61     double get_x_min(void);
62     double get_x_max(void);
63 couturad 926 OT_HISTOGRAMME& operator=(OT_HISTOGRAMME& mdd);
64     void enregistrer_bin(std::ofstream& ofstr);
65     void ouvrir_bin(std::ifstream& ifstr);
66     void exporter(std::ofstream& ofstrm);
67 couturad 919 protected:
68     bool m_init;
69     long m_i_min;
70     long m_i_max;
71     double m_largeur_colonne;
72 couturad 926 std::map<long,double,std::less<long>> m_map_colonne;
73 couturad 919 };
74    
75 couturad 906 class DLLPORTOUTIL OT_QUATERNION
76     {
77     public:
78     OT_QUATERNION(void);
79     OT_QUATERNION(double x,double y,double z,double w);
80     OT_QUATERNION(OT_QUATERNION &mdd);
81     double get_x(void);
82     void change_x(double x);
83     double get_y(void);
84     void change_y(double y);
85     double get_z(void);
86     void change_z(double z);
87     double get_w(void);
88     void change_w(double w);
89    
90     OT_QUATERNION& operator=(OT_QUATERNION& mdd);
91    
92     protected:
93     double valeur[4];
94     };
95 francois 283
96    
97    
98     class DLLPORTOUTIL OT_VECTEUR_3D
99     {
100     public :
101     // construction
102     OT_VECTEUR_3D(double x,double y,double z);
103     OT_VECTEUR_3D(double *xyz);
104     OT_VECTEUR_3D(double *xyz1,double *xyz2);
105     OT_VECTEUR_3D(void);
106     OT_VECTEUR_3D(const OT_VECTEUR_3D& mdd);
107     OT_VECTEUR_3D unite(int i);
108     // stream string output
109     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
110    
111     // comparison
112     bool operator== (const OT_VECTEUR_3D& mdd) const;
113     bool operator!= (const OT_VECTEUR_3D& mdd) const;
114     bool operator< (const OT_VECTEUR_3D& mdd) const;
115     bool operator<= (const OT_VECTEUR_3D& mdd) const;
116     bool operator> (const OT_VECTEUR_3D& mdd) const;
117     bool operator>= (const OT_VECTEUR_3D& mdd) const;
118     int compare_valeur (const OT_VECTEUR_3D& mdd) const;
119    
120     // coordinate access
121     virtual double get_x(void) const ;
122     virtual double get_y(void) const ;
123     virtual double get_z(void) const ;
124     virtual void change_x(double x);
125     virtual void change_y(double y);
126     virtual void change_z(double z);
127     virtual double* get_xyz(void);
128    
129     operator const double* () const;
130     operator double* ();
131     double operator[] (int i) const;
132     double& operator[] (int i);
133     double operator() (int i) const;
134     double & operator() (int i);
135    
136     // arithmetic operations
137     friend OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
138     friend OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
139     friend double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
140     friend OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
141     friend OT_VECTEUR_3D operator*(const class OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
142     friend OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
143     friend OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
144     friend OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
145    
146     // arithmetic updates
147     OT_VECTEUR_3D& operator+= (const OT_VECTEUR_3D& rkV);
148     OT_VECTEUR_3D& operator-= (const OT_VECTEUR_3D& rkV);
149     OT_VECTEUR_3D& operator*= (double fScalar);
150     OT_VECTEUR_3D& operator/= (double fScalar);
151    
152     // vector operations
153     virtual double get_longueur(void) const ;
154     virtual double get_longueur2(void) const ;
155     virtual void norme(void);
156     OT_VECTEUR_3D gram_shmidt(const OT_VECTEUR_3D& vint);
157     virtual double diff(void);
158    
159    
160     private:
161     double valeur[3];
162     };
163    
164     class DLLPORTOUTIL OT_MATRICE_3D
165     {
166     public:
167     OT_MATRICE_3D(OT_VECTEUR_3D& v1,OT_VECTEUR_3D& v2,OT_VECTEUR_3D& v3);
168     OT_MATRICE_3D(void);
169     OT_MATRICE_3D(double* t);
170     OT_MATRICE_3D(const OT_MATRICE_3D& mdd);
171    
172     // stream string output
173     friend std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
174    
175     // access to matrix elements
176     double operator() (int iLigne, int iCol) const;
177     double & operator() (int iLigne, int iCol);
178     double valeur(int iLigne, int iCol) const;
179     double & valeur(int iLigne, int iCol);
180     OT_VECTEUR_3D& get_vecteur1(void);
181     OT_VECTEUR_3D& get_vecteur2(void);
182     OT_VECTEUR_3D& get_vecteur3(void);
183     void change_vecteur1(OT_VECTEUR_3D v);
184     void change_vecteur2(OT_VECTEUR_3D v);
185     void change_vecteur3(OT_VECTEUR_3D v);
186     OT_VECTEUR_3D & operator [](int i);
187     // return inverse matrix
188     OT_MATRICE_3D inverse() const;
189     // assignements methods
190     void identite(void);
191     double get_determinant();
192     void transpose(OT_MATRICE_3D& res) const;
193     OT_MATRICE_3D transpose() const;
194     friend OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
195    
196     private:
197     OT_VECTEUR_3D vec[3]; // attention ! vecteurs colonne
198     friend OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
199     };
200    
201     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_MATRICE_3D & __mat);
202     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3D & __vec);
203     DLLPORTOUTIL OT_VECTEUR_3D operator / (const OT_VECTEUR_3D& mdd1, double a);
204     DLLPORTOUTIL OT_VECTEUR_3D operator - (const OT_VECTEUR_3D& mdd1);
205     DLLPORTOUTIL double operator*(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
206     DLLPORTOUTIL OT_VECTEUR_3D operator&(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
207     DLLPORTOUTIL OT_VECTEUR_3D operator*(const OT_MATRICE_3D& mdd1,const OT_VECTEUR_3D& mdd2);
208     DLLPORTOUTIL OT_VECTEUR_3D operator+(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
209     DLLPORTOUTIL OT_VECTEUR_3D operator-(const OT_VECTEUR_3D& mdd1,const OT_VECTEUR_3D& mdd2);
210     DLLPORTOUTIL OT_MATRICE_3D operator*(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
211     DLLPORTOUTIL OT_MATRICE_3D operator+(const OT_MATRICE_3D& mdd1,const OT_MATRICE_3D& mdd2);
212     DLLPORTOUTIL OT_VECTEUR_3D operator*(double mdd1,const OT_VECTEUR_3D& mdd2);
213    
214    
215    
216     #define ot_vecteur_4d
217     #ifdef ot_vecteur_4d
218     class DLLPORTOUTIL OT_VECTEUR_4D
219     {
220     public :
221     //construction
222     OT_VECTEUR_4D(double x,double y,double z,double w);
223     OT_VECTEUR_4D(double *xyzw);
224     OT_VECTEUR_4D(void) {};
225     OT_VECTEUR_4D(const OT_VECTEUR_4D& mdd);
226     OT_VECTEUR_4D & operator= (double);
227    
228     // stream string output
229     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
230    
231     // comparison
232     bool operator== (const OT_VECTEUR_4D& mdd) const;
233     bool operator!= (const OT_VECTEUR_4D& mdd) const;
234     bool operator< (const OT_VECTEUR_4D& mdd) const;
235     bool operator<= (const OT_VECTEUR_4D& mdd) const;
236     bool operator> (const OT_VECTEUR_4D& mdd) const;
237     bool operator>= (const OT_VECTEUR_4D& mdd) const;
238 francois 743 // int compare_valeur (const OT_VECTEUR_4D& mdd) const;
239 francois 283
240     // coordinate access
241     virtual double get_x(void) const ;
242     virtual double get_y(void) const ;
243     virtual double get_z(void) const ;
244     virtual double get_w(void) const ;
245     virtual double & x(void);
246     virtual double & y(void);
247     virtual double & z(void);
248     virtual double & w(void);
249     virtual void change_x(double x);
250     virtual void change_y(double y);
251     virtual void change_z(double z);
252     virtual void change_w(double w);
253     virtual double* get_xyzw(void);
254     operator const double* () const;
255     operator double* ();
256     double operator[] (int i) const;
257     double& operator[] (int i);
258     double operator() (int i) const;
259     double & operator() (int i);
260    
261     // arithmetic operations
262     OT_VECTEUR_4D operator+ (const OT_VECTEUR_4D& rkV);
263     OT_VECTEUR_4D operator- (const OT_VECTEUR_4D& rkV);
264     double operator* (const OT_VECTEUR_4D & a);
265    
266     // arithmetic updates
267     OT_VECTEUR_4D& operator+= (const OT_VECTEUR_4D& rkV);
268     OT_VECTEUR_4D& operator-= (const OT_VECTEUR_4D& rkV);
269     OT_VECTEUR_4D& operator*= (double fScalar);
270     OT_VECTEUR_4D& operator/= (double fScalar);
271    
272     private:
273     double valeur[4];
274     };
275    
276     DLLPORTOUTIL OT_VECTEUR_4D operator* (const OT_VECTEUR_4D & rkV, const double a);
277     DLLPORTOUTIL OT_VECTEUR_4D operator* (const double a, const OT_VECTEUR_4D & rkV);
278     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const OT_VECTEUR_4D & rkV, const double a);
279     DLLPORTOUTIL OT_VECTEUR_4D operator/ (const double a, const OT_VECTEUR_4D & rkV);
280     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4D & __vec);
281     #endif // ot_vecteur_4d
282    
283    
284    
285     class DLLPORTOUTIL OT_VECTEUR_4DD
286     {
287     public :
288     //construction
289     OT_VECTEUR_4DD(double2 x,double2 y,double2 z,double2 w);
290     OT_VECTEUR_4DD(double2 *xyzw);
291     OT_VECTEUR_4DD() {};
292     OT_VECTEUR_4DD(const OT_VECTEUR_4DD& mdd);
293     //OT_VECTEUR_4DD & operator= (double2);
294     OT_VECTEUR_4DD & operator= (const OT_VECTEUR_4DD&);
295    
296     // stream string output
297     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
298    
299     // comparison
300     bool operator== (const OT_VECTEUR_4DD& mdd) const;
301     bool operator!= (const OT_VECTEUR_4DD& mdd) const;
302     bool operator< (const OT_VECTEUR_4DD& mdd) const;
303     bool operator<= (const OT_VECTEUR_4DD& mdd) const;
304     bool operator> (const OT_VECTEUR_4DD& mdd) const;
305     bool operator>= (const OT_VECTEUR_4DD& mdd) const;
306     int compare_valeur (const OT_VECTEUR_4DD& mdd) const;
307    
308     // coordinate access
309     virtual double2 get_x(void) const ;
310     virtual double2 get_y(void) const ;
311     virtual double2 get_z(void) const ;
312     virtual double2 get_w(void) const ;
313     virtual double2 & x(void);
314     virtual double2 & y(void);
315     virtual double2 & z(void);
316     virtual double2 & w(void);
317     virtual void change_x(double2 x);
318     virtual void change_y(double2 y);
319     virtual void change_z(double2 z);
320     virtual void change_w(double2 w);
321     virtual double2* get_xyzw(void);
322     double2 norme();
323     OT_VECTEUR_4DD vecteur_norme() ;
324 francois 363 OT_VECTEUR_4DD vecteur_norme_3d() ;
325 francois 283 operator const double2* () const;
326     operator double2* ();
327     double2 operator[] (int i) const;
328     double2& operator[] (int i);
329     double2 operator() (int i) const;
330     double2 & operator() (int i);
331    
332     // arithmetic operations
333     OT_VECTEUR_4DD operator+ (const OT_VECTEUR_4DD& rkV);
334     OT_VECTEUR_4DD operator- (const OT_VECTEUR_4DD& rkV);
335     double2 operator* (const OT_VECTEUR_4DD & a);
336    
337     // arithmetic updates
338     OT_VECTEUR_4DD& operator+= (const OT_VECTEUR_4DD& rkV);
339     OT_VECTEUR_4DD& operator-= (const OT_VECTEUR_4DD& rkV);
340     OT_VECTEUR_4DD& operator*= (double2 fScalar);
341     OT_VECTEUR_4DD& operator/= (double2 fScalar);
342     OT_VECTEUR_4DD operator^(const OT_VECTEUR_4DD& v2);
343 francois 743 bool est_nul(void);
344     bool est_nul_3d(void);
345 francois 283
346    
347     private:
348     double2 valeur[4];
349     };
350    
351    
352    
353     class DLLPORTOUTIL OT_VECTEUR_3DD
354     {
355     public :
356     //construction
357     OT_VECTEUR_3DD(double2 x,double2 y,double2 z);
358 francois 550 OT_VECTEUR_3DD(double2 *xyzw);
359     OT_VECTEUR_3DD(double2 *xyz1,double2 *xyz2);
360 francois 283 OT_VECTEUR_3DD() {};
361     OT_VECTEUR_3DD(const OT_VECTEUR_3DD& mdd);
362     OT_VECTEUR_3DD & operator= (const OT_VECTEUR_3DD&);
363    
364     // stream string output
365     friend std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_3DD & __vec);
366    
367     // comparison
368     bool operator== (const OT_VECTEUR_3DD& mdd) const;
369     bool operator!= (const OT_VECTEUR_3DD& mdd) const;
370     bool operator< (const OT_VECTEUR_3DD& mdd) const;
371     bool operator<= (const OT_VECTEUR_3DD& mdd) const;
372     bool operator> (const OT_VECTEUR_3DD& mdd) const;
373     bool operator>= (const OT_VECTEUR_3DD& mdd) const;
374     int compare_valeur (const OT_VECTEUR_3DD& mdd) const;
375    
376     // coordinate access
377     virtual double2 get_x(void) const ;
378     virtual double2 get_y(void) const ;
379     virtual double2 get_z(void) const ;
380     virtual double2 & x(void);
381     virtual double2 & y(void);
382     virtual double2 & z(void);
383     virtual void change_x(double2 x);
384     virtual void change_y(double2 y);
385     virtual void change_z(double2 z);
386     virtual double2* get_xyz(void);
387     double2 norme();
388     OT_VECTEUR_3DD vecteur_norme() ;
389 francois 550 virtual double2 get_longueur(void) ;
390     virtual double2 get_longueur2(void) ;
391 francois 283 operator const double2* () const;
392     operator double2* ();
393     double2 operator[] (int i) const;
394     double2& operator[] (int i);
395     double2 operator() (int i) const;
396     double2 & operator() (int i);
397    
398     // arithmetic operations
399     OT_VECTEUR_3DD operator+ (const OT_VECTEUR_3DD& rkV);
400     OT_VECTEUR_3DD operator- (const OT_VECTEUR_3DD& rkV);
401     double2 operator* (const OT_VECTEUR_3DD & a);
402    
403     // arithmetic updates
404     OT_VECTEUR_3DD& operator+= (const OT_VECTEUR_3DD& rkV);
405     OT_VECTEUR_3DD& operator-= (const OT_VECTEUR_3DD& rkV);
406     OT_VECTEUR_3DD& operator*= (double2 fScalar);
407     OT_VECTEUR_3DD& operator/= (double2 fScalar);
408     OT_VECTEUR_3DD operator&(const OT_VECTEUR_3DD& v2);
409    
410    
411     private:
412     double2 valeur[3];
413     };
414    
415    
416    
417    
418    
419    
420     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const OT_VECTEUR_4DD & rkV, const double2 a);
421     DLLPORTOUTIL OT_VECTEUR_4DD operator* (const double2 a, const OT_VECTEUR_4DD & rkV);
422     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const OT_VECTEUR_4DD & rkV, const double2 a);
423     DLLPORTOUTIL OT_VECTEUR_4DD operator/ (const double2 a, const OT_VECTEUR_4DD & rkV);
424     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
425     DLLPORTOUTIL OT_VECTEUR_3DD operator* (const OT_VECTEUR_3DD & rkV, const double2 a);
426     DLLPORTOUTIL OT_VECTEUR_3DD operator* (const double2 a, const OT_VECTEUR_3DD & rkV);
427     DLLPORTOUTIL OT_VECTEUR_3DD operator/ (const OT_VECTEUR_3DD & rkV, const double2 a);
428     DLLPORTOUTIL OT_VECTEUR_3DD operator/ (const double2 a, const OT_VECTEUR_3DD & rkV);
429     DLLPORTOUTIL std::ostream & operator << ( std::ostream & __os, const OT_VECTEUR_4DD & __vec);
430    
431    
432    
433    
434    
435    
436     class DLLPORTOUTIL OPERATEUR
437     {
438     public:
439 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};
440    
441 francois 283 static int egal(double a,double b,double eps);
442 couturad 906 static int egal(double *xyz1,double *xyz2,double eps);
443 francois 283 static double qualite_triangle(double* noeud1,double* noeud2,double* noeud3);
444     static double qualite_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
445     static void doubleto2int(double val,int& val1,int& val2);
446 francois 418 static int estdansletetra(double *xyz1,double *xyz2,double *xyz3,double *xyz4,double x,double y, double z);
447     static int estdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z);
448     static int projeteestdansletriangle(double *xyz1,double *xyz2,double *xyz3,double x,double y, double z);
449    
450     static int compare_etat_tetra(int etat,int valeur);
451     static int compare_etat_triangle(int etat,int valeur);
452 couturad 926
453     static double taille_tetra(double* noeud1,double* noeud2,double* noeud3,double *noeud4);
454     static double taille_triangle(double* noeud1,double* noeud2,double* noeud3);
455 francois 283 };
456    
457    
458     template <int N=4>
459     class DLLPORTOUTIL DOUBLEN
460     {
461     public:
462     DOUBLEN();
463     DOUBLEN(double *v);
464     DOUBLEN(DOUBLEN& mdd);
465     DOUBLEN(const DOUBLEN& mdd);
466     ~DOUBLEN();
467     double get_valeur(int num);
468     void change_valeur(int num,double val);
469     DOUBLEN<N> & operator=(DOUBLEN<N> & mdd);
470     DOUBLEN<N> & operator=(const DOUBLEN<N> & mdd);
471     private:
472     double tab[N];
473     };
474    
475     struct lessOT_VECTEUR_4DD : binary_function<OT_VECTEUR_4DD, OT_VECTEUR_4DD, bool>
476     {
477     bool operator() ( OT_VECTEUR_4DD v1, OT_VECTEUR_4DD v2)
478     {
479     if (v1[0]!=v2[0]) return v1[0]<v2[0] ;
480     if (v1[1]!=v2[1]) return v1[1]<v2[1] ;
481     if (v1[2]!=v2[2]) return v1[2]<v2[2] ;
482     if (v1[3]!=v2[3]) return v1[3]<v2[3] ;
483     return 0;
484    
485     }
486     ;
487     };
488    
489     struct lessOT_VECTEUR_3DD : binary_function<OT_VECTEUR_3DD, OT_VECTEUR_3DD, bool>
490     {
491     bool operator() ( OT_VECTEUR_3DD v1, OT_VECTEUR_3DD v2)
492     {
493     if (v1[0]!=v2[0]) return v1[0]<v2[0] ;
494     if (v1[1]!=v2[1]) return v1[1]<v2[1] ;
495     if (v1[2]!=v2[2]) return v1[2]<v2[2] ;
496     return 0;
497    
498     }
499     ;
500     };
501    
502    
503     #endif