ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/remailleur.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/remailleur.cpp
File size: 54785 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 283 //---------------------------------------------------------------------------
2    
3     #include "gestionversion.h"
4     #include <math.h>
5     #include "remailleur.h"
6     #include "mg_gestionnaire.h"
7     #include "mailleur3d.h"
8     #include "mailleur0d.h"
9     #include "mailleur1d.h"
10     #include "mailleur2d.h"
11     #include "ot_mathematique.h"
12     #include "mg_geometrie_outils.h"
13     //---------------------------------------------------------------------------
14     #pragma package(smart_init)
15    
16    
17    
18    
19    
20 francois 494 REMAILLEUR::REMAILLEUR(class MG_GESTIONNAIRE* g1,MG_GESTIONNAIRE* g2,MG_GEOMETRIE* geo1,MG_GEOMETRIE* geo2,class FCT_TAILLE* fct_taille1,FCT_TAILLE* fct_taille2,MG_MAILLAGE* mori,MG_MAILLAGE* mmodi,VCT_COMPARAISON_RESULTAT& cmp):MAILLEUR(false),gestorigine(g1),gestmodifie(g2),carteori(fct_taille1),cartemod(fct_taille2),rescmp(cmp),maiorigine(mori),maimodifie(mmodi),geoorigine(geo1),geomodifie(geo2)
21 francois 283 {
22     int nbvolume=geomodifie->get_nb_mg_volume();
23     lsttrifront=new TPL_LISTE_ENTITE<MG_TRIANGLE*>[nbvolume];
24     }
25    
26     REMAILLEUR::~REMAILLEUR()
27     {
28     //TPL_MAP_ENTITE<class MG_SEGMENT_FRONTIERE*>::ITERATEUR it;
29     //for (MG_SEGMENT_FRONTIERE* seg=lstsegfront.get_premier(it);seg!=NULL;seg=lstsegfront.get_suivant(it) ) delete seg;
30     delete octree;
31     delete [] lsttrifront;
32     }
33    
34    
35 couturad 966 int REMAILLEUR::maille(MG_GROUPE_TOPOLOGIQUE* mggt)
36 francois 283 {
37 couturad 966 if(maille(20)==FAIL) return FAIL;
38     return OK;
39 francois 283 }
40    
41 couturad 966 int REMAILLEUR::maille(int etape)
42 francois 283 {
43     //etape 0 initialisation
44     initialise_octree();
45     //etape 1 Destruction des entites autour des entites disparues
46 couturad 966 if (etape<1) return OK;
47 francois 283 affiche((char*)" Destruction autour des disparitions");
48     TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*> lstdetruire;
49     int nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE);
50     for (int i=0;i<nb;i++)
51     {
52     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_DISPARUE,i);
53     int dim=ele->get_dimension();
54     if (dim==0)
55     {
56     MG_SOMMET* som=(MG_SOMMET*)ele;
57     int nblien=som->get_lien_maillage()->get_nb();
58     for (int j=0;j<nblien;j++)
59     {
60     MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j);
61     if (maiorigine->get_mg_noeudid(no->get_id())!=NULL) lstdetruire.ajouter(no);
62     }
63     }
64     if (dim==1)
65     {
66     MG_ARETE* are=(MG_ARETE*)ele;
67     int nblien=are->get_lien_maillage()->get_nb();
68     for (int j=0;j<nblien;j++)
69     {
70     MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j);
71     if (maiorigine->get_mg_segmentid(seg->get_id())!=NULL)
72     {
73     lstdetruire.ajouter(seg->get_noeud1());
74     lstdetruire.ajouter(seg->get_noeud2());
75     }
76     }
77     }
78     if (dim==2)
79     {
80     MG_FACE* face=(MG_FACE*)ele;
81     int nblien=face->get_lien_maillage()->get_nb();
82     for (int j=0;j<nblien;j++)
83     {
84     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(j);
85     if (maiorigine->get_mg_triangleid(tri->get_id())!=NULL)
86     {
87     lstdetruire.ajouter(tri->get_noeud1());
88     lstdetruire.ajouter(tri->get_noeud2());
89     lstdetruire.ajouter(tri->get_noeud3());
90     }
91     }
92     }
93     }
94     TPL_MAP_ENTITE<MG_ELEMENT_MAILLAGE*>::ITERATEUR it;
95     for (MG_NOEUD* no=(MG_NOEUD*)lstdetruire.get_premier(it);no!=NULL;no=(MG_NOEUD*)lstdetruire.get_suivant(it))
96     {
97     double ereelle=0.;
98     int nbseg=no->get_lien_segment()->get_nb();
99     for (int i=0;i<nbseg;i++)
100     ereelle=ereelle+no->get_lien_segment()->get(i)->get_longueur();
101     ereelle=ereelle/nbseg;
102     detruit_noeud(no,2*ereelle);
103     }
104     //etape 2 : transfert des noeuds de sommets;
105 couturad 966 if (etape<2) return OK;
106 francois 283 affiche((char*)" Transfert sommet");
107     nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE);
108     for (int i=0;i<nb;i++)
109     {
110     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i);
111     int dim=ele->get_dimension();
112     if (dim==0)
113     {
114     MG_SOMMET* som=(MG_SOMMET*)ele;
115     int nblien=som->get_lien_maillage()->get_nb();
116     for (int j=0;j<nblien;j++)
117     {
118     MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j);
119     if ((maiorigine->get_mg_noeudid(no->get_id())!=NULL) && (no->get_nouveau_numero()==CONSERVE))
120     {
121     MG_SOMMET* nvsom=geomodifie->get_mg_sommetid(rescmp.get_liste_correspondance_modifie(som->get_id()));
122     transfert_noeud(no,nvsom);
123     }
124     }
125    
126     }
127     }
128     // etape 3 maillage 0d
129 couturad 966 if (etape<3) return OK;
130 francois 283 affiche((char*)" MAILLAGE 0D");
131     MAILLEUR0D m0d(maimodifie,geomodifie);
132     m0d.adapte();
133     // etape 4 destruction autour des nouveaux sommets
134 couturad 966 if (etape<4) return OK;
135 francois 283 affiche((char*)" Destruction autour des nouveaux sommets");
136     lstdetruire.vide();
137     nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE);
138     for (int i=0;i<nb;i++)
139     {
140     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::MODIFIE_APPARUE,i);
141     int dim=ele->get_dimension();
142     if (dim==0)
143     {
144     MG_SOMMET* som=(MG_SOMMET*)ele;
145     int nblien=som->get_lien_maillage()->get_nb();
146     for (int j=0;j<nblien;j++)
147     {
148     MG_NOEUD* no=(MG_NOEUD*)som->get_lien_maillage()->get(j);
149     if (maimodifie->get_mg_noeudid(no->get_id())!=NULL) lstdetruire.ajouter(no);
150     }
151     }
152     }
153     for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it))
154     {
155     detruit_noeud(ele,-1,1);
156     }
157     // etape 5 transferts des segments d arete
158 couturad 966 if (etape<5) return OK;
159 francois 283 /*affiche(" Transfert arete");
160     nb=rescmp.get_nb_liste_topologie(ORIGINE_CONSERVEE);
161     for (int i=0;i<nb;i++)
162     {
163     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(ORIGINE_CONSERVEE,i);
164     int dim=ele->get_dimension();
165     if (dim==1)
166     {
167     MG_ARETE* are=(MG_ARETE*)ele;
168     int nblien=are->get_lien_maillage()->get_nb();
169     for (int j=0;j<nblien;j++)
170     {
171     MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j);
172     if ((maiorigine->get_mg_segmentid(seg->get_id())!=NULL))
173     {
174     MG_NOEUD* n1=seg->get_noeud1();
175     MG_NOEUD* n2=seg->get_noeud2();
176     if (n1->get_nouveau_numero()==CONSERVE)
177     if (n2->get_nouveau_numero()==CONSERVE)
178     {
179     MG_ARETE* nvare=geomodifie->get_mg_areteid(rescmp.get_liste_correspondance(are->get_id()));
180     MG_NOEUD* nv1=get_liste_correspondance(n1);
181     MG_NOEUD* nv2=get_liste_correspondance(n2);
182     if (nv1==NULL) nv1=transfert_noeud(n1,nvare);
183     if (nv2==NULL) nv2=transfert_noeud(n2,nvare);
184     MG_SEGMENT *seg=new MG_SEGMENT(nvare,nv1,nv2,IMPOSE);
185     maimodifie->ajouter_mg_segment(seg);
186     }
187     }
188     }
189    
190     }
191     }
192     */
193     affiche((char*)" Creation des blocs de maille 1D");
194     int nbarete=geomodifie->get_nb_mg_arete();
195     nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE);
196     for (int i=0;i<nb;i++)
197     {
198     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i);
199     int dim=ele->get_dimension();
200     if (dim==1)
201     {
202 couturad 951 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > lstseg;
203 francois 283 MG_ARETE* arete=(MG_ARETE*)ele;
204     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet;
205     for (MG_ELEMENT_MAILLAGE* ele=arete->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=arete->get_lien_maillage()->get_suivant(ittet))
206     {
207     MG_SEGMENT* seg=(MG_SEGMENT*)ele;
208     if ((maiorigine->get_mg_segmentid(seg->get_id())!=NULL))
209     {
210     MG_NOEUD* n1=seg->get_noeud1();
211     MG_NOEUD* n2=seg->get_noeud2();
212     if (n1->get_nouveau_numero()==CONSERVE)
213     if (n2->get_nouveau_numero()==CONSERVE)
214     {
215     seg->change_nouveau_numero(NONTRAITE);
216 couturad 951 std::pair<unsigned long,MG_SEGMENT*> tmp(n1->get_id(),seg);
217 francois 283 lstseg.insert(tmp);
218 couturad 951 std::pair<unsigned long,MG_SEGMENT*> tmp2(n2->get_id(),seg);
219 francois 283 lstseg.insert(tmp2);
220     }
221     }
222     }
223    
224     cree_bloc_maille(lstseg,arete);
225     }
226     }
227     // etape 6 Maillage des aretes
228 couturad 966 if (etape<6) return OK;
229 francois 283 affiche((char*)" MAILLAGE 1D");
230     int nbare=geomodifie->get_nb_mg_arete();
231     for (int i=0;i<nbare;i++)
232     {
233     MG_ARETE* arete=geomodifie->get_mg_arete(i);
234     TPL_LISTE_ENTITE<double> param;
235     int typeface=arete->get_courbe()->get_type_geometrique(param);
236 couturad 951 std::multimap<unsigned long,BLOC_MAILLE_1D*,std::less <unsigned long> >::iterator it=lstb1d.begin();
237 francois 283 while (it!=lstb1d.end())
238     {
239     BLOC_MAILLE_1D *b1d=(*it).second;
240     if ((b1d->etat==NONATTACHE) && (b1d->type==typeface))
241     {
242     MG_NOEUD* no1=b1d->lst[0]->get_noeud1();
243     MG_NOEUD* no2=b1d->lst[0]->get_noeud2();
244     double xyz1[3],xyz2[3],xyz[3];
245     transfert_coord(no1->get_coord(),xyz1);
246     transfert_coord(no2->get_coord(),xyz2);
247     double t1,t2;
248     arete->inverser(t1,xyz1);
249     arete->inverser(t2,xyz2);
250     int sensidentique=1;
251     OT_VECTEUR_3D vec(xyz1,xyz2);
252     vec.norme();
253     double dxyz1[3];
254     arete->deriver(t1,dxyz1);
255     OT_VECTEUR_3D dvec(dxyz1);
256     dvec.norme();
257     double ps=dvec*vec;
258     if (ps <0) sensidentique=0;
259     if (sensidentique==0)
260     {
261     double t=t1;
262     t1=t2;
263     t2=t;
264     double xyz[3];
265     xyz[0]=xyz1[0];
266     xyz[1]=xyz1[1];
267     xyz[2]=xyz1[2];
268     xyz1[0]=xyz2[0];
269     xyz1[1]=xyz2[1];
270     xyz1[2]=xyz2[2];
271     xyz2[0]=xyz[0];
272     xyz2[1]=xyz[1];
273     xyz2[2]=xyz[2];
274     }
275     if (arete->get_courbe()->est_periodique()==1)
276     {
277     //if (t1<arete->get_tmin()) t1=t1+arete->get_courbe()->get_periode();
278     if (t2<t1+1e-6) t2=t2+arete->get_courbe()->get_periode();
279     }
280     double xyz1tmp[3],xyz2tmp[3];
281     arete->evaluer(t1,xyz1tmp);
282     arete->evaluer(t2,xyz2tmp);
283     OT_VECTEUR_3D vec1(xyz1,xyz1tmp);
284     OT_VECTEUR_3D vec2(xyz2,xyz2tmp);
285     double metrique[9];
286     cartemod->evaluer(xyz1,metrique);
287     double eps=(1./sqrt(metrique[0])*1e-6);
288     double t=0.5*(t1+t2);
289     if ((vec1.get_longueur()<eps)&&(vec2.get_longueur()<eps))
290     {
291     if (arete->get_courbe()->est_periodique()==1)
292     if (t<arete->get_tmin()) t=t+arete->get_courbe()->get_periode();
293     if ((t>=arete->get_tmin()) && (t<=arete->get_tmax()))
294     {
295     int nbseg=b1d->lst.size();
296     b1d->etat=ATTACHE;
297     for (int i=0;i<nbseg;i++)
298     {
299     MG_SEGMENT *seg=b1d->lst[i];
300     MG_NOEUD* no1=seg->get_noeud1();
301     MG_NOEUD* no2=seg->get_noeud2();
302     double xyz1[3],xy2[3];
303     transfert_coord(no1->get_coord(),xyz1);
304     transfert_coord(no2->get_coord(),xyz2);
305     MG_NOEUD* nv1=get_liste_correspondance(no1);
306     MG_NOEUD* nv2=get_liste_correspondance(no2);
307     if (nv1==NULL) nv1=transfert_noeud(no1,arete);
308     if (nv2==NULL) nv2=transfert_noeud(no2,arete);
309     MG_SEGMENT *nvseg;
310     if (sensidentique==1)
311 francois 791 nvseg=new MG_SEGMENT(arete,nv1,nv2,MAGIC::ORIGINE::IMPOSE);
312 francois 283 else
313 francois 791 nvseg=new MG_SEGMENT(arete,nv2,nv1,MAGIC::ORIGINE::IMPOSE);
314 francois 283 maimodifie->ajouter_mg_segment(nvseg);
315     }
316     }
317     }
318     }
319     it++;
320     }
321 francois 446 MAILLEUR1D m1d(maimodifie,geomodifie,cartemod,arete);
322 francois 283 m1d.adapte();
323     }
324     //cree_quadtree(maimodifie,quad,&lstsegfront);
325     // etape 7 Destruction autour des nouveaux segments
326 couturad 966 if (etape<7) return OK;
327 francois 283 affiche((char*)" Destruction autour des nouvelles aretes");
328     lstdetruire.vide();
329     /*nb=rescmp.get_nb_liste_topologie(MODIFIE_APPARUE);
330     for (int i=0;i<nb;i++)
331     {
332     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(MODIFIE_APPARUE,i);
333     int dim=ele->get_dimension();
334     if (dim==1)
335     {
336     MG_ARETE* are=(MG_ARETE*)ele;
337     int nblien=are->get_lien_maillage()->get_nb();
338     for (int j=0;j<nblien;j++)
339     {
340     MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(j);
341     if (maimodifie->get_mg_segmentid(seg->get_id())!=NULL)
342     {
343     lstnoeuddetruire.ajouter(seg->get_noeud1());
344     lstnoeuddetruire.ajouter(seg->get_noeud2());
345     }
346     }
347     }
348     }*/
349     LISTE_MG_SEGMENT::iterator itnvseg;
350     for (MG_SEGMENT* seg=maimodifie->get_premier_segment(itnvseg);seg!=NULL;seg=maimodifie->get_suivant_segment(itnvseg))
351     {
352 francois 791 if (seg->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO)
353 francois 283 {
354     lstdetruire.ajouter(seg);
355     }
356     }
357     for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it))
358     {
359     detruit_noeud(ele,-1,2);
360     }
361    
362     // etape 8 Creation des blocs de mailles 2D
363 couturad 966 if (etape<8) return OK;
364 francois 283 affiche((char*)" Creation des blocs de maille 2D");
365     nb=rescmp.get_nb_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE);
366     for (int i=0;i<nb;i++)
367     {
368     MG_ELEMENT_TOPOLOGIQUE* ele=rescmp.get_liste_topologie(VCT_COMPARAISON_RESULTAT::ORIGINE_CONSERVEE,i);
369     int dim=ele->get_dimension();
370     if (dim==2)
371     {
372 couturad 951 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > lsttri;
373 francois 283 MG_FACE* face=(MG_FACE*)ele;
374     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet;
375     int compteur=0,compteur2=0;
376     for (MG_ELEMENT_MAILLAGE* ele=face->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=face->get_lien_maillage()->get_suivant(ittet))
377     {
378     MG_TRIANGLE* tri=(MG_TRIANGLE*)ele;
379     if ((maiorigine->get_mg_triangleid(tri->get_id())!=NULL))
380     {
381     MG_NOEUD* n1=tri->get_noeud1();
382     MG_NOEUD* n2=tri->get_noeud2();
383     MG_NOEUD* n3=tri->get_noeud3();
384     compteur2++;
385     if (n1->get_nouveau_numero()==CONSERVE)
386     if (n2->get_nouveau_numero()==CONSERVE)
387     if (n3->get_nouveau_numero()==CONSERVE)
388     {
389     tri->change_nouveau_numero(NONTRAITE);
390 couturad 951 std::pair<unsigned long,MG_TRIANGLE*> tmp(n1->get_id(),tri);
391 francois 283 lsttri.insert(tmp);
392 couturad 951 std::pair<unsigned long,MG_TRIANGLE*> tmp2(n2->get_id(),tri);
393 francois 283 lsttri.insert(tmp2);
394 couturad 951 std::pair<unsigned long,MG_TRIANGLE*> tmp3(n3->get_id(),tri);
395 francois 283 lsttri.insert(tmp3);
396     compteur++;
397     }
398     }
399     }
400    
401     cree_bloc_maille(lsttri,face);
402     }
403     }
404     // etape 9 MAILLAGE 2D
405 couturad 966 if (etape<9) return OK;
406 francois 283 affiche((char*)" MAILLAGE 2D");
407     nbfacemod=geomodifie->get_nb_mg_face();
408     for (int i=0;i<nbfacemod;i++)
409     {
410     MG_GEOMETRIE_OUTILS ot;
411     TPL_LISTE_ENTITE<MG_TRIANGLE*> lsttricontraint;
412     MG_FACE* face=geomodifie->get_mg_face(i);
413     TPL_LISTE_ENTITE<double> param;
414     int typeface=face->get_surface()->get_type_geometrique(param);
415 couturad 951 std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator it=lstb2d.begin();
416 francois 283 while (it!=lstb2d.end())
417     {
418     BLOC_MAILLE_2D *b2d=(*it).second;
419     if ((b2d->etat==NONATTACHE) && (b2d->type==typeface))
420     {
421     MG_NOEUD* no1=b2d->lst[0]->get_noeud1();
422     MG_NOEUD* no2=b2d->lst[0]->get_noeud2();
423     MG_NOEUD* no3=b2d->lst[0]->get_noeud3();
424     double uv[2],uv1[2],uv2[2],uv3[2];
425     double xyz1[3],xyz2[3],xyz3[3];
426     transfert_coord(no1->get_coord(),xyz1);
427     transfert_coord(no2->get_coord(),xyz2);
428     transfert_coord(no3->get_coord(),xyz3);
429     face->inverser(uv1,xyz1);
430     face->inverser(uv2,xyz2);
431     face->inverser(uv3,xyz3);
432 francois 317 if (face->get_surface()->est_periodique_u()==1)
433     {
434     double eps=1e-10*face->get_surface()->get_periode_u();
435     if (uv1[0]<-eps) uv1[0]=uv1[0]+face->get_surface()->get_periode_u();
436     if (uv1[0]>face->get_surface()->get_periode_u()-eps) uv1[0]=uv1[0]-face->get_surface()->get_periode_u();
437     if (uv2[0]<-eps) uv2[0]=uv2[0]+face->get_surface()->get_periode_u();
438     if (uv2[0]>face->get_surface()->get_periode_u()-eps) uv2[0]=uv2[0]-face->get_surface()->get_periode_u();
439     if (uv3[0]<-eps) uv3[0]=uv3[0]+face->get_surface()->get_periode_u();
440     if (uv3[0]>face->get_surface()->get_periode_u()-eps) uv3[0]=uv3[0]-face->get_surface()->get_periode_u();
441     }
442     if (face->get_surface()->est_periodique_v()==1)
443     {
444     double eps=1e-10*face->get_surface()->get_periode_v();
445     if (uv1[1]<-eps) uv1[1]=uv1[1]+face->get_surface()->get_periode_v();
446     if (uv1[1]>face->get_surface()->get_periode_v()-eps) uv1[1]=uv1[1]-face->get_surface()->get_periode_v();
447     if (uv2[1]<-eps) uv2[1]=uv2[1]+face->get_surface()->get_periode_v();
448     if (uv2[1]>face->get_surface()->get_periode_v()-eps) uv2[1]=uv2[1]-face->get_surface()->get_periode_v();
449     if (uv3[1]<-eps) uv3[1]=uv3[1]+face->get_surface()->get_periode_v();
450     if (uv3[1]>face->get_surface()->get_periode_v()-eps) uv3[1]=uv3[1]-face->get_surface()->get_periode_v();
451     }
452    
453 francois 283 double xyz1tmp[3];
454     face->evaluer(uv1,xyz1tmp);
455     double xyz2tmp[3];
456     face->evaluer(uv2,xyz2tmp);
457     double xyz3tmp[3];
458     face->evaluer(uv3,xyz3tmp);
459     OT_VECTEUR_3D vec1(xyz1,xyz1tmp);
460     OT_VECTEUR_3D vec2(xyz2,xyz2tmp);
461     OT_VECTEUR_3D vec3(xyz3,xyz3tmp);
462     double metrique[9];
463     cartemod->evaluer(xyz1,metrique);
464     double eps=(1./sqrt(metrique[0])*1e-6);
465     if (vec1.get_longueur()<eps)
466     if (vec2.get_longueur()<eps)
467     if (vec3.get_longueur()<eps)
468     {
469     OT_DECALAGE_PARAMETRE deca(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
470     double du=deca.calcul_decalage_parametre_u(uv1[0]);
471     double dv=deca.calcul_decalage_parametre_v(uv1[1]);
472     uv[0]=0.333333333333333333*(deca.decalage_parametre_u(uv1[0],du)+deca.decalage_parametre_u(uv2[0],du)+deca.decalage_parametre_u(uv3[0],du));
473     uv[1]=0.333333333333333333*(deca.decalage_parametre_v(uv1[1],dv)+deca.decalage_parametre_v(uv2[1],dv)+deca.decalage_parametre_v(uv3[1],dv));
474     uv[0]=deca.decalage_parametre_u(uv[0],-du);
475     uv[1]=deca.decalage_parametre_v(uv[1],-dv);
476     double dist=ot.calcule_distance_contour_face_uv(uv,face);
477     if (dist>0.)
478     {
479     int sensidentique=1;
480     OT_VECTEUR_3D vec12(xyz1,xyz2);
481     OT_VECTEUR_3D vec13(xyz1,xyz3);
482     double normal[3];
483     face->calcul_normale_unitaire(uv1,normal);
484     OT_VECTEUR_3D nor=vec13 & vec12;
485     nor.norme();
486     if ((nor*normal)<0.) sensidentique=0;
487     int nbtri=b2d->lst.size();
488     b2d->etat=ATTACHE;
489     //cout << " attachment du bloc " << b2d->face->get_id();
490     for (int i=0;i<nbtri;i++)
491     {
492     MG_TRIANGLE *tri=b2d->lst[i];
493     MG_NOEUD* no1=tri->get_noeud1();
494     MG_NOEUD* no2=tri->get_noeud2();
495     MG_NOEUD* no3=tri->get_noeud3();
496     double xyz1[3],xy2[3],xyz3[3];
497     transfert_coord(no1->get_coord(),xyz1);
498     transfert_coord(no2->get_coord(),xyz2);
499     transfert_coord(no3->get_coord(),xyz3);
500 francois 791 MG_NOEUD* nvno1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
501     MG_NOEUD* nvno2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
502     MG_NOEUD* nvno3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
503 francois 283 MG_TRIANGLE* nvtri;
504     if (sensidentique==1)
505 francois 791 nvtri=new MG_TRIANGLE(NULL,nvno1,nvno2,nvno3,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE);
506 francois 283 else
507 francois 791 nvtri=new MG_TRIANGLE(NULL,nvno2,nvno1,nvno3,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE);
508 francois 283 lsttricontraint.ajouter(nvtri);
509     nvno1->change_nouveau_numero(no1->get_id());
510     nvno2->change_nouveau_numero(no2->get_id());
511     nvno3->change_nouveau_numero(no3->get_id());
512     }
513     }
514     }
515     }
516     it++;
517     }
518 francois 446 MAILLEUR2D m2d(maimodifie,geomodifie,cartemod,face);
519 francois 283 char mess[50];
520     sprintf(mess," Face %i identificateur %lu",i,face->get_id());
521     affiche(mess);
522     m2d.maille(face,NULL,&(lsttricontraint));
523     int nbtricon=lsttricontraint.get_nb();
524     for (int i=0;i<nbtricon;i++)
525     {
526     MG_TRIANGLE* tri=lsttricontraint.get(0);
527     MG_NOEUD* noeud1=tri->get_noeud1();
528     MG_NOEUD* noeud2=tri->get_noeud2();
529     MG_NOEUD* noeud3=tri->get_noeud3();
530     lsttricontraint.supprimer(tri);
531     delete tri;
532     delete noeud1;
533     delete noeud2;
534     delete noeud3;
535     }
536     }
537 couturad 951 std::multimap<unsigned long,BLOC_MAILLE_2D*,std::less <unsigned long> >::iterator itfin2=lstb2d.begin();
538 francois 283 while (itfin2!=lstb2d.end())
539     {
540     delete (*itfin2).second;
541     itfin2++;
542     }
543     cree_liste_frontiere(maimodifie);
544     // etape 10 Destruction autour des nouveaux triangles
545 couturad 966 if (etape<10) return OK;
546 francois 283 affiche((char*)" Destruction autour des nouvelles faces");
547     lstdetruire.vide();
548     LISTE_MG_TRIANGLE::iterator itnvtri;
549     for (MG_TRIANGLE* tri=maimodifie->get_premier_triangle(itnvtri);tri!=NULL;tri=maimodifie->get_suivant_triangle(itnvtri))
550     {
551 francois 791 if (tri->get_origine()==MAGIC::ORIGINE::MAILLEUR_AUTO)
552 francois 283 {
553     lstdetruire.ajouter(tri);
554     }
555     }
556     for (MG_ELEMENT_MAILLAGE* ele=lstdetruire.get_premier(it);ele!=NULL;ele=lstdetruire.get_suivant(it))
557     {
558     detruit_noeud(ele,-1,3);
559     }
560     // etape 11 Creation des blocs de mailles 3D
561 couturad 966 if (etape<11) return OK;
562 francois 283 affiche((char*)" Creation des blocs de maille 3D");
563     int nbvolume=geoorigine->get_nb_mg_volume();
564     for (int i=0;i<nbvolume;i++)
565     {
566 couturad 951 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > lsttet;
567 francois 283 MG_VOLUME* vol=geoorigine->get_mg_volume(i);
568     int nblien=vol->get_lien_maillage()->get_nb();
569     TPL_SET<MG_ELEMENT_MAILLAGE*>::ITERATEUR ittet;
570     for (MG_ELEMENT_MAILLAGE* ele=vol->get_lien_maillage()->get_premier(ittet);ele!=NULL;ele=vol->get_lien_maillage()->get_suivant(ittet))
571     {
572     MG_TETRA* tet=(MG_TETRA*)ele;
573     if ((maiorigine->get_mg_tetraid(tet->get_id())!=NULL))
574     {
575     MG_NOEUD* n1=tet->get_noeud1();
576     MG_NOEUD* n2=tet->get_noeud2();
577     MG_NOEUD* n3=tet->get_noeud3();
578     MG_NOEUD* n4=tet->get_noeud4();
579     if (n1->get_nouveau_numero()==CONSERVE)
580     if (n2->get_nouveau_numero()==CONSERVE)
581     if (n3->get_nouveau_numero()==CONSERVE)
582     if (n4->get_nouveau_numero()==CONSERVE)
583     {
584     tet->change_nouveau_numero(NONTRAITE);
585 couturad 951 std::pair<unsigned long,MG_TETRA*> tmp(n1->get_id(),tet);
586 francois 283 lsttet.insert(tmp);
587 couturad 951 std::pair<unsigned long,MG_TETRA*> tmp2(n2->get_id(),tet);
588 francois 283 lsttet.insert(tmp2);
589 couturad 951 std::pair<unsigned long,MG_TETRA*> tmp3(n3->get_id(),tet);
590 francois 283 lsttet.insert(tmp3);
591 couturad 951 std::pair<unsigned long,MG_TETRA*> tmp4(n4->get_id(),tet);
592 francois 283 lsttet.insert(tmp4);
593     }
594     }
595    
596     }
597     cree_bloc_maille(lsttet,vol);
598     }
599     // etape 12 Maillage 3D
600 couturad 966 if (etape<12) return OK;
601 francois 283 affiche((char*)" MAILLEUR 3D");
602     nbvolume=geomodifie->get_nb_mg_volume();
603     for (int i=0;i<nbvolume;i++)
604     {
605     TPL_LISTE_ENTITE<MG_TETRA*> lsttetcontraint;
606     MG_VOLUME* vol=geomodifie->get_mg_volume(i);
607 couturad 951 std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator it=lstb3d.begin();
608 francois 283 while (it!=lstb3d.end())
609     {
610     BLOC_MAILLE_3D *b3d=(*it).second;
611     if (b3d->etat==NONATTACHE)
612     {
613     MG_NOEUD* no1=b3d->lst[0]->get_noeud1();
614     MG_NOEUD* no2=b3d->lst[0]->get_noeud2();
615     MG_NOEUD* no3=b3d->lst[0]->get_noeud3();
616     MG_NOEUD* no4=b3d->lst[0]->get_noeud4();
617     double xyz1[3],xyz2[3],xyz3[3],xyz4[3],xyz[3];
618     transfert_coord(no1->get_coord(),xyz1);
619     transfert_coord(no2->get_coord(),xyz2);
620     transfert_coord(no3->get_coord(),xyz3);
621     transfert_coord(no4->get_coord(),xyz4);
622     xyz[0]=0.25*(xyz1[0]+xyz2[0]+xyz3[0]+xyz4[0]);
623     xyz[1]=0.25*(xyz1[1]+xyz2[1]+xyz3[1]+xyz4[1]);
624     xyz[2]=0.25*(xyz1[2]+xyz2[2]+xyz3[2]+xyz4[2]);
625     int res=point_appartient_volume(xyz,i);
626     if (res==1)
627     {
628     int nbtet=b3d->lst.size();
629     b3d->etat=ATTACHE;
630     //cout << "bloc recupere " << b3d->get_id() << endl;
631     for (int j=0;j<nbtet;j++)
632     {
633     MG_TETRA *tet=b3d->lst[j];
634     MG_NOEUD* no1=tet->get_noeud1();
635     MG_NOEUD* no2=tet->get_noeud2();
636     MG_NOEUD* no3=tet->get_noeud3();
637     MG_NOEUD* no4=tet->get_noeud4();
638     double xyz1[3],xy2[3],xyz3[3],xyz4[3];
639     transfert_coord(no1->get_coord(),xyz1);
640     transfert_coord(no2->get_coord(),xyz2);
641     transfert_coord(no3->get_coord(),xyz3);
642     transfert_coord(no4->get_coord(),xyz4);
643 francois 791 MG_NOEUD* nvno1=new MG_NOEUD(NULL,xyz1[0],xyz1[1],xyz1[2],MAGIC::ORIGINE::IMPOSE);
644     MG_NOEUD* nvno2=new MG_NOEUD(NULL,xyz2[0],xyz2[1],xyz2[2],MAGIC::ORIGINE::IMPOSE);
645     MG_NOEUD* nvno3=new MG_NOEUD(NULL,xyz3[0],xyz3[1],xyz3[2],MAGIC::ORIGINE::IMPOSE);
646     MG_NOEUD* nvno4=new MG_NOEUD(NULL,xyz4[0],xyz4[1],xyz4[2],MAGIC::ORIGINE::IMPOSE);
647     MG_TETRA* nvtet=new MG_TETRA(NULL,nvno1,nvno2,nvno3,nvno4,NULL,NULL,NULL,NULL,MAGIC::ORIGINE::IMPOSE);
648 francois 283 lsttetcontraint.ajouter(nvtet);
649     nvno1->change_nouveau_numero(no1->get_id());
650     nvno2->change_nouveau_numero(no2->get_id());
651     nvno3->change_nouveau_numero(no3->get_id());
652     nvno4->change_nouveau_numero(no4->get_id());
653     nvtet->change_nouveau_numero(tet->get_id());
654     }
655     }
656     }
657     it++;
658     }
659 francois 446 MAILLEUR3D m3d(maimodifie,geomodifie,cartemod,vol);
660 francois 283 char mess[50];
661     sprintf(mess," Volume %i identificateur %lu",i,vol->get_id());
662     affiche(mess);
663 francois 425 m3d.active_affichage(affiche2);
664 francois 283 m3d.maille(vol,NULL,&(lsttetcontraint));
665     int nbtetcon=lsttetcontraint.get_nb();
666     for (int i=0;i<nbtetcon;i++)
667     {
668     MG_TETRA* tet=lsttetcontraint.get(0);
669     MG_NOEUD* noeud1=tet->get_noeud1();
670     MG_NOEUD* noeud2=tet->get_noeud2();
671     MG_NOEUD* noeud3=tet->get_noeud3();
672     MG_NOEUD* noeud4=tet->get_noeud4();
673     lsttetcontraint.supprimer(tet);
674     delete tet;
675     delete noeud1;
676     delete noeud2;
677     delete noeud3;
678     delete noeud4;
679     }
680     }
681 couturad 951 std::multimap<unsigned long,BLOC_MAILLE_3D*,std::less <unsigned long> >::iterator itfin3=lstb3d.begin();
682 francois 283 while (itfin3!=lstb3d.end())
683     {
684     delete (*itfin3).second;
685     itfin3++;
686     }
687     // etape 13 Recuperation des correspondances
688 couturad 966 if (etape<13) return OK;
689 francois 283 affiche((char*)" Sauvegarde des correspondances");
690     LISTE_MG_NOEUD::iterator itnoeud;
691     for (MG_NOEUD* noeud=maimodifie->get_premier_noeud(itnoeud);noeud!=NULL;noeud=maimodifie->get_suivant_noeud(itnoeud))
692     {
693 francois 791 if (noeud->get_origine()==MAGIC::ORIGINE::IMPOSE)
694 francois 283 rescmp.ajouter_correspondance(noeud->get_nouveau_numero(),noeud->get_id());
695     }
696     LISTE_MG_TETRA::iterator ittet;
697     for (MG_TETRA* tet=maimodifie->get_premier_tetra(ittet);tet!=NULL;tet=maimodifie->get_suivant_tetra(ittet))
698     {
699 francois 791 if (tet->get_origine()==MAGIC::ORIGINE::IMPOSE)
700 francois 283 rescmp.ajouter_correspondance(tet->get_nouveau_numero(),tet->get_id());
701     }
702 couturad 966 return OK;
703 francois 283
704     }
705    
706    
707     void REMAILLEUR::initialise_octree(void)
708     {
709 francois 467 BOITE_3D boite=carteori->get_boite_3D();
710     double xmin=boite.get_xmin();
711     double ymin=boite.get_ymin();
712     double zmin=boite.get_zmin();
713     double xmax=boite.get_xmax();
714     double ymax=boite.get_ymax();
715     double zmax=boite.get_zmax();
716     octree=new TPL_OCTREE_FCT<MG_NOEUD*,FCT_TAILLE >;
717     octree->initialiser(*carteori,xmin,ymin,zmin,xmax,ymax,zmax);
718 francois 283 LISTE_MG_NOEUD::iterator it;
719     for (MG_NOEUD* noeud=maiorigine->get_premier_noeud(it);noeud!=NULL;noeud=maiorigine->get_suivant_noeud(it))
720     {
721     noeud->change_nouveau_numero(CONSERVE);
722     octree->inserer(noeud);
723     }
724    
725     }
726    
727     void REMAILLEUR::detruit_noeud(MG_ELEMENT_MAILLAGE* elebase,double distance,int type)
728     {
729 francois 791 if (elebase->get_origine()!=MAGIC::ORIGINE::MAILLEUR_AUTO) return;
730 francois 283 double xyz[3];
731     double distmin;
732     OT_VECTEUR_3D direction;
733     if (type==0)
734     {
735     MG_NOEUD* no=(MG_NOEUD*)elebase;
736     OT_VECTEUR_3D vecnoeud(no->get_coord());
737     //OT_VECTEUR_3D vecnoeud2=rescmp.change_coord_mod_ori(vecnoeud);
738     OT_VECTEUR_3D vecnoeud2=vecnoeud;
739     xyz[0]=vecnoeud2.get_x();
740     xyz[1]=vecnoeud2.get_y();
741     xyz[2]=vecnoeud2.get_z();
742     }
743     if (type==1)
744     {
745     MG_NOEUD* no=(MG_NOEUD*)elebase;
746     OT_VECTEUR_3D vecnoeud(no->get_coord());
747     OT_VECTEUR_3D vecnoeud2=rescmp.change_coord_mod_ori(vecnoeud);
748     xyz[0]=vecnoeud2.get_x();
749     xyz[1]=vecnoeud2.get_y();
750     xyz[2]=vecnoeud2.get_z();
751     }
752     if (type==2)
753     {
754     MG_SEGMENT* seg=(MG_SEGMENT*)elebase;
755     OT_VECTEUR_3D vecnoeud1(seg->get_noeud1()->get_coord());
756     OT_VECTEUR_3D vecnoeud2(seg->get_noeud2()->get_coord());
757     OT_VECTEUR_3D vecnoeud=0.5*(vecnoeud1+vecnoeud2);
758     OT_VECTEUR_3D vecnoeud3=rescmp.change_coord_mod_ori(vecnoeud);
759     xyz[0]=vecnoeud3.get_x();
760     xyz[1]=vecnoeud3.get_y();
761     xyz[2]=vecnoeud3.get_z();
762     direction=vecnoeud2-vecnoeud1;
763     distmin=direction.get_longueur()/2.;
764     direction.norme();
765     }
766     if (type==3)
767     {
768     MG_TRIANGLE* tri=(MG_TRIANGLE*)elebase;
769     OT_VECTEUR_3D vecnoeud1(tri->get_noeud1()->get_coord());
770     OT_VECTEUR_3D vecnoeud2(tri->get_noeud2()->get_coord());
771     OT_VECTEUR_3D vecnoeud3(tri->get_noeud3()->get_coord());
772     OT_VECTEUR_3D vecnoeud=0.3333333333333333*(vecnoeud1+vecnoeud2+vecnoeud3);
773     OT_VECTEUR_3D vecnoeud4=rescmp.change_coord_mod_ori(vecnoeud);
774     xyz[0]=vecnoeud4.get_x();
775     xyz[1]=vecnoeud4.get_y();
776     xyz[2]=vecnoeud4.get_z();
777     distmin=std::max((vecnoeud-vecnoeud1).get_longueur(),(vecnoeud-vecnoeud2).get_longueur());
778     distmin=std::max((vecnoeud-vecnoeud3).get_longueur(),distmin);
779     direction=(vecnoeud3-vecnoeud1)&(vecnoeud2-vecnoeud1);
780     direction.norme();
781     }
782     TPL_MAP_ENTITE<MG_NOEUD*> lst;
783     double Ea,Eb;
784     if (type!=0)
785     {
786     double m[9];
787     carteori->evaluer(xyz,m);
788     Ea=1./sqrt(m[0]);
789     }
790     octree->rechercher(xyz[0],xyz[1],xyz[2],2*Ea,lst);
791     double alpha=1.05;
792     distmin=distmin*alpha;
793     LISTE_MG_NOEUD::iterator it;
794     for (MG_NOEUD* noeud=lst.get_premier(it);noeud!=NULL;noeud=lst.get_suivant(it))
795     {
796     double *xyztmp=noeud->get_coord();
797     OT_VECTEUR_3D vec(xyz,xyztmp);
798     if (type!=0)
799     {
800     double m[9];
801     carteori->evaluer(xyztmp,m);
802     Eb=1./sqrt(m[0]);
803     distance=std::max(1.5*Ea,1.5*Eb);
804     distance=std::max(distance,2.6*fabs(Ea-Eb));
805     }
806     if (type==2)
807     {
808     double cosinus=vec*direction/vec.get_longueur();
809     double sinus=sqrt(1-cosinus*cosinus);
810     double facteur;
811     if (OPERATEUR::egal(cosinus,0.,0.000001)) facteur=distance;
812     else
813     {
814     double delta=sinus*sinus+4.*distance*distance/distmin/distmin*cosinus*cosinus;
815     facteur=(-sinus+sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin;
816     distance=facteur;
817     }
818     }
819     if (type==3)
820     {
821     double sinus=vec*direction/vec.get_longueur();
822     if (sinus>-0.0000001)
823     {
824     double cosinus=sqrt(1-sinus*sinus);
825     double facteur;
826     if (OPERATEUR::egal(cosinus,0.,0.000001)) facteur=distance;
827     else
828     {
829     double delta=sinus*sinus+4*distance*distance/distmin/distmin*cosinus*cosinus;
830     facteur=(-sinus+sqrt(delta))/2./distance/cosinus/cosinus*distmin*distmin;
831     distance=facteur;
832     }
833     }
834    
835     }
836     if (vec.get_longueur()<distance)
837     {
838     noeud->change_nouveau_numero(DETRUIT);
839     }
840    
841     }
842    
843     }
844    
845    
846     /*void REMAILLEUR::cree_quadtree(MG_MAILLAGE* mai,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad,TPL_MAP_ENTITE<MG_SEGMENT_FRONTIERE*> *lstsegfront)
847     {
848     int nbface=mai->get_mg_geometrie()->get_nb_mg_face();
849     for (int i=0;i<nbface;i++)
850     {
851     ((quad[i]))=new TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*>;
852     TPL_LISTE_ENTITE<MG_NOEUD*> lstn;
853     double umax=-1e300;
854     double vmax=-1e300;
855     double umin=1e300;
856     double vmin=1e300;
857     MG_FACE* face=mai->get_mg_geometrie()->get_mg_face(i);
858     int nbboucle=face->get_nb_mg_boucle();
859     int nbsegfravant=lstsegfront->get_nb();
860     for (int j=0;j<nbboucle;j++)
861     {
862     MG_BOUCLE* bou=face->get_mg_boucle(j);
863     int nbarete=bou->get_nb_mg_coarete();
864     for (int k=0;k<nbarete;k++)
865     {
866     MG_ARETE* are=bou->get_mg_coarete(k)->get_arete();
867     int nbseg=are->get_lien_maillage()->get_nb();
868     for (int l=0;l<nbseg;l++)
869     {
870     MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(l);
871     if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
872     double *xyz=seg->get_noeud1()->get_coord();
873     double uv[2];
874     face->inverser(uv,xyz);
875     seg->get_noeud1()->change_u(uv[0]);
876     seg->get_noeud1()->change_v(uv[1]);
877     xyz=seg->get_noeud2()->get_coord();
878     face->inverser(uv,xyz);
879     seg->get_noeud2()->change_u(uv[0]);
880     seg->get_noeud2()->change_v(uv[1]);
881     lstn.ajouter(seg->get_noeud2());
882     if (uv[0]<umin) umin=uv[0];
883     if (uv[0]>umax) umax=uv[0];
884     if (uv[1]<vmin) vmin=uv[1];
885     if (uv[1]>vmax) vmax=uv[1];
886     MG_SEGMENT_FRONTIERE* segfr=new MG_SEGMENT_FRONTIERE(seg);
887     lstsegfront->ajouter(segfr);
888     }
889     }
890     }
891     double periodeenu=face->get_surface()->get_periode_u();
892     double periodeenv=face->get_surface()->get_periode_v();
893     if (periodeenu!=0.0)
894     {
895     umin=0.;
896     umax=periodeenu;
897     }
898     else
899     {
900     double diff=umax-umin;
901     umin=umin-0.125*diff;
902     umax=umax+0.125*diff;
903     }
904     if (periodeenv!=0.0)
905     {
906     vmin=0.;
907     vmax=periodeenv;
908     }
909     else
910     {
911     double diff=vmax-vmin;
912     vmin=vmin-0.125*diff;
913     vmax=vmax+0.125*diff;
914     }
915     (quad[i])->initialiser(&lstn,1,umin,vmin,umax,vmax,face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
916     int nbsegfr=lstsegfront->get_nb();
917     for (int j=nbsegfravant;j<nbsegfr;j++)
918     {
919     double *uv=lstsegfront->get(j)->get_uv1();
920     uv[0]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_u();
921     uv[1]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_v();
922     uv=lstsegfront->get(j)->get_uv2();
923     uv[0]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_u();
924     uv[1]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_v();
925     (quad[i])->inserer( lstsegfront->get(j));
926     }
927     }
928    
929     }
930     */
931     void REMAILLEUR::cree_liste_frontiere(MG_MAILLAGE* mai)
932     {
933     int nbvolume=mai->get_mg_geometrie()->get_nb_mg_volume();
934     for (int i=0;i<nbvolume;i++)
935     {
936     MG_VOLUME* vol=mai->get_mg_geometrie()->get_mg_volume(i);
937     int nbco=vol->get_nb_mg_coquille();
938     for (int j=0;j<nbco;j++)
939     {
940     MG_COQUILLE* coq=vol->get_mg_coquille(j);
941     int nbface=coq->get_nb_mg_coface();
942     for (int k=0;k<nbface;k++)
943     {
944     MG_FACE* face=coq->get_mg_coface(k)->get_face();
945     int nbseg=face->get_lien_maillage()->get_nb();
946     for (int l=0;l<nbseg;l++)
947     {
948     MG_TRIANGLE* tri=(MG_TRIANGLE*)face->get_lien_maillage()->get(l);
949     if (mai->get_mg_triangleid(tri->get_id())==NULL) continue;
950     lsttrifront[i].ajouter(tri);
951     }
952     }
953     }
954    
955    
956     }
957     }
958    
959    
960    
961     void REMAILLEUR::ajouter_liste_correspondance_noeud(MG_NOEUD* n1,MG_NOEUD* n2)
962     {
963     CORRESPONDANCENOEUD corr(n1,n2);
964 couturad 951 std::pair<unsigned long,CORRESPONDANCENOEUD> tmp(n1->get_id(),corr);
965 francois 283 lstcorrnoeud.insert(tmp);
966     }
967    
968     MG_NOEUD* REMAILLEUR::get_liste_correspondance(MG_NOEUD* n1)
969     {
970     MG_NOEUD *n2=NULL;
971     std::map<unsigned long,CORRESPONDANCENOEUD,std::less<unsigned long> >::iterator j=lstcorrnoeud.find(n1->get_id());
972     if (j!=lstcorrnoeud.end())
973     n2=(*j).second.noeudmod;
974     return n2;
975     }
976    
977    
978     MG_NOEUD* REMAILLEUR::transfert_noeud(MG_NOEUD* no,MG_ELEMENT_TOPOLOGIQUE* ele)
979     {
980     double *xyz=no->get_coord();
981     OT_VECTEUR_3D pt(xyz);
982     OT_VECTEUR_3D nvpt=rescmp.change_coord_ori_mod(pt);
983 francois 791 MG_NOEUD* noeud=new MG_NOEUD(ele,nvpt.get_x(),nvpt.get_y(),nvpt.get_z(),MAGIC::ORIGINE::IMPOSE);
984 francois 283 maimodifie->ajouter_mg_noeud(noeud);
985     ajouter_liste_correspondance_noeud(no,noeud);
986     noeud->change_nouveau_numero(no->get_id());
987     return noeud;
988     }
989    
990     void REMAILLEUR::transfert_coord(double *xyz,double *xyz2)
991     {
992     OT_VECTEUR_3D pt(xyz);
993     OT_VECTEUR_3D nvpt=rescmp.change_coord_ori_mod(pt);
994     xyz2[0]=nvpt.get_x();
995     xyz2[1]=nvpt.get_y();
996     xyz2[2]=nvpt.get_z();
997     return;
998     }
999    
1000 couturad 951 void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > &lst,MG_ARETE* arete)
1001 francois 283 {
1002     while (lst.size()>0)
1003     {
1004 couturad 951 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.begin();
1005 francois 283 MG_SEGMENT* seg=(*it).second;
1006     lst.erase(it);
1007     TPL_LISTE_ENTITE<double> param;
1008     BLOC_MAILLE_1D *b1d=new BLOC_MAILLE_1D(arete,arete->get_courbe()->get_type_geometrique(param));
1009 couturad 951 std::pair<unsigned long,BLOC_MAILLE_1D*> tmp(b1d->get_id(),b1d);
1010 francois 283 lstb1d.insert(tmp);
1011     b1d->lst.push_back(seg);
1012     seg->change_nouveau_numero(TRAITE);
1013     char mess[255];
1014 francois 479 sprintf(mess," Arete %lu , Bloc %d",arete->get_id(),(int)lstb1d.size());
1015 francois 283 //affiche(mess);
1016     int num=0;
1017     while (num!=b1d->lst.size())
1018     {
1019     MG_SEGMENT* itseg=b1d->lst[num++];
1020     MG_SEGMENT* seg=trouve_segment(lst,itseg->get_noeud1());
1021     while (seg!=NULL)
1022     {
1023     if (seg->get_nouveau_numero()==NONTRAITE)
1024     {
1025     b1d->lst.push_back(seg);
1026     seg->change_nouveau_numero(TRAITE);
1027     }
1028     seg=trouve_segment(lst,itseg->get_noeud1());
1029     }
1030     seg=trouve_segment(lst,itseg->get_noeud2());
1031     while (seg!=NULL)
1032     {
1033     if (seg->get_nouveau_numero()==NONTRAITE)
1034     {
1035     b1d->lst.push_back(seg);
1036     seg->change_nouveau_numero(TRAITE);
1037     }
1038     seg=trouve_segment(lst,itseg->get_noeud2());
1039     }
1040     }
1041    
1042 francois 479 sprintf(mess," Segment %d ",(int)b1d->lst.size());
1043 francois 283 //affiche(mess);
1044     }
1045     }
1046    
1047 couturad 951 void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > &lst,MG_FACE* face)
1048 francois 283 {
1049     while (lst.size()>0)
1050     {
1051 couturad 951 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.begin();
1052 francois 283 MG_TRIANGLE* tri=(*it).second;
1053     lst.erase(it);
1054     TPL_LISTE_ENTITE<double> param;
1055     BLOC_MAILLE_2D *b2d=new BLOC_MAILLE_2D(geoorigine->get_mg_faceid(face->get_id()),face->get_surface()->get_type_geometrique(param));
1056 couturad 951 std::pair<unsigned long,BLOC_MAILLE_2D*> tmp(b2d->get_id(),b2d);
1057 francois 283 lstb2d.insert(tmp);
1058     b2d->lst.push_back(tri);
1059     tri->change_nouveau_numero(TRAITE);
1060     char mess[255];
1061 francois 479 sprintf(mess," Face %lu , Bloc %d",face->get_id(),(int)lstb2d.size());
1062 francois 283 //affiche(mess);
1063     int num=0;
1064     while (num!=b2d->lst.size())
1065     {
1066     MG_TRIANGLE* ittri=b2d->lst[num++];
1067     MG_TRIANGLE* tri=trouve_triangle(lst,ittri->get_noeud1());
1068     while (tri!=NULL)
1069     {
1070     if (tri->get_nouveau_numero()==NONTRAITE)
1071     {
1072     b2d->lst.push_back(tri);
1073     tri->change_nouveau_numero(TRAITE);
1074     }
1075     tri=trouve_triangle(lst,ittri->get_noeud1());
1076     }
1077     tri=trouve_triangle(lst,ittri->get_noeud2());
1078     while (tri!=NULL)
1079     {
1080     if (tri->get_nouveau_numero()==NONTRAITE)
1081     {
1082     b2d->lst.push_back(tri);
1083     tri->change_nouveau_numero(TRAITE);
1084     }
1085     tri=trouve_triangle(lst,ittri->get_noeud2());
1086     }
1087     tri=trouve_triangle(lst,ittri->get_noeud3());
1088     while (tri!=NULL)
1089     {
1090     if (tri->get_nouveau_numero()==NONTRAITE)
1091     {
1092     b2d->lst.push_back(tri);
1093     tri->change_nouveau_numero(TRAITE);
1094     }
1095     tri=trouve_triangle(lst,ittri->get_noeud3());
1096     }
1097     }
1098    
1099 francois 479 sprintf(mess," Triangle %d ",(int)b2d->lst.size());
1100 francois 283 //affiche(mess);
1101     }
1102     }
1103    
1104 couturad 951 void REMAILLEUR::cree_bloc_maille(std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > &lst,MG_VOLUME* vol)
1105 francois 283 {
1106     while (lst.size()>0)
1107     {
1108 couturad 951 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.begin();
1109 francois 283 MG_TETRA* tet=(*it).second;
1110     lst.erase(it);
1111     BLOC_MAILLE_3D *b3d=new BLOC_MAILLE_3D(geoorigine->get_mg_volumeid(vol->get_id()));
1112 couturad 951 std::pair<unsigned long,BLOC_MAILLE_3D*> tmp(b3d->get_id(),b3d);
1113 francois 283 lstb3d.insert(tmp);
1114     b3d->lst.push_back(tet);
1115     tet->change_nouveau_numero(TRAITE);
1116     char mess[255];
1117 francois 479 sprintf(mess," Volume %lu , Bloc %d",vol->get_id(),(int)lstb3d.size());
1118 francois 283 //affiche(mess);
1119     int num=0;
1120     while (num!=b3d->lst.size())
1121     {
1122     MG_TETRA* ittet=b3d->lst[num++];
1123     MG_TETRA* tet=trouve_tetra(lst,ittet->get_noeud1());
1124     while (tet!=NULL)
1125     {
1126     if (tet->get_nouveau_numero()==NONTRAITE)
1127     {
1128     b3d->lst.push_back(tet);
1129     tet->change_nouveau_numero(TRAITE);
1130     }
1131     tet=trouve_tetra(lst,ittet->get_noeud1());
1132     }
1133     tet=trouve_tetra(lst,ittet->get_noeud2());
1134     while (tet!=NULL)
1135     {
1136     if (tet->get_nouveau_numero()==NONTRAITE)
1137     {
1138     b3d->lst.push_back(tet);
1139     tet->change_nouveau_numero(TRAITE);
1140     }
1141     tet=trouve_tetra(lst,ittet->get_noeud2());
1142     }
1143     tet=trouve_tetra(lst,ittet->get_noeud3());
1144     while (tet!=NULL)
1145     {
1146     if (tet->get_nouveau_numero()==NONTRAITE)
1147     {
1148     b3d->lst.push_back(tet);
1149     tet->change_nouveau_numero(TRAITE);
1150     }
1151     tet=trouve_tetra(lst,ittet->get_noeud3());
1152     }
1153     tet=trouve_tetra(lst,ittet->get_noeud4());
1154     while (tet!=NULL)
1155     {
1156     if (tet->get_nouveau_numero()==NONTRAITE)
1157     {
1158     b3d->lst.push_back(tet);
1159     tet->change_nouveau_numero(TRAITE);
1160     }
1161     tet=trouve_tetra(lst,ittet->get_noeud4());
1162     }
1163     }
1164    
1165 francois 479 sprintf(mess," Tetra %d ",(int)b3d->lst.size());
1166 francois 283 //affiche(mess);
1167     }
1168     }
1169    
1170    
1171 couturad 951 MG_SEGMENT* REMAILLEUR::trouve_segment(std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> > &lst,MG_NOEUD* no)
1172 francois 283 {
1173     MG_SEGMENT* seg=NULL;
1174     unsigned long id=no->get_id();
1175 couturad 951 std::multimap<unsigned long,MG_SEGMENT*,std::less <unsigned long> >::iterator it=lst.find(id);
1176 francois 283 if (it!=lst.end())
1177     {
1178     seg=(*it).second;
1179     lst.erase(it);
1180     }
1181     return seg;
1182     }
1183    
1184 couturad 951 MG_TRIANGLE* REMAILLEUR::trouve_triangle(std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> > &lst,MG_NOEUD* no)
1185 francois 283 {
1186     MG_TRIANGLE* tri=NULL;
1187     unsigned long id=no->get_id();
1188 couturad 951 std::multimap<unsigned long,MG_TRIANGLE*,std::less <unsigned long> >::iterator it=lst.find(id);
1189 francois 283 if (it!=lst.end())
1190     {
1191     tri=(*it).second;
1192     lst.erase(it);
1193     }
1194     return tri;
1195     }
1196    
1197 couturad 951 MG_TETRA* REMAILLEUR::trouve_tetra(std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> > &lst,MG_NOEUD* no)
1198 francois 283 {
1199     MG_TETRA* tet=NULL;
1200     unsigned long id=no->get_id();
1201 couturad 951 std::multimap<unsigned long,MG_TETRA*,std::less <unsigned long> >::iterator it=lst.find(id);
1202 francois 283 if (it!=lst.end())
1203     {
1204     tet=(*it).second;
1205     lst.erase(it);
1206     }
1207     return tet;
1208     }
1209    
1210     int REMAILLEUR::point_appartient_volume(double *xyz,int numvol)
1211     {
1212     int ok=0;
1213     int i=0;
1214 couturad 951 std::multimap<double,double,std::less<double> > intersection;
1215 francois 283 OT_VECTEUR_3D vecteur_dir;
1216     while (ok==0)
1217    
1218     {
1219     int ok2=0;
1220     while (ok2==0)
1221     {
1222     MG_TRIANGLE* tri=lsttrifront[numvol].get(i);
1223     MG_NOEUD* no1=tri->get_noeud1();
1224     MG_NOEUD* no2=tri->get_noeud2();
1225     MG_NOEUD* no3=tri->get_noeud3();
1226     double xb=(no1->get_x()+no2->get_x()+no3->get_x())/3.;
1227     double yb=(no1->get_y()+no2->get_y()+no3->get_y())/3.;
1228     double zb=(no1->get_z()+no2->get_z()+no3->get_z())/3.;
1229     OT_VECTEUR_3D directeur(xb-xyz[0],yb-xyz[1],zb-xyz[2]);
1230     directeur.norme();
1231     vecteur_dir=directeur;
1232     OT_VECTEUR_3D n1n3(no1->get_coord(),no3->get_coord());
1233     OT_VECTEUR_3D n1n2(no1->get_coord(),no2->get_coord());
1234     OT_VECTEUR_3D n=n1n3&n1n2;
1235     n.norme();
1236     double ps1=n*directeur;
1237     if (fabs(ps1)<1e-6) i++;
1238     else ok2=1;
1239     }
1240     ok2=0;
1241     intersection.clear();
1242     for (int j=0;j<lsttrifront[numvol].get_nb();j++)
1243     {
1244     MG_TRIANGLE* tri=lsttrifront[numvol].get(j);
1245    
1246     double t;
1247     int res=inter_droite_triangle(xyz,vecteur_dir,tri,&t);
1248     if (res==2) {
1249     ok2=1;
1250     break;
1251     }
1252     if (res==1)
1253     {
1254 couturad 951 std::pair<double,double> tmp(t,t);
1255 francois 283 intersection.insert(tmp);
1256     }
1257     }
1258     if (ok2==0) ok=1;
1259     i++;
1260    
1261     }
1262 couturad 951 std::multimap<double,double,std::less <double> >::iterator it=intersection.begin();
1263 francois 283 int nbinterneg=0;
1264     double tavant=1e308;
1265     while (it!=intersection.end())
1266     {
1267     if ((*it).second<0.)
1268     {
1269     double t=(*it).second;
1270     if (!(OPERATEUR::egal(t,tavant,1e-6)))
1271     nbinterneg++;
1272     tavant=t;
1273     }
1274     it++;
1275     }
1276     if (nbinterneg%2==1) return 1;
1277     return 0;
1278     }
1279    
1280    
1281     int REMAILLEUR::inter_droite_triangle(double *xyz,double *dir,MG_TRIANGLE* tri,double *t)
1282     {
1283     int inter=0;
1284     MG_NOEUD *noeud1=tri->get_noeud1();
1285     MG_NOEUD *noeud2=tri->get_noeud2();
1286     MG_NOEUD *noeud3=tri->get_noeud3();
1287     OT_VECTEUR_3D g1(noeud2->get_x()-noeud1->get_x(),noeud2->get_y()-noeud1->get_y(),noeud2->get_z()-noeud1->get_z());
1288     OT_VECTEUR_3D g2(noeud3->get_x()-noeud1->get_x(),noeud3->get_y()-noeud1->get_y(),noeud3->get_z()-noeud1->get_z());
1289     OT_VECTEUR_3D g3(dir);
1290     OT_MATRICE_3D systeme(g1,g2,g3);
1291     double det=systeme.get_determinant();
1292     double eps=0.333333333333*(g1.diff()+g2.diff()+g3.diff());
1293     eps=eps*eps*0.0018;
1294     if (OPERATEUR::egal(det,0.0,eps)==true)
1295     {
1296     OT_VECTEUR_3D g3b(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z());
1297     OT_MATRICE_3D systeme2(g1,g2,g3b);
1298     double det2=systeme2.get_determinant();
1299     double eps2=0.333333333333*(g1.diff()+g2.diff()+g3b.diff());
1300     eps2=18.*eps2*eps2*eps2*1e-6;
1301     if (OPERATEUR::egal(det2,0.0,eps)==true) // cas 2D
1302     {
1303     return 2;
1304     }
1305     else return 0;
1306     }
1307     else
1308     {
1309     double x,y,z;
1310     x=1.0/det*(g2.get_y()*g3.get_z()-g2.get_z()*g3.get_y());
1311     y=1.0/det*(g3.get_x()*g2.get_z()-g2.get_x()*g3.get_z());
1312     z=1.0/det*(g2.get_x()*g3.get_y()-g2.get_y()*g3.get_x());
1313     OT_VECTEUR_3D g1b(x,y,z);
1314     x=1.0/det*(g3.get_y()*g1.get_z()-g1.get_y()*g3.get_z());
1315     y=1.0/det*(g1.get_x()*g3.get_z()-g3.get_x()*g1.get_z());
1316     z=1.0/det*(g3.get_x()*g1.get_y()-g1.get_x()*g3.get_y());
1317     OT_VECTEUR_3D g2b(x,y,z);
1318     x=1.0/det*(g1.get_y()*g2.get_z()-g1.get_z()*g2.get_y());
1319     y=1.0/det*(g2.get_x()*g1.get_z()-g1.get_x()*g2.get_z());
1320     z=1.0/det*(g1.get_x()*g2.get_y()-g1.get_y()*g2.get_x());
1321     OT_VECTEUR_3D g3b(x,y,z);
1322     OT_VECTEUR_3D n1n4(xyz[0]-noeud1->get_x(),xyz[1]-noeud1->get_y(),xyz[2]-noeud1->get_z());
1323     double alpha1=n1n4*g1b;
1324     double alpha2=n1n4*g2b;
1325     double alpha3=-(n1n4*g3b);
1326     double alpha4=1-alpha1-alpha2;
1327     double eps=0.000001;
1328     if ((alpha1>-eps) && (alpha1<1.+eps))
1329     if ((alpha2>-eps) && (alpha2<1.+eps))
1330     if ((alpha4>-eps) && (alpha4<1.+eps)) {
1331     *t=alpha3;
1332     return 1;
1333     }
1334     return 0;
1335     }
1336    
1337     }