ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur_bloc.cpp
Revision: 146
Committed: Thu Aug 21 22:05:37 2008 UTC (16 years, 8 months ago) by francois
Original Path: magic/lib/mailleur/mailleur/src/mailleur_bloc.cpp
File size: 31918 byte(s)
Log Message:
Acceleration de la destruction dans mailleur 3D. Generalisation de la fonction est dans une face dans mailleur. Changement arete partielle dans vectorisation

File Contents

# User Rev Content
1 francois 120 //---------------------------------------------------------------------------
2    
3     #include "gestionversion.h"
4     #include <math.h>
5     #include "mailleur_bloc.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 francois 146 #include "mg_segment_frontiere.h"
13 francois 120 //---------------------------------------------------------------------------
14     #pragma package(smart_init)
15    
16    
17    
18    
19    
20     MAILLEUR_BLOC::MAILLEUR_BLOC(class MG_GESTIONNAIRE* gentier,MG_GESTIONNAIRE* gbloc,int numgeoentier,int numgeobloc,class FCT_TAILLE* fct_taille):gestentier(gentier),gestbloc(gbloc),carte(fct_taille)
21     {
22     geoentier=gestentier->get_mg_geometrie(numgeoentier);
23     geobloc=gestbloc->get_mg_geometrie(numgeobloc);
24 francois 124 int nbface1=geoentier->get_nb_mg_face();
25     int nbface2=geobloc->get_nb_mg_face();
26     quadentier=new TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*>*[nbface1];
27     quadbloc=new TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*>*[nbface2];
28 francois 120 }
29    
30     MAILLEUR_BLOC::~MAILLEUR_BLOC()
31     {
32     delete octreeentier;
33     delete octreebloc;
34 francois 124 int nbface=maientier->get_mg_geometrie()->get_nb_mg_face();
35     for (int i=0;i<nbface;i++) delete quadentier[i];
36     delete [] quadentier;
37     nbface=maibloc->get_mg_geometrie()->get_nb_mg_face();
38     for (int i=0;i<nbface;i++) delete quadbloc[i];
39     delete [] quadbloc;
40     int nbseg=lstsegfrontentier.get_nb();
41     for (int i=0;i<nbseg;i++) delete lstsegfrontentier.get(i);
42     nbseg=lstsegfrontbloc.get_nb();
43     for (int i=0;i<nbseg;i++) delete lstsegfrontbloc.get(i);
44    
45 francois 120 }
46    
47    
48     void MAILLEUR_BLOC::maille(void)
49     {
50 francois 123 maille(20);
51     }
52    
53     void MAILLEUR_BLOC::maille(int etape)
54     {
55 francois 120 //maillage 1d temporaire pour fonctionnement et initialisation
56 francois 124 //maitemp=new MG_MAILLAGE(geobloc);
57 francois 120 maibloc=new MG_MAILLAGE(geobloc);
58     maientier=new MG_MAILLAGE(geoentier);
59 francois 124 //gestbloc->ajouter_mg_maillage(maitemp);
60 francois 120 gestbloc->ajouter_mg_maillage(maibloc);
61     gestentier->ajouter_mg_maillage(maientier);
62 francois 124 //MAILLEUR0D m0d(maitemp,geobloc);
63     //m0d.maille();
64     //MAILLEUR1D m1d(maitemp,geobloc,NULL,carte);
65     //m1d.maille();
66     //cree_octree(maitemp,&octreebloc);
67 francois 120 // etape 1 maillage 0d du modele entier
68 francois 129 affiche(" MAILLAGE 0D du modele entier");
69 francois 120 MAILLEUR0D m0d_entier(maientier,geoentier);
70     m0d_entier.maille();
71 francois 123 if (etape<2) return;
72 francois 120 // etape 2 transfert noeud vers bloc
73     //int nbaretebloc=geobloc->get_nb_mg_arete();
74     //LISTE_NOEUD_ADD_ARETE *lst_noeuds_bloc=new LISTE_NOEUD_ADD_ARETE[nbaretebloc];
75     int nbnoeudentier=maientier->get_nb_mg_noeud();
76     for (int i=0;i<nbnoeudentier;i++)
77     {
78     MG_NOEUD* noeud=maientier->get_mg_noeud(i);
79     double *xyz=noeud->get_coord();
80     MG_SOMMET* som=verif_noeud_sur_sommet(xyz, geobloc);
81     if (som!=NULL)
82     {
83     MG_NOEUD *nvnoeud=new MG_NOEUD(som, xyz[0],xyz[1],xyz[2], IMPOSE);
84     maibloc->ajouter_mg_noeud(nvnoeud);
85 francois 124 //octreebloc->inserer(nvnoeud);
86 francois 120 }
87     /* else
88     {
89     int num;
90     double t;
91     MG_ARETE* are=verif_noeud_sur_arete(xyz, geobloc, &num,&t);
92     if (are!=NULL)
93     {
94     MG_NOEUD_ADDITIONNEL_ARETE noeud_add;
95     noeud_add.noeud=noeud;
96     noeud_add.t=t;
97     std::pair<double,MG_NOEUD_ADDITIONNEL_ARETE> tmp(t,noeud_add);
98     lst_noeuds_bloc[num].insert(tmp);
99     }
100     }*/
101    
102    
103     }
104 francois 123 if (etape<3) return;
105 francois 120 // etape 3 maillage 0d du modele bloc
106     affiche(" MAILLAGE 0D du modele bloc");
107     int nbnoeudblocavantm0d=maibloc->get_nb_mg_noeud();
108     MAILLEUR0D m0d_bloc(maibloc,geobloc);
109     m0d_bloc.adapte();
110 francois 123 if (etape<4) return;
111 francois 120 // etape 4 transfert noeud vers entier
112     int nbnouveaunoeudbloc=maibloc->get_nb_mg_noeud()-nbnoeudblocavantm0d;
113     int nbareteentier=geoentier->get_nb_mg_arete();
114     LISTE_NOEUD_ADD_ARETE *lst_noeuds_entier=new LISTE_NOEUD_ADD_ARETE[nbareteentier];
115     for (int i=0;i<nbnouveaunoeudbloc;i++)
116     {
117     MG_NOEUD *noeud=maibloc->get_mg_noeud(i+nbnoeudblocavantm0d);
118 francois 124 // octreebloc->inserer(noeud);
119 francois 120 double *xyz=noeud->get_coord();
120     int num;double t;
121     MG_ARETE* are=verif_noeud_sur_arete(xyz, geoentier, &num,&t);
122     if (are!=NULL)
123     {
124     MG_NOEUD_ADDITIONNEL_ARETE noeud_add;
125     noeud_add.noeud=noeud;
126     noeud_add.t=t;
127     pair<double,MG_NOEUD_ADDITIONNEL_ARETE > tmp(t,noeud_add);
128     lst_noeuds_entier[num].insert(tmp);
129     }
130     }
131 francois 123 if (etape<5) return;
132 francois 120 // etape 5 Maillage 1D de entier
133 francois 129 affiche(" MAILLAGE 1D du modele entier");
134 francois 120 for (int i=0;i<nbareteentier;i++)
135     {
136     MG_ARETE* are=geoentier->get_mg_arete(i);
137     int nbnoeudcontraint=lst_noeuds_entier[i].size();
138     MG_NOEUD* noeuddepart;
139     int numsom=are->get_cosommet1()->get_sommet()->get_lien_maillage()->get_nb();
140     for (int j=0;j<numsom;j++)
141     if (maientier->get_mg_noeudid(are->get_cosommet1()->get_sommet()->get_lien_maillage()->get(j)->get_id())!=NULL) noeuddepart=(MG_NOEUD*)are->get_cosommet1()->get_sommet()->get_lien_maillage()->get(j);
142     MG_NOEUD* noeudarrivee;
143     numsom=are->get_cosommet2()->get_sommet()->get_lien_maillage()->get_nb();
144     for (int j=0;j<numsom;j++)
145     if (maientier->get_mg_noeudid(are->get_cosommet2()->get_sommet()->get_lien_maillage()->get(j)->get_id())!=NULL) noeudarrivee=(MG_NOEUD*)are->get_cosommet2()->get_sommet()->get_lien_maillage()->get(j);
146     MG_NOEUD* navant;
147     double tavant;
148     IT_LISTE_NOEUD_ADD_ARETE it=lst_noeuds_entier[i].begin();
149     for (int j=0;j<nbnoeudcontraint+1;j++)
150     {
151     MG_NOEUD* n1,*n2;
152     double t1,t2;
153     if (j==0) {n1=noeuddepart;t1=are->get_tmin();} else {n1=navant;t1=tavant;}
154     if (j==nbnoeudcontraint) {n2=noeudarrivee;t2=are->get_tmax();}
155     else
156     {
157     double *xyz=(*it).second.noeud->get_coord();
158     n2=new MG_NOEUD(are, xyz[0],xyz[1],xyz[2], IMPOSE);
159     maientier->ajouter_mg_noeud(n2);
160     t2=(*it).second.t;
161     it++;
162     }
163     MAILLEUR1D m1d(maientier, geoentier, are, carte);
164     m1d.maille(are,t1,n1,t2,n2);
165     tavant=t2;
166     navant=n2;
167     }
168     }
169 francois 124 delete [] lst_noeuds_entier;
170     cree_octree(maientier,&octreeentier);
171     cree_octree(octreeentier,&octreebloc);
172     cree_quadtree(maientier,quadentier,&lstsegfrontentier);
173 francois 146 int nbnoeudtmp=maientier->get_nb_mg_noeud();
174 francois 120 for (int i=0;i<nbnoeudtmp;i++)
175     octreeentier->inserer(maientier->get_mg_noeud(i));
176 francois 146 nbnoeudtmp=maibloc->get_nb_mg_noeud();
177 francois 124 for (int i=0;i<nbnoeudtmp;i++)
178     octreebloc->inserer(maibloc->get_mg_noeud(i));
179 francois 146 if (etape<6) return;
180 francois 120 //etape 6 transfert des segments vers le maillage bloc
181     //int nbfacebloc=geobloc->get_nb_mg_face();
182     //LISTE_SEGMENT_ADD_FACE *lstsegmentbloc=new LISTE_SEGMENT_ADD_FACE[nbfacebloc];
183     int nbsegment=maientier->get_nb_mg_segment();
184     for (int i=0;i<nbsegment;i++)
185     {
186     MG_SEGMENT* seg=maientier->get_mg_segment(i);
187     MG_NOEUD* noeud1=seg->get_noeud1();
188     MG_NOEUD* noeud2=seg->get_noeud2();
189     int dim1;
190     int dim2;
191     MG_NOEUD* n1=chercher(noeud1->get_coord(),*octreebloc);
192     MG_NOEUD* n2=chercher(noeud2->get_coord(),*octreebloc);
193     MG_ARETE* are1ref;
194     MG_FACE* face1ref;
195     MG_ARETE* are2ref;
196     MG_FACE* face2ref;
197     int num1,num2;
198     double t1,t2;
199     if (n1==NULL)
200     {
201     are1ref=verif_noeud_sur_arete(noeud1->get_coord(),geobloc,&num1,&t1);
202     if (are1ref==NULL)
203     {
204     dim1=2;
205     // face1ref=verif_noeud_sur_face(noeud1->get_coord(),geobloc,&num1);
206     // if (face1ref==NULL) dim1=3; else dim1=2;
207     }
208     else dim1=1;
209     }
210     else
211     {
212     dim1=n1->get_lien_topologie()->get_dimension();
213     if (dim1==1) are1ref=(MG_ARETE*)n1->get_lien_topologie();
214     }
215     if (n2==NULL)
216     {
217     are2ref=verif_noeud_sur_arete(noeud2->get_coord(),geobloc,&num2,&t2);
218     if (are2ref==NULL)
219     {
220     dim2=2;
221     // face2ref=verif_noeud_sur_face(noeud2->get_coord(),geobloc,&num2);
222     // if (face2ref==NULL) dim2=3; else dim2=2;
223     }
224     else dim2=1;
225     }
226     else
227     {
228     dim2=n2->get_lien_topologie()->get_dimension();
229     if (dim2==1) are2ref=(MG_ARETE*)n2->get_lien_topologie();
230     }
231     if ((dim1==3) || (dim2==3)) continue;
232     if ((dim1==2) || (dim2==2))
233     {
234     /*MG_SEGMENT_ADDITIONNEL_FACE segface;
235     segface.segment=seg;
236     segface.noeud1=noeud1;
237     segface.noeud2=noeud2;
238     if (dim1==2) lstsegmentbloc[num1].insert(lstsegmentbloc[num1].end(),segface);
239     else lstsegmentbloc[num2].insert(lstsegmentbloc[num2].end(),segface);*/
240     }
241     else if ((dim1==1) && (dim2==1) && (are1ref!=are2ref))
242     {
243     /*double xyz[3];
244     xyz[0]=0.5*(noeud1->get_coord()[0]+noeud2->get_coord()[0]);
245     xyz[1]=0.5*(noeud1->get_coord()[1]+noeud2->get_coord()[1]);
246     xyz[2]=0.5*(noeud1->get_coord()[2]+noeud2->get_coord()[2]);
247     int num;
248     MG_FACE* face=verif_noeud_sur_face(xyz,geobloc,&num,octreeblocseg);
249     if (face!=NULL)
250     {
251     MG_SEGMENT_ADDITIONNEL_FACE segface;
252     segface.segment=seg;
253     segface.noeud1=noeud1;
254     segface.noeud2=noeud2;
255     lstsegmentbloc[num].insert(lstsegmentbloc[num].end(),segface);
256     } */
257     }
258     else if ((dim1==1) || (dim2==1))
259     {
260     MG_ARETE* ref;
261     if (dim1==1) ref=are1ref; else ref=are2ref;
262     if (n1==NULL)
263     {
264     n1=new MG_NOEUD(ref,noeud1->get_coord()[0],noeud1->get_coord()[1],noeud1->get_coord()[2], IMPOSE);
265     maibloc->ajouter_mg_noeud(n1);
266     octreebloc->inserer(n1);
267     }
268     if (n2==NULL)
269     {
270     n2=new MG_NOEUD(ref,noeud2->get_coord()[0],noeud2->get_coord()[1],noeud2->get_coord()[2], IMPOSE);
271     maibloc->ajouter_mg_noeud(n2);
272     octreebloc->inserer(n2);
273     }
274     MG_SEGMENT *nvsegment=new MG_SEGMENT(ref,n1,n2,IMPOSE);
275     maibloc->ajouter_mg_segment(nvsegment);
276     }
277     else
278     {
279     // cas de 2 noeud sur 2 sommet diff plus tard
280     }
281     }
282 francois 123 if (etape<7) return;
283 francois 120 //etape 7 maillage 1D de bloc
284     affiche(" MAILLAGE 1D du modele bloc");
285     int nbaretebloc=geobloc->get_nb_mg_arete();
286     int nbsegmentblocavant=maibloc->get_nb_mg_segment();
287     for (int i=0;i<nbaretebloc;i++)
288     {
289     MAILLEUR1D m1d_bloc(maibloc,geobloc,geobloc->get_mg_arete(i),carte);
290     m1d_bloc.adapte();
291     }
292 francois 124 cree_quadtree(maibloc,quadbloc,&lstsegfrontbloc);
293 francois 123 if (etape<8) return;
294 francois 120 // etape 8 transfert des segment vers entier
295     int nbfaceentier=geoentier->get_nb_mg_face();
296     TPL_LISTE_ENTITE<MG_SEGMENT*> *lstsegcontraint=new TPL_LISTE_ENTITE<MG_SEGMENT*>[nbfaceentier];
297     int nbsegmentbloc=maibloc->get_nb_mg_segment();
298     for (int i=nbsegmentblocavant;i<nbsegmentbloc;i++)
299     {
300     MG_SEGMENT* seg=maibloc->get_mg_segment(i);
301     int num;
302 francois 124 MG_FACE* face=seg_sur_face(seg,geoentier,&num,quadentier);
303 francois 120 if (face!=NULL)
304     lstsegcontraint[num].ajouter(seg);
305     /*MG_NOEUD* noeud1=seg->get_noeud1();
306     MG_NOEUD* noeud2=seg->get_noeud2();
307     int dim1;
308     int dim2;
309     MG_NOEUD* n1=chercher(noeud1->get_coord(),*octreeentier);
310     MG_NOEUD* n2=chercher(noeud2->get_coord(),*octreeentier);
311     MG_FACE* face1ref;
312     MG_FACE* face2ref;
313     int num1,num2;
314     if (n1==NULL)
315     {
316     face1ref=verif_noeud_sur_face(noeud1->get_coord(),geoentier,&num1,octreeentierseg);
317     if (face1ref==NULL) dim1=3; else dim1=2;
318     }
319     else
320     dim1=n1->get_lien_topologie()->get_dimension();
321     if (n2==NULL)
322     {
323     face2ref=verif_noeud_sur_face(noeud2->get_coord(),geoentier,&num2,octreeentierseg);
324     if (face2ref==NULL) dim2=3; else dim2=2;
325     }
326     else
327     dim2=n2->get_lien_topologie()->get_dimension();
328     if ((dim1==3) || (dim2==3)) continue;
329     if ((dim1==2) || (dim2==2))
330     {
331     int num;
332     if (dim1==2) num=num1;
333     else if (dim2==2) num=num2;
334     lstsegcontraint[num].ajouter(seg);
335     } */
336     }
337 francois 123 if (etape<9) return;
338 francois 120 //etape 9 maillage 2D de entier
339     affiche(" MAILLAGE 2D du modele entier");
340     for (int i=0;i<nbfaceentier;i++)
341     {
342     MG_FACE* face=geoentier->get_mg_face(i);
343     MAILLEUR2D m2d(maientier,geoentier,face,carte);
344 francois 123 char mess[50];
345     sprintf(mess," Face %i identificateur %lu",i,face->get_id());
346     affiche(mess);
347 francois 120 m2d.maille(face,&(lstsegcontraint[i]));
348 francois 146 }
349 francois 122 delete [] lstsegcontraint;
350 francois 123 if (etape<10) return;
351 francois 120 //etape 10 transfert des triangle vers bloc
352     int nbfacebloc=geobloc->get_nb_mg_face();
353     TPL_LISTE_ENTITE<MG_TRIANGLE*> *lsttricontraint=new TPL_LISTE_ENTITE<MG_TRIANGLE*>[nbfacebloc];
354     int nbtrientier=maientier->get_nb_mg_triangle();
355     for (int i=0;i<nbtrientier;i++)
356     {
357     MG_TRIANGLE* tri=maientier->get_mg_triangle(i);
358     int num;
359 francois 124 MG_FACE* face=tri_sur_face(tri,geobloc,&num,quadbloc);
360 francois 120 if (face!=NULL)
361     lsttricontraint[num].ajouter(tri);
362     }
363 francois 123 if (etape<11) return;
364 francois 120 //etape 11 maillage 2D de bloc
365     affiche(" MAILLAGE 2D du modele bloc");
366     for (int i=0;i<nbfacebloc;i++)
367     {
368     MG_FACE* face=geobloc->get_mg_face(i);
369     MAILLEUR2D m2d(maibloc,geobloc,face,carte);
370 francois 123 char mess[50];
371     sprintf(mess," Face %i identificateur %lu",i,face->get_id());
372     affiche(mess);
373 francois 120 m2d.maille(face,NULL,&(lsttricontraint[i]));
374 francois 146 }
375 francois 122 delete [] lsttricontraint;
376 francois 123 if (etape<12) return;
377 francois 120 //etape 12 maillage 3D de bloc
378     affiche(" MAILLAGE 3D du modele bloc");
379     int nbvolumebloc=geobloc->get_nb_mg_volume();
380     for (int i=0;i<nbvolumebloc;i++)
381     {
382     MG_VOLUME *vol=geobloc->get_mg_volume(i);
383     MAILLEUR3D m3d(maibloc,geobloc,vol,carte);
384     m3d.active_affichage(affiche);
385     m3d.maille(vol);
386     }
387 francois 123 if (etape<13) return;
388 francois 120 //etape 13 transfert des tetra vers entier
389     TPL_LISTE_ENTITE<MG_TETRA*> lsttetra;
390     LISTE_MG_TETRA::iterator it;
391     for (MG_TETRA* tet=maibloc->get_premier_tetra(it);tet!=NULL;tet=maibloc->get_suivant_tetra(it))
392     lsttetra.ajouter(tet);
393     //etape 14 maillage 3D de entier
394     affiche(" MAILLAGE 3D du modele entier");
395     MG_VOLUME *vol=geoentier->get_mg_volume(0);
396     MAILLEUR3D m3d(maientier,geoentier,vol,carte);
397     m3d.active_affichage(affiche);
398     m3d.maille(vol,NULL,&lsttetra);
399     }
400    
401     MG_NOEUD* MAILLEUR_BLOC::chercher(double *xyz,TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> &octree)
402     {
403     TPL_MAP_ENTITE<MG_NOEUD*> lst;
404     octree.rechercher(xyz[0],xyz[1],xyz[2],1e-5,lst);
405     int nb=lst.get_nb();
406     for (int i=0;i<nb;i++)
407     {
408     OT_VECTEUR_3D vec(xyz,lst.get(i)->get_coord());
409     double metrique[9];
410     carte->evaluer(xyz,metrique);
411     double eps=(1./sqrt(metrique[0])*1e-10);
412     if (vec.get_longueur()<eps) return lst.get(i);
413     }
414     return NULL;
415     }
416    
417    
418     MG_SOMMET* MAILLEUR_BLOC::verif_noeud_sur_sommet(double *xyz, MG_GEOMETRIE *geo)
419     {
420     int nbsom=geo->get_nb_mg_sommet();
421     for (int i=0;i<nbsom;i++)
422     {
423     MG_SOMMET *sommet=geo->get_mg_sommet(i);
424     double xyzsom[3];
425     sommet->get_point()->evaluer(xyzsom);
426     double metrique[9];
427     carte->evaluer(xyz,metrique);
428 francois 124 double eps=(1./sqrt(metrique[0])*1e-6);
429 francois 120 OT_VECTEUR_3D vec(xyz,xyzsom);
430     if (vec.get_longueur()<eps) return sommet;
431     }
432     return NULL;
433     }
434    
435    
436     MG_ARETE* MAILLEUR_BLOC::verif_noeud_sur_arete(double *xyz, MG_GEOMETRIE *geo,int *num, double *t)
437     {
438     int nb_are=geo->get_nb_mg_arete();
439     for ( int i=0 ; i < nb_are ; i++)
440     {
441     MG_ARETE *arete=geo->get_mg_arete(i);
442     arete->inverser((*t),xyz);
443     if (arete->get_courbe()->est_periodique())
444     if (*t< arete->get_tmin()) *t=*t+arete->get_courbe()->get_periode();
445     double xyztmp[3];
446     arete->evaluer( *t,xyztmp );
447     double metrique[9];
448     carte->evaluer(xyz,metrique);
449 francois 124 double eps=(1./sqrt(metrique[0])*1e-6);
450 francois 120 OT_VECTEUR_3D vec(xyz,xyztmp);
451     if (vec.get_longueur()<eps)
452     if ((*t>arete->get_tmin()) && (*t<arete->get_tmax()))
453     {
454     *num=i;
455     return arete;
456     }
457     }
458     return NULL;
459     }
460    
461 francois 124 MG_FACE* MAILLEUR_BLOC::seg_sur_face(MG_SEGMENT* seg,MG_GEOMETRIE* geo,int *num,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad)
462 francois 120 {
463     double *xyz1=seg->get_noeud1()->get_coord();
464     double *xyz2=seg->get_noeud2()->get_coord();
465     int nbface=geo->get_nb_mg_face();
466     for (int i=0;i<nbface;i++)
467     {
468     MG_FACE *face=geo->get_mg_face(i);
469     double metrique[9];
470     carte->evaluer(xyz1,metrique);
471 francois 123 double eps=(1./sqrt(metrique[0])*1e-6);
472 francois 120 double uv1[2],xyz1bis[3];
473     face->inverser(uv1,xyz1);
474     face->evaluer(uv1,xyz1bis);
475     OT_VECTEUR_3D vec1(xyz1,xyz1bis);
476     if (vec1.get_longueur()<eps)
477     {
478     double uv2[2],xyz2bis[3];
479     face->inverser(uv2,xyz2);
480     face->evaluer(uv2,xyz2bis);
481     OT_VECTEUR_3D vec2(xyz2,xyz2bis);
482     if (vec2.get_longueur()<eps)
483     {
484     double xyz[3];
485     xyz[0]=0.5*(xyz1[0]+xyz2[0]);
486     xyz[1]=0.5*(xyz1[1]+xyz2[1]);
487     xyz[2]=0.5*(xyz1[2]+xyz2[2]);
488     double uv[2];
489     face->inverser(uv,xyz);
490 francois 124 double dist=calcule_distance_contour_face(uv,face,i,quad);
491 francois 120 if (dist>0.) {*num=i;return face;}
492     }
493     }
494     }
495     return NULL;
496     }
497    
498 francois 124 MG_FACE* MAILLEUR_BLOC::tri_sur_face(MG_TRIANGLE* tri,MG_GEOMETRIE* geo,int *num,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad)
499 francois 120 {
500     double *xyz1=tri->get_noeud1()->get_coord();
501     double *xyz2=tri->get_noeud2()->get_coord();
502     double *xyz3=tri->get_noeud3()->get_coord();
503     int nbface=geo->get_nb_mg_face();
504     for (int i=0;i<nbface;i++)
505     {
506     MG_FACE *face=geo->get_mg_face(i);
507     double metrique[9];
508     carte->evaluer(xyz1,metrique);
509 francois 123 double eps=(1./sqrt(metrique[0])*1e-6);
510 francois 120 double uv1[2],xyz1bis[3];
511     face->inverser(uv1,xyz1);
512     face->evaluer(uv1,xyz1bis);
513     OT_VECTEUR_3D vec1(xyz1,xyz1bis);
514     if (vec1.get_longueur()<eps)
515     {
516     double uv2[2],xyz2bis[3];
517     face->inverser(uv2,xyz2);
518     face->evaluer(uv2,xyz2bis);
519     OT_VECTEUR_3D vec2(xyz2,xyz2bis);
520     if (vec2.get_longueur()<eps)
521     {
522     double uv3[2],xyz3bis[3];
523     face->inverser(uv3,xyz3);
524     face->evaluer(uv3,xyz3bis);
525     OT_VECTEUR_3D vec3(xyz3,xyz3bis);
526     if (vec3.get_longueur()<eps)
527     {
528     double xyz[3];
529     double uv[2];
530 francois 124 OT_DECALAGE_PARAMETRE deca(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
531     double du=deca.calcul_decalage_parametre_u(uv1[0]);
532     double dv=deca.calcul_decalage_parametre_v(uv1[1]);
533    
534     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));
535     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));
536     uv[0]=deca.decalage_parametre_u(uv[0],-du);
537     uv[1]=deca.decalage_parametre_v(uv[1],-dv);
538     double dist=calcule_distance_contour_face(uv,face,i,quad);
539 francois 120 if (dist>0.) {*num=i;return face;}
540     }
541     }
542     }
543     }
544     return NULL;
545     }
546    
547    
548 francois 124 void MAILLEUR_BLOC::cree_octree(MG_MAILLAGE* mai,TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> **octree)
549 francois 120 {
550     double xmin=1e300,ymin=1e300,zmin=1e300;
551     double xmax=-1e300,ymax=-1e300,zmax=-1e300;
552     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
553     int nb_noeud=mai->get_nb_mg_noeud();
554     for (int i=0;i<nb_noeud;i++)
555     {
556     MG_NOEUD* mgnoeud=mai->get_mg_noeud(i);
557     lstnoeud.ajouter(mgnoeud);
558     xmin=std::min(xmin,mgnoeud->get_x());
559     ymin=std::min(ymin,mgnoeud->get_y());
560     zmin=std::min(zmin,mgnoeud->get_z());
561     xmax=std::max(xmax,mgnoeud->get_x());
562     ymax=std::max(ymax,mgnoeud->get_y());
563     zmax=std::max(zmax,mgnoeud->get_z());
564     }
565     double xdiff=xmax-xmin;
566     double ydiff=ymax-ymin;
567     double zdiff=zmax-zmin;
568     xmin=xmin-0.125*xdiff;
569     xmax=xmax+0.125*xdiff;
570     ymin=ymin-0.125*ydiff;
571     ymax=ymax+0.125*ydiff;
572     zmin=zmin-0.125*zdiff;
573     zmax=zmax+0.125*zdiff;
574     (*octree)=new TPL_OCTREE<MG_NOEUD*,MG_NOEUD*>;
575 francois 124 (*octree)->initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
576     }
577 francois 120
578 francois 124 void MAILLEUR_BLOC::cree_octree(TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> *octree1,TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> **octree2)
579     {
580     (*octree2)=new TPL_OCTREE<MG_NOEUD*,MG_NOEUD*>;
581     (*octree2)->initialiser(octree1);
582     }
583 francois 120
584 francois 124 void MAILLEUR_BLOC::cree_quadtree(MG_MAILLAGE* mai,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad,TPL_MAP_ENTITE<MG_SEGMENT_FRONTIERE*> *lstsegfront)
585     {
586     int nbface=mai->get_mg_geometrie()->get_nb_mg_face();
587     for (int i=0;i<nbface;i++)
588     {
589     ((quad[i]))=new TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*>;
590     TPL_LISTE_ENTITE<MG_NOEUD*> lstn;
591     double umax=-1e300;
592     double vmax=-1e300;
593     double umin=1e300;
594     double vmin=1e300;
595     MG_FACE* face=mai->get_mg_geometrie()->get_mg_face(i);
596     int nbboucle=face->get_nb_mg_boucle();
597     int nbsegfravant=lstsegfront->get_nb();
598     for (int j=0;j<nbboucle;j++)
599     {
600     MG_BOUCLE* bou=face->get_mg_boucle(j);
601     int nbarete=bou->get_nb_mg_coarete();
602     for (int k=0;k<nbarete;k++)
603     {
604     MG_ARETE* are=bou->get_mg_coarete(k)->get_arete();
605     int nbseg=are->get_lien_maillage()->get_nb();
606     for (int l=0;l<nbseg;l++)
607     {
608     MG_SEGMENT* seg=(MG_SEGMENT*)are->get_lien_maillage()->get(l);
609     if (mai->get_mg_segmentid(seg->get_id())==NULL) continue;
610     double *xyz=seg->get_noeud1()->get_coord();
611     double uv[2];
612     face->inverser(uv,xyz);
613     seg->get_noeud1()->change_u(uv[0]);
614     seg->get_noeud1()->change_v(uv[1]);
615     xyz=seg->get_noeud2()->get_coord();
616     face->inverser(uv,xyz);
617     seg->get_noeud2()->change_u(uv[0]);
618     seg->get_noeud2()->change_v(uv[1]);
619     lstn.ajouter(seg->get_noeud2());
620     if (uv[0]<umin) umin=uv[0];
621     if (uv[0]>umax) umax=uv[0];
622     if (uv[1]<vmin) vmin=uv[1];
623     if (uv[1]>vmax) vmax=uv[1];
624     MG_SEGMENT_FRONTIERE* segfr=new MG_SEGMENT_FRONTIERE(seg);
625     lstsegfront->ajouter(segfr);
626     }
627     }
628     }
629     double periodeenu=face->get_surface()->get_periode_u();
630     double periodeenv=face->get_surface()->get_periode_v();
631     if (periodeenu!=0.0)
632     {
633     umin=0.;
634     umax=periodeenu;
635     }
636     else
637     {
638     double diff=umax-umin;
639     umin=umin-0.125*diff;
640     umax=umax+0.125*diff;
641     }
642     if (periodeenv!=0.0)
643     {
644     vmin=0.;
645     vmax=periodeenv;
646     }
647     else
648     {
649     double diff=vmax-vmin;
650     vmin=vmin-0.125*diff;
651     vmax=vmax+0.125*diff;
652     }
653     (quad[i])->initialiser(&lstn,1,umin,vmin,umax,vmax,face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
654     int nbsegfr=lstsegfront->get_nb();
655     for (int j=nbsegfravant;j<nbsegfr;j++)
656     {
657     double *uv=lstsegfront->get(j)->get_uv1();
658     uv[0]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_u();
659     uv[1]=lstsegfront->get(j)->get_segment()->get_noeud1()->get_v();
660     uv=lstsegfront->get(j)->get_uv2();
661     uv[0]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_u();
662     uv[1]=lstsegfront->get(j)->get_segment()->get_noeud2()->get_v();
663     (quad[i])->inserer( lstsegfront->get(j));
664     }
665     }
666    
667 francois 120 }
668    
669    
670    
671    
672 francois 124 double MAILLEUR_BLOC::calcule_distance_contour_face(double *uv,MG_FACE* face,int num,TPL_QUADTREE<MG_SEGMENT_FRONTIERE*,MG_NOEUD*> **quad)
673 francois 120 {
674 francois 123 double uvajoute[3]={uv[0],uv[1],0.};
675 francois 120 TPL_MAP_ENTITE<MG_COARETE*> lst;
676     int nbboucle=face->get_nb_mg_boucle();
677     for (int i=0;i<nbboucle;i++)
678     {
679     int nbcoarete=face->get_mg_boucle(i)->get_nb_mg_coarete();
680     for (int j=0;j<nbcoarete;j++)
681     lst.ajouter(face->get_mg_boucle(i)->get_mg_coarete(j));
682     }
683 francois 124 BOITE_2D b=quad[num]->get_cellule(0)->get_boite();
684     double rayon=b.get_rayon()/quad[num]->get_nb_cellule();
685     TPL_MAP_ENTITE<MG_SEGMENT_FRONTIERE*> lsttrouve;
686     MG_SEGMENT_FRONTIERE* segretenu=NULL;
687 francois 120 MG_COARETE* coareteretenu=NULL;
688     double distance=1e300;
689     do
690     {
691     do
692     {
693 francois 124 quad[num]->rechercher(uv[0],uv[1],rayon,lsttrouve);
694 francois 120 rayon=rayon*1.25;
695     }
696     while (lsttrouve.get_nb()==0);
697     int nb=lsttrouve.get_nb();
698     for (int i=0;i<nb;i++)
699     {
700 francois 124 MG_SEGMENT_FRONTIERE* seg=lsttrouve.get(i);
701     MG_ARETE* are=(MG_ARETE*)seg->get_segment()->get_lien_topologie();
702 francois 120 int nbco=are->get_nb_mg_coarete();
703     MG_COARETE* coarete=NULL;
704     for (int j=0;j<nbco;j++)
705     if (lst.getid(are->get_mg_coarete(j)->get_id())!=NULL) coarete=are->get_mg_coarete(j);
706     if (coarete!=NULL)
707     {
708 francois 124 double uv1[3],uv2[3];
709     uv1[0]=seg->get_uv1()[0];
710     uv1[1]=seg->get_uv1()[1];
711     uv1[2]=0;
712     uv2[0]=seg->get_uv2()[0];
713     uv2[1]=seg->get_uv2()[1];
714     uv2[2]=0;
715     double dist=distance_pt_segment(uvajoute,uv1,uv2,face);
716 francois 120 if (dist<distance)
717     {
718     distance=dist;
719     segretenu=seg;
720     coareteretenu=coarete;
721     }
722     }
723     }
724     }
725 francois 124 while (rayon<distance);
726     double uv1[3]={segretenu->get_uv1()[0],segretenu->get_uv1()[1],0.};
727     double uv2[3]={segretenu->get_uv2()[0],segretenu->get_uv2()[1],0.};
728 francois 123 OT_DECALAGE_PARAMETRE deca(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
729     double du=deca.calcul_decalage_parametre_u(uv1[0]);
730     double dv=deca.calcul_decalage_parametre_v(uv1[1]);
731     uv1[0]=uv1[0]+du;
732     uv1[1]=uv1[1]+dv;
733     uv2[0]=deca.decalage_parametre_u(uv2[0],du);
734     uv2[1]=deca.decalage_parametre_v(uv2[1],dv);
735     uvajoute[0]=deca.decalage_parametre_u(uvajoute[0],du);
736     uvajoute[1]=deca.decalage_parametre_v(uvajoute[1],dv);
737     OT_VECTEUR_3D base(uv1,uv2);
738 francois 120 base=coareteretenu->get_orientation()*base;
739 francois 123 double normal[3]={0.,0.,1.};
740 francois 120 OT_VECTEUR_3D nor(normal);
741 francois 123 OT_VECTEUR_3D dir(uv1,uvajoute);
742 francois 120 base.norme();
743     dir.norme();
744     double sens=(nor&base)*dir;
745     if (sens<0.) distance=-distance;
746     return distance;
747     }
748    
749    
750 francois 123 double MAILLEUR_BLOC::distance_pt_segment(double *uv,MG_NOEUD* noeud1,MG_NOEUD *noeud2,MG_FACE* face)
751 francois 120 {
752 francois 123 double uv1[3],uv2[3];
753     face->inverser(uv1,noeud1->get_coord());
754     noeud1->change_u(uv1[0]);
755     noeud1->change_v(uv1[1]);
756     face->inverser(uv2,noeud2->get_coord());
757     noeud2->change_u(uv2[0]);
758     noeud2->change_v(uv2[1]);
759     uv1[2]=0.;uv2[2]=0.;
760 francois 124 return distance_pt_segment(uv,uv1,uv2,face);
761     }
762    
763     double MAILLEUR_BLOC::distance_pt_segment(double *uv,double *uv1,double *uv2,MG_FACE* face)
764     {
765 francois 123 OT_DECALAGE_PARAMETRE deca(face->get_surface()->get_periode_u(),face->get_surface()->get_periode_v());
766     double du=deca.calcul_decalage_parametre_u(uv1[0]);
767     double dv=deca.calcul_decalage_parametre_v(uv1[1]);
768     uv1[0]=uv1[0]+du;
769     uv1[1]=uv1[1]+dv;
770     uv2[0]=deca.decalage_parametre_u(uv2[0],du);
771     uv2[1]=deca.decalage_parametre_v(uv2[1],dv);
772     double uvtmp[3];
773     uvtmp[0]=deca.decalage_parametre_u(uv[0],du);
774     uvtmp[1]=deca.decalage_parametre_v(uv[1],dv);
775     uvtmp[2]=0.;
776 francois 120 double distance;
777 francois 123 OT_VECTEUR_3D vec12(uv1,uv2);
778     OT_VECTEUR_3D vec1p(uv1,uvtmp);
779 francois 120 double t=(vec12.get_x()*vec1p.get_x()+vec12.get_y()*vec1p.get_y()+vec12.get_z()*vec1p.get_z())/(vec12.get_x()*vec12.get_x()+vec12.get_y()*vec12.get_y()+vec12.get_z()*vec12.get_z());
780     if ((t<0.) || (t>1.))
781     {
782 francois 123 OT_VECTEUR_3D vec2p(uv2,uvtmp);
783 francois 120 double dist1=vec1p.get_longueur();
784     double dist2=vec2p.get_longueur();
785     distance=0.5*(dist1+dist2);
786     }
787     else
788     {
789     OT_VECTEUR_3D pvec=vec12&vec1p;
790     distance=pvec.get_longueur()/vec12.get_longueur();
791     }
792     return distance;
793     }
794 francois 124
795    
796    
797