ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur_auto/src/mailleur3d.h
Revision: 61
Committed: Fri Nov 16 16:39:29 2007 UTC (17 years, 6 months ago) by francois
Content type: text/plain
Original Path: magic/lib/mailleur/mailleur/src/mailleur3d.h
File size: 9342 byte(s)
Log Message:
Bub mailleur 3D + visualisation du front optimisée

File Contents

# User Rev Content
1 5 //------------------------------------------------------------
2     //------------------------------------------------------------
3     // MAGiC
4     // Jean Christophe Cuilli�e et Vincent FRANCOIS
5     // D�artement de G�ie M�anique - UQTR
6     //------------------------------------------------------------
7     // Le projet MAGIC est un projet de recherche du d�artement
8     // de g�ie m�anique de l'Universit�du Qu�ec �
9     // Trois Rivi�es
10     // Les librairies ne peuvent �re utilis�s sans l'accord
11     // des auteurs (contact : francois@uqtr.ca)
12     //------------------------------------------------------------
13     //------------------------------------------------------------
14     //
15     // mailleur3d.h
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24     #ifndef mailleur3dH
25     #define mailleur3dH
26    
27    
28    
29     #ifdef WINDOWS_VERSION
30     #ifdef BUILT_DLL_MAILLEUR
31     #define DLLPORTMAIL __declspec(dllexport)
32     #else
33     #define DLLPORTMAIL __declspec(dllimport)
34     #endif
35     #else
36     #define DLLPORTMAIL
37     #endif
38    
39    
40    
41     #ifdef BORLANDCPP
42     #include <map.h>
43     #else
44     #include <map>
45     #define CLK_TCK CLOCKS_PER_SEC
46     #endif
47    
48     #include <vector>
49     #include "mailleur.h"
50     #include "mg_front_3D.h"
51     #include "mg_maillage.h"
52     #include "mg_geometrie.h"
53     #include "mg_volume.h"
54     #include "fct_taille_volume.h"
55     #include "tpl_octree.h"
56    
57    
58     const unsigned int NONFORCE=159;
59     const unsigned int ATTENTE=160;
60 francois 35 const unsigned int PRIORITAIRE=160;
61 5
62     const unsigned int GENERATION_NOEUD=505;
63     const unsigned int NOEUD_EXISTANT=506;
64     const unsigned int FACE_EXISTANTE=506;
65    
66     const unsigned int EXISTE=700;
67     const unsigned int MULTIEXISTE=701;
68     const unsigned int CREATION=702;
69    
70    
71    
72     class DLLPORTMAIL MAILLEUR3D:public MAILLEUR
73     {
74     public:
75     typedef std::multimap<double,MG_FRONT_3D*,std::less<double> > FRONT;
76 francois 35 typedef std::multimap<double,class M3D_TETRA*,std::less<double> > ORDRE_TETRA;
77     typedef std::map<unsigned long,ORDRE_TETRA::iterator,std::less<unsigned long> > ORDRE_TETRA_PARID;
78 5
79    
80    
81     MAILLEUR3D(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,MG_VOLUME* mgvol=NULL,FCT_TAILLE* fct_taille=NULL);
82     virtual ~MAILLEUR3D();
83    
84     void maille(void);
85 francois 54 void maille(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri=NULL,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet=NULL);
86 5 double cpu[100]; //debug
87     long nbfois[100]; //debug
88    
89     void active_log(char* nomfile);
90     void desactive_log(void);
91 francois 35 void analyse_maillage_obtenu(double &vol);
92 francois 61 void change_niveau_optimisation(int num);
93     int get_niveau_optimisation(void);
94 5
95 francois 35
96 5 private:
97    
98 francois 54 void insere_contrainte_tetra(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TETRA*> *lsttet);
99     void insere_contrainte_triangle(MG_VOLUME* mgvol,TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttri);
100    
101    
102    
103 5 void initialise_frontiere(MG_VOLUME* mgvol);
104     void cree_octree(void);
105     void initialise_front(MG_VOLUME* mgvol);
106     void progresse_front(MG_VOLUME* mgvol);
107 francois 35 int genere_noeud(MG_VOLUME* mgvol,MG_FRONT_3D* ft,TPL_MAP_ENTITE<MG_NOEUD*> &liste_noeud,std::vector<class CAS_FRONT*> &liste_cas);
108 5 void detruit_element_inactif(void);
109    
110     int traite_front(class MG_VOLUME* mgvol,int type,MG_FRONT_3D* ft,std::vector<class CAS_FRONT*>& liste_cas,std::vector<class CAS_FRONT*>& liste_classe_cas,class CAS_FRONT **cas);
111     int traite_front_adjacent3(class MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas);
112     int traite_front_adjacent2(class MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas);
113     int traite_front_adjacent1(class MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas);
114     int traite_front_lie(class MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas);
115     int traite_front_general(class MG_VOLUME* mgvol,MG_FRONT_3D* ft,std::vector<CAS_FRONT*> &liste_cas,std::vector<CAS_FRONT*> &liste_classe_cas,CAS_FRONT **cas);
116    
117     int traite_destruction(MG_FRONT_3D* ft,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection);
118     void detruit_tetra(MG_TRIANGLE* tri);
119    
120 francois 54 class MG_FRONT_3D* mise_a_jour_front(MG_TETRA* tet,int cote,int numfront=ATTENTE);
121 5 void mise_a_jour_voisin_front(MG_FRONT_3D* ft);
122    
123     int test_front(void);
124 francois 61 void genere_log(int fincouche);
125     void ini_log(void);
126     void fin_log(void);
127 5
128    
129     double angle_front(MG_FRONT_3D* ft1,MG_FRONT_3D* ft2);
130     double angle_front(MG_FRONT_3D* ft1,MG_SEGMENT* seg);
131     double evaluer_distance_noeud_triangle(double x,double y,double z,MG_TRIANGLE* tri);
132     void insere_cas_front(int type,MG_NOEUD* noeud,int numero_cote,double angle,std::vector<CAS_FRONT*>& liste_cas);
133     void efface_cas_front(std::vector<CAS_FRONT*>& liste_cas,std::vector<CAS_FRONT*> liste_classe_cas[8]);
134    
135    
136     int inter_tetra_triangle(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5,MG_NOEUD* noeud6,MG_NOEUD* noeud7);
137     int inter_triangle_triangle(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5,MG_NOEUD* noeud6);
138     int inter_segment_triangle(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_NOEUD* noeud5);
139     int inter_segment_segment(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4);
140     int examine_solution(double sol1,double sol2,int type);
141     int noeud_est_triangle(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,double x,double y,double z);
142    
143    
144     double calcule_volume(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4);
145     double calcule_longueur_caracteristique(MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3=NULL,MG_NOEUD* noeud4=NULL);
146    
147    
148     class MG_TETRA* insere_tetra(class MG_VOLUME* mgvol,class MG_FRONT_3D* ft,MG_NOEUD* noeud4,int type,TPL_MAP_ENTITE<class MG_TRIANGLE*>& liste_intersection);
149 francois 54 class MG_TRIANGLE* insere_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,int origine);
150     class MG_SEGMENT* insere_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine);
151     class MG_TETRA* cree_tetra(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_NOEUD* noeud4,MG_TRIANGLE* triangle1,MG_TRIANGLE* triangle2,MG_TRIANGLE* triangle3,MG_TRIANGLE* triangle4,int origine);
152     class MG_TRIANGLE* cree_triangle(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_SEGMENT* segment1,MG_SEGMENT* segment2,MG_SEGMENT* segment3,int origine);
153     class MG_SEGMENT* cree_segment(class MG_VOLUME* mgvol,MG_NOEUD* noeud1,MG_NOEUD* noeud2,int origine);
154 5
155     MG_FRONT_3D* ajouter_front_courant(int numero_front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_TRIANGLE* triangle);
156     MG_FRONT_3D* ajouter_front(FRONT& front,MG_NOEUD* noeud1,MG_NOEUD* noeud2,MG_NOEUD* noeud3,MG_TRIANGLE* triangle);
157     void ajouter_front(FRONT& front,MG_FRONT_3D *ft);
158     MG_FRONT_3D* get_front(FRONT& front,unsigned int num);
159     unsigned int get_nb_front(FRONT& front);
160     unsigned int get_nb_front_courant(void);
161     void supprimer_front_en_avancant(MG_FRONT_3D* ft);
162     void supprimer_front_en_reculant(MG_FRONT_3D* ft);
163     void echange_de_front(FRONT& front_original,FRONT& front_destination,MG_FRONT_3D* ft);
164     void echange_de_front(MG_FRONT_3D* ft,int num);
165     void swap_front(FRONT& front_original,FRONT& front_destination);
166     int premier_front_courant(void);
167    
168 francois 35 double calcul_distance_metrique(MG_SEGMENT* seg,int pas=32);
169     double calcul_distance_metrique(double *xyz1,double* xyz2,int pas=32);
170     void ajuste_distance_metrique(double *xyz1,double *xyz2,double longueur_desiree,int pas=32);
171     double calcul_volume_tetra_metrique(MG_TETRA* tet);
172 5
173    
174 francois 54
175 francois 61 void optimise(MG_VOLUME* mgvol,int& nbmauvais);
176 francois 35 void o3d_data(void);
177     void o3d_data2(void);
178     int bouge_point(MG_VOLUME* mgvol,class M3D_NOEUD* noeud,double& crit,double& x,double& y, double& z);
179     void remaille_coquille(MG_NOEUD* noeud1,MG_NOEUD* noeud2, double& crit, class COQUILLE& coque);
180     void ajouter_ordre_tetra(M3D_TETRA* tet,int num=1);
181     void supprimer_ordre_tetra(M3D_TETRA* tet);
182 5
183 francois 35
184    
185 5 MG_MAILLAGE* mg_maillage;
186     MG_GEOMETRIE* mg_geometrie;
187     MG_VOLUME* mg_volume;
188     FCT_TAILLE *metrique;
189    
190     FRONT front_courant[11];
191     FRONT front_attente;
192    
193     int activelog;
194     std::string nomlog;
195    
196     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> *octree_de_triangle;
197     TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> *octree_de_frontiere;
198     TPL_OCTREE<MG_FRONT_3D*,MG_NOEUD*> *octree_de_front;
199     TPL_MAP_ENTITE<MG_TRIANGLE*> triangle_frontiere;
200     TPL_MAP_ENTITE<MG_NOEUD*> noeud_frontiere;
201     TPL_MAP_ENTITE<MG_NOEUD*> noeud_arete_frontiere;
202    
203 francois 35 ORDRE_TETRA lst_tetra[2];
204     ORDRE_TETRA_PARID lst_tetraid[2];
205     int tab_solution[7][1430][8];
206     int tab_face[7][120][3];
207 francois 61 int niveau_optimisation;
208     FILE* inlog;
209 5
210     };
211    
212    
213    
214    
215 francois 35 class COQUILLE
216     {
217     public:
218     COQUILLE():volume(0) {};
219     ~COQUILLE() {};
220 5
221 francois 35 int taille;
222     MG_TETRA* tet[10];
223     MG_NOEUD* new_tetra[64];
224     double volume;
225     };
226 5
227    
228    
229    
230    
231    
232    
233    
234    
235     //---------------------------------------------------------------------------
236     #endif