ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.cpp
Revision: 881
Committed: Wed Apr 12 23:14:07 2017 UTC (8 years, 2 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_couche.cpp
File size: 14507 byte(s)
Log Message:
Changement de strategie pour le mailleur couche.
Il fonctionne maintenant avec des volumes minces et non des coquilles
mince est une propriète de volume et ne change pas son nom.
cela necessite un changement de version de fichier -> maintenant 2.3 compatible en arrière
valider sur ancien exemple plus sphere creuse

File Contents

# User Rev Content
1 francois 879 //------------------------------------------------------------
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.cpp
16     //
17     //------------------------------------------------------------
18     //------------------------------------------------------------
19     // COPYRIGHT 2000
20     // Version du 02/03/2006 �11H23
21     //------------------------------------------------------------
22     //------------------------------------------------------------
23    
24    
25     #include "gestionversion.h"
26     #include "mailleur3d_couche.h"
27     #include "mailleur0d.h"
28     #include "mailleur1d.h"
29     #include "mailleur2d.h"
30     #include "mg_gestionnaire.h"
31     #include "mg_geometrie_outils.h"
32    
33     //#pragma hdrstop
34     #include "mailleur3d_couche.h"
35     //---------------------------------------------------------------------------
36    
37     //#pragma package(smart_init)
38    
39    
40    
41     MAILLEUR3D_COUCHE::MAILLEUR3D_COUCHE(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille):MAILLEUR(false),mai(mgmai),geo(mggeo),metrique(fct_taille)
42     {
43    
44     }
45    
46    
47    
48     MAILLEUR3D_COUCHE::~MAILLEUR3D_COUCHE()
49     {
50     }
51    
52    
53    
54    
55     void MAILLEUR3D_COUCHE::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
56     {
57    
58     }
59    
60    
61    
62     void MAILLEUR3D_COUCHE::maille(MG_VOLUME *vol)
63     {
64 francois 881 if (!vol->est_mince()) return;
65     affiche((char*)"Mailleur d'un volume mince en pentaedre");
66     for (int i=0;i<vol->get_nb_face_correspondante();i++)
67 francois 879 {
68 francois 881 MG_FACE* face1;
69     MG_FACE* face2;
70     vol->get_face_correspondante(i,&face1,&face2);
71 francois 879 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
72     TPL_MAP_ENTITE<MG_ARETE*> lstare;
73 francois 881 MG_FACE* face=face1;
74 francois 879 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
75     face->get_topologie_sousjacente(&lst);
76     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
77     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
78     {
79     if (ele->get_dimension()==0) lstsom.ajouter((MG_SOMMET*)ele);
80     if (ele->get_dimension()==1) lstare.ajouter((MG_ARETE*)ele);
81     }
82     char mess[500];
83     sprintf(mess," Maillage de la face de base %lu",face->get_id());
84     affiche(mess);
85     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its;
86     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
87     {
88     bool dejamaille=false;
89     for (int i=0;i<som->get_lien_maillage()->get_nb();i++)
90     if (mai->get_mg_noeudid(som->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
91     if (!dejamaille)
92     {
93     MAILLEUR0D m0d(mai,mai->get_mg_geometrie(),som);
94     m0d.maille();
95     }
96     }
97     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita;
98     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
99     {
100     bool dejamaille=false;
101     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
102     if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
103     if (!dejamaille)
104     {
105     MAILLEUR1D m1d(mai,mai->get_mg_geometrie(),metrique,are);
106     m1d.maille();
107     }
108     }
109     bool dejamaille=false;
110     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
111     if (mai->get_mg_triangleid(face->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
112     if (!dejamaille)
113     {
114     MAILLEUR2D m2d(mai,mai->get_mg_geometrie(),metrique,face);
115     m2d.active_affichage(affiche2);
116     m2d.maille();
117     }
118 francois 881 MG_FACE* autreface=face2;
119 francois 879 sprintf(mess," Maillage de la face extrude %lu",autreface->get_id());
120     affiche(mess);
121     TPL_MAP_ENTITE<MG_SOMMET*> lstasom;
122     TPL_MAP_ENTITE<MG_ARETE*> lstaare;
123     lst.vide();
124     autreface->get_topologie_sousjacente(&lst);
125     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
126     {
127     if (ele->get_dimension()==0) lstasom.ajouter((MG_SOMMET*)ele);
128     if (ele->get_dimension()==1) lstaare.ajouter((MG_ARETE*)ele);
129     }
130     MG_GEOMETRIE_OUTILS ot;
131     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
132     {
133     int num=0;
134     MG_NOEUD* noeud;
135     do
136     {
137     noeud=(MG_NOEUD*)som->get_lien_maillage()->get(num);
138     num++;
139     }
140     while (mai->get_mg_noeudid(noeud->get_id())==NULL);
141     if (noeud->get_nouveau_numero()>0) continue;
142     double *xyz=noeud->get_coord();
143     double xyzproj[3];
144     double xyzprojuv[3];
145     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
146     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its2;
147     MG_SOMMET* somop=NULL;
148     double dist=1e300;
149     for (MG_SOMMET* som2=lstasom.get_premier(its2);som2!=NULL;som2=lstasom.get_suivant(its2))
150     {
151     double xyzsom2[3];
152     som2->get_point()->evaluer(xyzsom2);
153     OT_VECTEUR_3D v(xyzproj,xyzsom2);
154     if (v.get_longueur2()<dist) {dist=v.get_longueur2();somop=som2;}
155     }
156     MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
157     mai->ajouter_mg_noeud(no1);
158     noeud->change_nouveau_numero(no1->get_id());
159     }
160     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
161     {
162     TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
163     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
164     if (mai->get_mg_segment(are->get_lien_maillage()->get(i)->get_id())!=NULL) lstseg.ajouter((MG_SEGMENT*)are->get_lien_maillage()->get(i));
165     MG_ARETE *areop=NULL;
166     int sens=0;
167     for (int i=0;i<lstseg.get_nb();i++)
168     {
169     MG_SEGMENT* seg=lstseg.get(i);
170     if (seg->get_nouveau_numero()>0) continue;
171     MG_NOEUD* n1=seg->get_noeud1();
172     MG_NOEUD* n2=seg->get_noeud2();
173     MG_NOEUD *no1,*no2;
174     if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
175     else
176     {
177     no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare);
178     }
179     if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
180     else
181     {
182     no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare);
183     }
184     MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens);
185     seg->change_nouveau_numero(segnv->get_id());
186     }
187     }
188     int sens=0;
189     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
190     {
191     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i);
192     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
193     MG_NOEUD* n1=tri->get_noeud1();
194     MG_NOEUD* n2=tri->get_noeud2();
195     MG_NOEUD* n3=tri->get_noeud3();
196     double xyzproj[3];
197     double xyzprojuv[3];
198     MG_NOEUD *no1;
199     MG_NOEUD *no2;
200     MG_NOEUD *no3;
201     if (n1->get_nouveau_numero()<1)
202     {
203     double *xyz=n1->get_coord();
204     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
205     no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
206     mai->ajouter_mg_noeud(no1);
207     n1->change_nouveau_numero(no1->get_id());
208     }
209     else no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
210     if (n2->get_nouveau_numero()<1)
211     {
212     double *xyz=n2->get_coord();
213     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
214     no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
215     mai->ajouter_mg_noeud(no2);
216     n2->change_nouveau_numero(no2->get_id());
217     }
218     else no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
219     if (n3->get_nouveau_numero()<1)
220     {
221     double *xyz=n3->get_coord();
222     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
223     no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
224     mai->ajouter_mg_noeud(no3);
225     n3->change_nouveau_numero(no3->get_id());
226     }
227     else no3=mai->get_mg_noeudid(n3->get_nouveau_numero());
228     MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens);
229     tri->change_nouveau_numero(trinv->get_id());
230     }
231     }
232    
233    
234     char mess[255];
235     sprintf(mess," Maillage des autres aretes");
236     affiche(mess);
237     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst,lstbase,lstopp;
238     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
239     vol->get_topologie_sousjacente(&lst);
240 francois 881 for (int i=0;i<vol->get_nb_face_correspondante();i++)
241 francois 879 {
242 francois 881 MG_FACE* face1;
243     MG_FACE* face2;
244     vol->get_face_correspondante(i,&face1,&face2);
245     face1->get_topologie_sousjacente(&lstbase);
246 francois 879 face2->get_topologie_sousjacente(&lstopp);
247 francois 881 lstbase.ajouter(face1);
248 francois 879 lstopp.ajouter(face2);
249     }
250     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
251     if (ele->get_dimension()==1)
252     if (!lstbase.existe(ele))
253     if (!lstopp.existe(ele))
254     {
255     MG_SOMMET* som1=((MG_ARETE*)ele)->get_cosommet1()->get_sommet();
256     MG_SOMMET* som2=((MG_ARETE*)ele)->get_cosommet2()->get_sommet();
257     MG_NOEUD* no1;
258     MG_NOEUD* no2;
259     int num=0;
260     do
261     {
262     no1=(MG_NOEUD*)som1->get_lien_maillage()->get(num);
263     num++;
264     }
265     while (mai->get_mg_noeudid(no1->get_id())==NULL);
266     num=0;
267     do
268     {
269     no2=(MG_NOEUD*)som2->get_lien_maillage()->get(num);
270     num++;
271     }
272     while (mai->get_mg_noeudid(no2->get_id())==NULL);
273     int sens=0;
274     insere_segment_orientant((MG_ARETE*)ele,no1,no2,sens);
275     }
276     sprintf(mess," Maillage des autres faces");
277     affiche(mess);
278     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
279     if (ele->get_dimension()==2)
280     if (!lstbase.existe(ele))
281     if (!lstopp.existe(ele))
282     {
283     MG_FACE *facetmp=(MG_FACE*)ele;
284     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstf;
285     facetmp->get_topologie_sousjacente(&lstf);
286     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it1,it2;
287     MG_ELEMENT_TOPOLOGIQUE* eletmp=lstf.premier_commun(lstbase,it1,it2);
288     while (eletmp->get_dimension()!=1)
289     {
290     eletmp=lstf.suivant_commun(lstbase,it1,it2);
291     }
292     MG_ARETE* arebase=(MG_ARETE*) eletmp;
293     int sens=0;
294     for (int i=0;i<arebase->get_lien_maillage()->get_nb();i++)
295     {
296     MG_SEGMENT* seg=(MG_SEGMENT*)arebase->get_lien_maillage()->get(i);
297     if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
298     MG_NOEUD *no1=seg->get_noeud1();
299     MG_NOEUD *no4=seg->get_noeud2();
300     MG_NOEUD *no2=mai->get_mg_noeudid(no1->get_nouveau_numero());
301     MG_NOEUD *no3=mai->get_mg_noeudid(no4->get_nouveau_numero());
302     insere_quadrangle_orientant(facetmp,no1,no2,no3,no4,sens);
303    
304     }
305     }
306     sprintf(mess," Maillage du volume");
307     affiche(mess);
308     for (MG_ELEMENT_TOPOLOGIQUE* ele=lstbase.get_premier(it);ele!=NULL;ele=lstbase.get_suivant(it))
309     if (ele->get_dimension()==2)
310     {
311     MG_FACE *facetmp=(MG_FACE*)ele;
312     for (int i=0;i<facetmp->get_lien_maillage()->get_nb();i++)
313     {
314     MG_TRIANGLE* tri=(MG_TRIANGLE*)facetmp->get_lien_maillage()->get(i);
315     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
316     MG_NOEUD *no1=tri->get_noeud1();
317     MG_NOEUD *no2=tri->get_noeud2();
318     MG_NOEUD *no3=tri->get_noeud3();
319     MG_NOEUD *no4=mai->get_mg_noeudid(no1->get_nouveau_numero());
320     MG_NOEUD *no5=mai->get_mg_noeudid(no2->get_nouveau_numero());
321     MG_NOEUD *no6=mai->get_mg_noeudid(no3->get_nouveau_numero());
322     mai->ajouter_mg_penta(vol,no1,no2,no3,no4,no5,no6,MAGIC::ORIGINE::MAILLEUR_AUTO);
323     }
324     }
325     }
326    
327    
328     MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare)
329     {
330     MG_GEOMETRIE_OUTILS ot;
331     double *xyz=n1->get_coord();
332     double xyzproj[3],xyzprojuv[3];
333     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
334     if (*areop==NULL)
335     {
336     double dist=1e300;
337     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2;
338     for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2))
339     {
340     double t;
341     are2->inverser(t,xyzproj);
342     double xyztmp[3];
343     are2->evaluer(t,xyztmp);
344     OT_VECTEUR_3D v(xyzproj,xyztmp);
345     if (v.get_longueur2()<dist)
346     {
347     dist=v.get_longueur2();
348     *areop=are2;
349     }
350     }
351     }
352     double t;
353     (*areop)->inverser(t,xyzproj);
354     double newxyz[3];
355     (*areop)->evaluer(t,newxyz);
356     MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
357     mai->ajouter_mg_noeud(no1);
358     n1->change_nouveau_numero(no1->get_id());
359     return no1;
360     }
361    
362     MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens)
363     {
364     if (sens==0)
365     {
366     double *xyz1=no1->get_coord();
367     double *xyz2=no2->get_coord();
368     double t;
369     are->inverser(t,xyz1);
370     double dxyz[3];
371     are->deriver(t,dxyz);
372     OT_VECTEUR_3D v1(xyz1,xyz2);
373     OT_VECTEUR_3D v2(dxyz);
374     v1.norme();
375     v2.norme();
376     if (v1*v2>0) sens=1; else sens=-1;
377     }
378     MG_SEGMENT* segnv;
379     if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
380     else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
381     return segnv;
382     }
383    
384    
385     MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens)
386     {
387     if (sens==0)
388     {
389     double *xyz1=no1->get_coord();
390     double *xyz2=no2->get_coord();
391     double *xyz3=no3->get_coord();
392     double uv[3];
393     face->inverser(uv,xyz1);
394     double nor[3];
395     face->calcul_normale_unitaire(uv,nor);
396     OT_VECTEUR_3D n(nor);
397     OT_VECTEUR_3D v1(xyz1,xyz3);
398     OT_VECTEUR_3D v2(xyz1,xyz2);
399     OT_VECTEUR_3D nn=v1&v2;
400     nn.norme();
401     if (n*nn>0) sens=1; else sens=-1;
402     }
403    
404    
405     MG_TRIANGLE* trinv;
406     if (sens==1) trinv=mai->ajouter_mg_triangle(face,no1,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO);
407     else if (sens==-1) trinv=mai->ajouter_mg_triangle(face,no1,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
408     return trinv;
409     }
410    
411     MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens)
412     {
413     if (sens==0)
414     {
415     double *xyz1=no1->get_coord();
416     double *xyz2=no2->get_coord();
417     double *xyz3=no3->get_coord();
418     double uv[3];
419     face->inverser(uv,xyz1);
420     double nor[3];
421     face->calcul_normale_unitaire(uv,nor);
422     OT_VECTEUR_3D n(nor);
423     OT_VECTEUR_3D v1(xyz1,xyz3);
424     OT_VECTEUR_3D v2(xyz1,xyz2);
425     OT_VECTEUR_3D nn=v1&v2;
426     nn.norme();
427     if (n*nn>0) sens=1; else sens=-1;
428     }
429     MG_QUADRANGLE* quadnv;
430     if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO);
431     else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
432     return quadnv;
433     }