ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.cpp
Revision: 879
Committed: Fri Mar 31 20:53:22 2017 UTC (8 years, 1 month ago) by francois
Original Path: magic/lib/mailleur_auto/src/mailleur3d_couche.cpp
File size: 14756 byte(s)
Log Message:
mailleur d'une coquille mince. Des exe arriveront plus tard

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