ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur3d_couche.cpp
Revision: 966
Committed: Thu Sep 6 16:46:34 2018 UTC (6 years, 8 months ago) by couturad
Original Path: magic/lib/mailleur_auto/src/mailleur3d_couche.cpp
File size: 15535 byte(s)
Log Message:
Ajout de l'histogramme a MAGIC_PLOT
Ajout d'une sortie OK ou FAIL (int) au MAILLEUR afin de gerer certaines exceptions
Ajout d'une phase RSA a la fin du generateur DCR

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 couturad 951 #include "m3d_triangle.h"
33 francois 879
34     //#pragma hdrstop
35     #include "mailleur3d_couche.h"
36     //---------------------------------------------------------------------------
37    
38     //#pragma package(smart_init)
39    
40    
41    
42     MAILLEUR3D_COUCHE::MAILLEUR3D_COUCHE(MG_MAILLAGE* mgmai,MG_GEOMETRIE *mggeo,FCT_TAILLE* fct_taille):MAILLEUR(false),mai(mgmai),geo(mggeo),metrique(fct_taille)
43     {
44    
45     }
46    
47    
48    
49     MAILLEUR3D_COUCHE::~MAILLEUR3D_COUCHE()
50     {
51     }
52    
53    
54    
55    
56 couturad 966 int MAILLEUR3D_COUCHE::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
57 francois 879 {
58    
59     }
60    
61    
62    
63 couturad 966 int MAILLEUR3D_COUCHE::maille(MG_VOLUME *vol)
64 francois 879 {
65 couturad 966 if (!vol->est_mince()) return OK;
66 francois 881 affiche((char*)"Mailleur d'un volume mince en pentaedre");
67     for (int i=0;i<vol->get_nb_face_correspondante();i++)
68 francois 879 {
69 francois 881 MG_FACE* face1;
70     MG_FACE* face2;
71     vol->get_face_correspondante(i,&face1,&face2);
72 francois 879 TPL_MAP_ENTITE<MG_SOMMET*> lstsom;
73     TPL_MAP_ENTITE<MG_ARETE*> lstare;
74 francois 881 MG_FACE* face=face1;
75 francois 879 TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*> lst;
76     face->get_topologie_sousjacente(&lst);
77     TPL_MAP_ENTITE<MG_ELEMENT_TOPOLOGIQUE*>::ITERATEUR it;
78     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
79     {
80     if (ele->get_dimension()==0) lstsom.ajouter((MG_SOMMET*)ele);
81     if (ele->get_dimension()==1) lstare.ajouter((MG_ARETE*)ele);
82     }
83     char mess[500];
84     sprintf(mess," Maillage de la face de base %lu",face->get_id());
85     affiche(mess);
86     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its;
87     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
88     {
89     bool dejamaille=false;
90     for (int i=0;i<som->get_lien_maillage()->get_nb();i++)
91     if (mai->get_mg_noeudid(som->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
92     if (!dejamaille)
93     {
94     MAILLEUR0D m0d(mai,mai->get_mg_geometrie(),som);
95     m0d.maille();
96     }
97     }
98     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita;
99     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
100     {
101     bool dejamaille=false;
102     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
103     if (mai->get_mg_segmentid(are->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
104     if (!dejamaille)
105     {
106     MAILLEUR1D m1d(mai,mai->get_mg_geometrie(),metrique,are);
107     m1d.maille();
108     }
109     }
110     bool dejamaille=false;
111     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
112     if (mai->get_mg_triangleid(face->get_lien_maillage()->get(i)->get_id())!=NULL) {dejamaille=true;break;}
113     if (!dejamaille)
114     {
115     MAILLEUR2D m2d(mai,mai->get_mg_geometrie(),metrique,face);
116     m2d.active_affichage(affiche2);
117     m2d.maille();
118     }
119 francois 881 MG_FACE* autreface=face2;
120 francois 879 sprintf(mess," Maillage de la face extrude %lu",autreface->get_id());
121     affiche(mess);
122     TPL_MAP_ENTITE<MG_SOMMET*> lstasom;
123     TPL_MAP_ENTITE<MG_ARETE*> lstaare;
124     lst.vide();
125     autreface->get_topologie_sousjacente(&lst);
126     for (MG_ELEMENT_TOPOLOGIQUE* ele=lst.get_premier(it);ele!=NULL;ele=lst.get_suivant(it))
127     {
128     if (ele->get_dimension()==0) lstasom.ajouter((MG_SOMMET*)ele);
129     if (ele->get_dimension()==1) lstaare.ajouter((MG_ARETE*)ele);
130     }
131     MG_GEOMETRIE_OUTILS ot;
132     for (MG_SOMMET* som=lstsom.get_premier(its);som!=NULL;som=lstsom.get_suivant(its))
133     {
134     int num=0;
135     MG_NOEUD* noeud;
136     do
137     {
138     noeud=(MG_NOEUD*)som->get_lien_maillage()->get(num);
139     num++;
140     }
141     while (mai->get_mg_noeudid(noeud->get_id())==NULL);
142     if (noeud->get_nouveau_numero()>0) continue;
143     double *xyz=noeud->get_coord();
144     double xyzproj[3];
145     double xyzprojuv[3];
146     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
147     TPL_MAP_ENTITE<MG_SOMMET*>::ITERATEUR its2;
148     MG_SOMMET* somop=NULL;
149     double dist=1e300;
150     for (MG_SOMMET* som2=lstasom.get_premier(its2);som2!=NULL;som2=lstasom.get_suivant(its2))
151     {
152     double xyzsom2[3];
153     som2->get_point()->evaluer(xyzsom2);
154     OT_VECTEUR_3D v(xyzproj,xyzsom2);
155     if (v.get_longueur2()<dist) {dist=v.get_longueur2();somop=som2;}
156     }
157 francois 904 somop->get_point()->evaluer(xyzproj);
158 francois 879 MG_NOEUD* no1=new MG_NOEUD(somop,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
159     mai->ajouter_mg_noeud(no1);
160     noeud->change_nouveau_numero(no1->get_id());
161     }
162     for (MG_ARETE* are=lstare.get_premier(ita);are!=NULL;are=lstare.get_suivant(ita))
163     {
164     TPL_LISTE_ENTITE<MG_SEGMENT*> lstseg;
165     for (int i=0;i<are->get_lien_maillage()->get_nb();i++)
166 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));
167 francois 879 MG_ARETE *areop=NULL;
168     int sens=0;
169     for (int i=0;i<lstseg.get_nb();i++)
170     {
171     MG_SEGMENT* seg=lstseg.get(i);
172     if (seg->get_nouveau_numero()>0) continue;
173     MG_NOEUD* n1=seg->get_noeud1();
174     MG_NOEUD* n2=seg->get_noeud2();
175     MG_NOEUD *no1,*no2;
176     if (n1->get_nouveau_numero()>0) no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
177     else
178     {
179     no1=projete_noeud_sur_arete(n1,autreface,&areop,lstaare);
180     }
181     if (n2->get_nouveau_numero()>0) no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
182     else
183     {
184     no2=projete_noeud_sur_arete(n2,autreface,&areop,lstaare);
185     }
186     MG_SEGMENT* segnv=insere_segment_orientant(areop,no1,no2,sens);
187     seg->change_nouveau_numero(segnv->get_id());
188     }
189     }
190     int sens=0;
191     for (int i=0;i<face->get_lien_maillage()->get_nb();i++)
192     {
193     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(i);
194     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
195     MG_NOEUD* n1=tri->get_noeud1();
196     MG_NOEUD* n2=tri->get_noeud2();
197     MG_NOEUD* n3=tri->get_noeud3();
198     double xyzproj[3];
199     double xyzprojuv[3];
200     MG_NOEUD *no1;
201     MG_NOEUD *no2;
202     MG_NOEUD *no3;
203     if (n1->get_nouveau_numero()<1)
204     {
205     double *xyz=n1->get_coord();
206     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
207     no1=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
208     mai->ajouter_mg_noeud(no1);
209     n1->change_nouveau_numero(no1->get_id());
210     }
211     else no1=mai->get_mg_noeudid(n1->get_nouveau_numero());
212     if (n2->get_nouveau_numero()<1)
213     {
214     double *xyz=n2->get_coord();
215     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
216     no2=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
217     mai->ajouter_mg_noeud(no2);
218     n2->change_nouveau_numero(no2->get_id());
219     }
220     else no2=mai->get_mg_noeudid(n2->get_nouveau_numero());
221     if (n3->get_nouveau_numero()<1)
222     {
223     double *xyz=n3->get_coord();
224     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
225     no3=new MG_NOEUD(autreface,xyzproj[0],xyzproj[1],xyzproj[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
226     mai->ajouter_mg_noeud(no3);
227     n3->change_nouveau_numero(no3->get_id());
228     }
229     else no3=mai->get_mg_noeudid(n3->get_nouveau_numero());
230     MG_TRIANGLE* trinv=insere_triangle_orientant(autreface,no1,no2,no3,sens);
231     tri->change_nouveau_numero(trinv->get_id());
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 couturad 966 return OK;
326 francois 879 }
327    
328    
329     MG_NOEUD* MAILLEUR3D_COUCHE::projete_noeud_sur_arete(MG_NOEUD* n1, MG_FACE* autreface, MG_ARETE** areop,TPL_MAP_ENTITE<MG_ARETE*> &lstaare)
330     {
331     MG_GEOMETRIE_OUTILS ot;
332     double *xyz=n1->get_coord();
333     double xyzproj[3],xyzprojuv[3];
334     ot.projete(xyz,autreface,xyzprojuv,xyzproj);
335     if (*areop==NULL)
336     {
337     double dist=1e300;
338     TPL_MAP_ENTITE<MG_ARETE*>::ITERATEUR ita2;
339     for (MG_ARETE* are2=lstaare.get_premier(ita2);are2!=NULL;are2=lstaare.get_suivant(ita2))
340     {
341     double t;
342     are2->inverser(t,xyzproj);
343     double xyztmp[3];
344     are2->evaluer(t,xyztmp);
345     OT_VECTEUR_3D v(xyzproj,xyztmp);
346     if (v.get_longueur2()<dist)
347     {
348     dist=v.get_longueur2();
349     *areop=are2;
350     }
351     }
352     }
353     double t;
354     (*areop)->inverser(t,xyzproj);
355     double newxyz[3];
356     (*areop)->evaluer(t,newxyz);
357     MG_NOEUD* no1=new MG_NOEUD(*areop,newxyz[0],newxyz[1],newxyz[2],MAGIC::ORIGINE::MAILLEUR_AUTO);
358     mai->ajouter_mg_noeud(no1);
359     n1->change_nouveau_numero(no1->get_id());
360     return no1;
361     }
362    
363     MG_SEGMENT* MAILLEUR3D_COUCHE::insere_segment_orientant(MG_ARETE* are,MG_NOEUD* no1,MG_NOEUD* no2,int &sens)
364     {
365     if (sens==0)
366     {
367     double *xyz1=no1->get_coord();
368     double *xyz2=no2->get_coord();
369     double t;
370     are->inverser(t,xyz1);
371     double dxyz[3];
372     are->deriver(t,dxyz);
373     OT_VECTEUR_3D v1(xyz1,xyz2);
374     OT_VECTEUR_3D v2(dxyz);
375     v1.norme();
376     v2.norme();
377     if (v1*v2>0) sens=1; else sens=-1;
378     }
379     MG_SEGMENT* segnv;
380     if (sens==1) segnv=mai->ajouter_mg_segment(are,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
381     else if (sens==-1) segnv=mai->ajouter_mg_segment(are,no2,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
382     return segnv;
383     }
384    
385    
386     MG_TRIANGLE* MAILLEUR3D_COUCHE::insere_triangle_orientant(MG_FACE* face,MG_NOEUD* no1,MG_NOEUD* no2,MG_NOEUD* no3,int &sens)
387     {
388     if (sens==0)
389     {
390     double *xyz1=no1->get_coord();
391     double *xyz2=no2->get_coord();
392     double *xyz3=no3->get_coord();
393     double uv[3];
394     face->inverser(uv,xyz1);
395     double nor[3];
396     face->calcul_normale_unitaire(uv,nor);
397     OT_VECTEUR_3D n(nor);
398     OT_VECTEUR_3D v1(xyz1,xyz3);
399     OT_VECTEUR_3D v2(xyz1,xyz2);
400     OT_VECTEUR_3D nn=v1&v2;
401     nn.norme();
402     if (n*nn>0) sens=1; else sens=-1;
403     }
404    
405 couturad 951 // 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     MG_NOEUD* nd1;
411     MG_NOEUD* nd2;
412     MG_NOEUD* nd3;
413     if(sens==1) {nd1=no1;nd2=no2;nd3=no3;}
414     else if(sens==-1) {nd1=no1;nd2=no3;nd3=no2;}
415     MG_TRIANGLE* trinv;
416     MG_SEGMENT* mgsegment1=mai->get_mg_segment(no1->get_id(),no2->get_id());
417     MG_SEGMENT* mgsegment2=mai->get_mg_segment(no2->get_id(),no3->get_id());
418     MG_SEGMENT* mgsegment3=mai->get_mg_segment(no3->get_id(),no1->get_id());
419     if (mgsegment1==NULL) mgsegment1=mai->ajouter_mg_segment(face,no1,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
420     if (mgsegment2==NULL) mgsegment2=mai->ajouter_mg_segment(face,no2,no3,MAGIC::ORIGINE::MAILLEUR_AUTO);
421     if (mgsegment3==NULL) mgsegment3=mai->ajouter_mg_segment(face,no3,no1,MAGIC::ORIGINE::MAILLEUR_AUTO);
422     trinv=new M3D_TRIANGLE(face,no1,no2,no3,mgsegment1,mgsegment2,mgsegment3,MAGIC::ORIGINE::MAILLEUR_AUTO);
423     int resultat=mai->ajouter_mg_triangle(trinv);
424     if (resultat==FAIL)
425     {
426     delete trinv;
427     return NULL;
428     }
429     return trinv;
430 francois 879 }
431    
432     MG_QUADRANGLE* MAILLEUR3D_COUCHE::insere_quadrangle_orientant(MG_FACE* face, MG_NOEUD* no1, MG_NOEUD* no2, MG_NOEUD* no3, MG_NOEUD* no4, int& sens)
433     {
434     if (sens==0)
435     {
436     double *xyz1=no1->get_coord();
437     double *xyz2=no2->get_coord();
438     double *xyz3=no3->get_coord();
439     double uv[3];
440     face->inverser(uv,xyz1);
441     double nor[3];
442     face->calcul_normale_unitaire(uv,nor);
443     OT_VECTEUR_3D n(nor);
444     OT_VECTEUR_3D v1(xyz1,xyz3);
445     OT_VECTEUR_3D v2(xyz1,xyz2);
446     OT_VECTEUR_3D nn=v1&v2;
447     nn.norme();
448     if (n*nn>0) sens=1; else sens=-1;
449     }
450     MG_QUADRANGLE* quadnv;
451     if (sens==1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no2,no3,no4,MAGIC::ORIGINE::MAILLEUR_AUTO);
452     else if (sens==-1) quadnv=mai->ajouter_mg_quadrangle(face,no1,no4,no3,no2,MAGIC::ORIGINE::MAILLEUR_AUTO);
453     return quadnv;
454     }