ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.cpp
Revision: 904
Committed: Tue Sep 5 20:09:47 2017 UTC (7 years, 8 months ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_couche.cpp
File size: 14549 byte(s)
Log Message:
mailleur coque bug sur la projection  et le rattachement à la géométrie

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 francois 904 somop->get_point()->evaluer(xyzproj);
157 francois 879 MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
158     mai->ajouter_mg_noeud(no1);
159     noeud->change_nouveau_numero(no1->get_id());
160     }
161     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
162     {
163     TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
164     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
165 francois 904 if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) lstseg.ajouter((MG_SEGMENT*)are->get_lien_maillage()->get(i));
166 francois 879 MG_ARETE *areop=NULL;
167     int sens=0;
168     for (int i=0;i<lstseg.get_nb();i++)
169     {
170     MG_SEGMENT* seg=lstseg.get(i);
171     if (seg->get_nouveau_numero()>0) continue;
172     MG_NOEUD* n1=seg->get_noeud1();
173     MG_NOEUD* n2=seg->get_noeud2();
174     MG_NOEUD *no1,*no2;
175     if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
176     else
177     {
178     no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare);
179     }
180     if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
181     else
182     {
183     no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare);
184     }
185     MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens);
186     seg->change_nouveau_numero(segnv->get_id());
187     }
188     }
189     int sens=0;
190     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
191     {
192     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i);
193     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
194     MG_NOEUD* n1=tri->get_noeud1();
195     MG_NOEUD* n2=tri->get_noeud2();
196     MG_NOEUD* n3=tri->get_noeud3();
197     double xyzproj[3];
198     double xyzprojuv[3];
199     MG_NOEUD *no1;
200     MG_NOEUD *no2;
201     MG_NOEUD *no3;
202     if (n1->get_nouveau_numero()<1)
203     {
204     double *xyz=n1->get_coord();
205     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
206     no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
207     mai->ajouter_mg_noeud(no1);
208     n1->change_nouveau_numero(no1->get_id());
209     }
210     else no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
211     if (n2->get_nouveau_numero()<1)
212     {
213     double *xyz=n2->get_coord();
214     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
215     no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
216     mai->ajouter_mg_noeud(no2);
217     n2->change_nouveau_numero(no2->get_id());
218     }
219     else no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
220     if (n3->get_nouveau_numero()<1)
221     {
222     double *xyz=n3->get_coord();
223     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
224     no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
225     mai->ajouter_mg_noeud(no3);
226     n3->change_nouveau_numero(no3->get_id());
227     }
228     else no3=mai->get_mg_noeudid(n3->get_nouveau_numero());
229     MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens);
230     tri->change_nouveau_numero(trinv->get_id());
231     }
232     }
233     char mess[255];
234     sprintf(mess," Maillage des autres aretes");
235     affiche(mess);
236     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst,lstbase,lstopp;
237     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
238     vol->get_topologie_sousjacente(&lst);
239 francois 881 for (int i=0;i<vol->get_nb_face_correspondante();i++)
240 francois 879 {
241 francois 881 MG_FACE* face1;
242     MG_FACE* face2;
243     vol->get_face_correspondante(i,&face1,&face2);
244     face1->get_topologie_sousjacente(&lstbase);
245 francois 879 face2->get_topologie_sousjacente(&lstopp);
246 francois 881 lstbase.ajouter(face1);
247 francois 879 lstopp.ajouter(face2);
248     }
249     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
250     if (ele->get_dimension()==1)
251     if (!lstbase.existe(ele))
252     if (!lstopp.existe(ele))
253     {
254     MG_SOMMET* som1=((MG_ARETE*)ele)->get_cosommet1()->get_sommet();
255     MG_SOMMET* som2=((MG_ARETE*)ele)->get_cosommet2()->get_sommet();
256     MG_NOEUD* no1;
257     MG_NOEUD* no2;
258     int num=0;
259     do
260     {
261     no1=(MG_NOEUD*)som1->get_lien_maillage()->get(num);
262     num++;
263     }
264     while (mai->get_mg_noeudid(no1->get_id())==NULL);
265     num=0;
266     do
267     {
268     no2=(MG_NOEUD*)som2->get_lien_maillage()->get(num);
269     num++;
270     }
271     while (mai->get_mg_noeudid(no2->get_id())==NULL);
272     int sens=0;
273     insere_segment_orientant((MG_ARETE*)ele,no1,no2,sens);
274     }
275     sprintf(mess," Maillage des autres faces");
276     affiche(mess);
277     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
278     if (ele->get_dimension()==2)
279     if (!lstbase.existe(ele))
280     if (!lstopp.existe(ele))
281     {
282     MG_FACE *facetmp=(MG_FACE*)ele;
283     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lstf;
284     facetmp->get_topologie_sousjacente(&lstf);
285     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it1,it2;
286     MG_ELEMENT_TOPOLOGIQUE* eletmp=lstf.premier_commun(lstbase,it1,it2);
287     while (eletmp->get_dimension()!=1)
288     {
289     eletmp=lstf.suivant_commun(lstbase,it1,it2);
290     }
291     MG_ARETE* arebase=(MG_ARETE*) eletmp;
292     int sens=0;
293     for (int i=0;i<arebase->get_lien_maillage()->get_nb();i++)
294     {
295     MG_SEGMENT* seg=(MG_SEGMENT*)arebase->get_lien_maillage()->get(i);
296     if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
297     MG_NOEUD *no1=seg->get_noeud1();
298     MG_NOEUD *no4=seg->get_noeud2();
299     MG_NOEUD *no2=mai->get_mg_noeudid(no1->get_nouveau_numero());
300     MG_NOEUD *no3=mai->get_mg_noeudid(no4->get_nouveau_numero());
301     insere_quadrangle_orientant(facetmp,no1,no2,no3,no4,sens);
302    
303     }
304     }
305     sprintf(mess," Maillage du volume");
306     affiche(mess);
307     for (MG_ELEMENT_TOPOLOGIQUE* ele=lstbase.get_premier(it);ele!=NULL;ele=lstbase.get_suivant(it))
308     if (ele->get_dimension()==2)
309     {
310     MG_FACE *facetmp=(MG_FACE*)ele;
311     for (int i=0;i<facetmp->get_lien_maillage()->get_nb();i++)
312     {
313     MG_TRIANGLE* tri=(MG_TRIANGLE*)facetmp->get_lien_maillage()->get(i);
314     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
315     MG_NOEUD *no1=tri->get_noeud1();
316     MG_NOEUD *no2=tri->get_noeud2();
317     MG_NOEUD *no3=tri->get_noeud3();
318     MG_NOEUD *no4=mai->get_mg_noeudid(no1->get_nouveau_numero());
319     MG_NOEUD *no5=mai->get_mg_noeudid(no2->get_nouveau_numero());
320     MG_NOEUD *no6=mai->get_mg_noeudid(no3->get_nouveau_numero());
321     mai->ajouter_mg_penta(vol,no1,no2,no3,no4,no5,no6,MAGIC::ORIGINE::MAILLEUR_AUTO);
322     }
323     }
324     }
325    
326    
327     MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare)
328     {
329     MG_GEOMETRIE_OUTILS ot;
330     double *xyz=n1->get_coord();
331     double xyzproj[3],xyzprojuv[3];
332     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
333     if (*areop==NULL)
334     {
335     double dist=1e300;
336     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2;
337     for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2))
338     {
339     double t;
340     are2->inverser(t,xyzproj);
341     double xyztmp[3];
342     are2->evaluer(t,xyztmp);
343     OT_VECTEUR_3D v(xyzproj,xyztmp);
344     if (v.get_longueur2()<dist)
345     {
346     dist=v.get_longueur2();
347     *areop=are2;
348     }
349     }
350     }
351     double t;
352     (*areop)->inverser(t,xyzproj);
353     double newxyz[3];
354     (*areop)->evaluer(t,newxyz);
355     MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
356     mai->ajouter_mg_noeud(no1);
357     n1->change_nouveau_numero(no1->get_id());
358     return no1;
359     }
360    
361     MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens)
362     {
363     if (sens==0)
364     {
365     double *xyz1=no1->get_coord();
366     double *xyz2=no2->get_coord();
367     double t;
368     are->inverser(t,xyz1);
369     double dxyz[3];
370     are->deriver(t,dxyz);
371     OT_VECTEUR_3D v1(xyz1,xyz2);
372     OT_VECTEUR_3D v2(dxyz);
373     v1.norme();
374     v2.norme();
375     if (v1*v2>0) sens=1; else sens=-1;
376     }
377     MG_SEGMENT* segnv;
378     if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
379     else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
380     return segnv;
381     }
382    
383    
384     MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens)
385     {
386     if (sens==0)
387     {
388     double *xyz1=no1->get_coord();
389     double *xyz2=no2->get_coord();
390     double *xyz3=no3->get_coord();
391     double uv[3];
392     face->inverser(uv,xyz1);
393     double nor[3];
394     face->calcul_normale_unitaire(uv,nor);
395     OT_VECTEUR_3D n(nor);
396     OT_VECTEUR_3D v1(xyz1,xyz3);
397     OT_VECTEUR_3D v2(xyz1,xyz2);
398     OT_VECTEUR_3D nn=v1&v2;
399     nn.norme();
400     if (n*nn>0) sens=1; else sens=-1;
401     }
402    
403    
404     MG_TRIANGLE* trinv;
405     if (sens==1) trinv=mai->ajouter_mg_triangle(face,no1,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO);
406     else if (sens==-1) trinv=mai->ajouter_mg_triangle(face,no1,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
407     return trinv;
408     }
409    
410     MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens)
411     {
412     if (sens==0)
413     {
414     double *xyz1=no1->get_coord();
415     double *xyz2=no2->get_coord();
416     double *xyz3=no3->get_coord();
417     double uv[3];
418     face->inverser(uv,xyz1);
419     double nor[3];
420     face->calcul_normale_unitaire(uv,nor);
421     OT_VECTEUR_3D n(nor);
422     OT_VECTEUR_3D v1(xyz1,xyz3);
423     OT_VECTEUR_3D v2(xyz1,xyz2);
424     OT_VECTEUR_3D nn=v1&v2;
425     nn.norme();
426     if (n*nn>0) sens=1; else sens=-1;
427     }
428     MG_QUADRANGLE* quadnv;
429     if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO);
430     else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
431     return quadnv;
432     }