ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d_mergemai.cpp
Revision: 543
Committed: Fri Aug 8 15:20:52 2014 UTC (10 years, 9 months ago) by sattarpa
Original Path: magic/lib/mailleur_auto/src/mailleur2d_mergemai.cpp
File size: 25451 byte(s)
Log Message:
Ajouter "Le Merge de deux maillages _ SCAN maillage et CAD maillage"

File Contents

# User Rev Content
1 sattarpa 543 #include "mailleur2d_mergemai.h"
2     #include "gestionversion.h"
3     #include "mg_gestionnaire.h"
4     #include "mg_maillage_outils.h"
5     #include <string.h>
6     #include "mg_geometrie.h"
7     #include <stdio.h>
8     #include "gestionversion.h"
9     #include "mailleur2d_ins_noeud.h"
10     #include "mg_gestionnaire.h"
11     #include "robustpredicates.h"
12     #include <math.h>
13     #include <map>
14     #include "mg_maillage_outils.h"
15     #include "mg_file.h"
16     #include "occ_import.h"
17     #include "fct_generateur_3d.h"
18     #include "mg_geometrie_outils.h"
19     #include "ot_mathematique.h"
20     #include "mailleur2d_optimisation.h"
21     #include "mg_sommet_noeud.h"
22    
23     MAILLEUR2D_MERGEMAI::MAILLEUR2D_MERGEMAI(char* cadfilenametmp,char* scanfilenametmp, char* mergefilenametmp,int cadmeshnotmp,int scnmeshnotmp)
24     :cadfilename(cadfilenametmp),scanfilename(scanfilenametmp),mergefilename(mergefilenametmp),cadmeshno(cadmeshnotmp),scnmeshno(scnmeshnotmp)//,MAILLEUR(false)
25     {
26     }
27     MAILLEUR2D_MERGEMAI::MAILLEUR2D_MERGEMAI(MAILLEUR2D_MERGEMAI& mdd)
28     :cadfilename(mdd.cadfilename),scanfilename(mdd.scanfilename),mergefilename(mdd.mergefilename),cadmeshno(mdd.cadmeshno),scnmeshno(mdd.scnmeshno)
29     {
30     }
31     MAILLEUR2D_MERGEMAI::~MAILLEUR2D_MERGEMAI()
32     {
33     }
34    
35     void MAILLEUR2D_MERGEMAI::mergmsh(void)
36     {
37     MG_FILE gestcad(cadfilename); //deformedcad_sansscannedpart.magic
38     MG_FILE gestscn(scanfilename); //3dsurfmesh_scanned.magic
39     MG_GESTIONNAIRE mergegest;
40     MG_MAILLAGE* maicad;
41     MG_MAILLAGE* maiscn;
42     MG_MAILLAGE* maimrg=new MG_MAILLAGE(NULL);
43     mergegest.ajouter_mg_maillage(maimrg);
44     if (cadmeshno==0) maicad=gestcad.get_mg_maillageid(cadmeshno); else maicad=gestcad.get_mg_maillageid(cadmeshno);//256171
45     if (scnmeshno==0) maiscn=gestscn.get_mg_maillageid(scnmeshno); else maiscn=gestscn.get_mg_maillageid(scnmeshno);//1669364
46    
47     LISTE_MG_NOEUD::iterator itnds;
48     LISTE_MG_SEGMENT::iterator itSeg;
49     LISTE_MG_TRIANGLE::iterator itTri;
50     //read scan and cad mesh
51     for(MG_NOEUD* cadnd=maicad->get_premier_noeud(itnds);cadnd!=NULL;cadnd=maicad->get_suivant_noeud(itnds))
52     {
53     double x=cadnd->get_x();
54     double y=cadnd->get_y();
55     double z=cadnd->get_z();
56     MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,cadnd->get_origine());
57     maimrg->ajouter_mg_noeud(newno);
58     cadnd->change_nouveau_numero(newno->get_id());
59     newno->change_nouveau_numero(1); //cadmesh nds in merge mesh has nouveau_numero=1
60     }
61     for (MG_SEGMENT * segment =maicad->get_premier_segment(itSeg); segment!=NULL; segment=maicad->get_suivant_segment(itSeg))
62     {
63     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
64     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
65     MG_NOEUD* no1=maimrg->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
66     MG_NOEUD* no2=maimrg->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
67     MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
68     maimrg->ajouter_mg_segment(seg);
69     }
70     for (MG_TRIANGLE * triangle =maicad->get_premier_triangle(itTri); triangle; triangle=maicad->get_suivant_triangle(itTri))
71     {
72     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
73     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
74     MG_NOEUD* no1=maimrg->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
75     MG_NOEUD* no2=maimrg->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
76     MG_NOEUD* no3=maimrg->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
77     maimrg->ajouter_mg_triangle(NULL,no1,no2,no3,triangle->get_origine());
78     }
79     for(MG_NOEUD* cadnd=maiscn->get_premier_noeud(itnds);cadnd!=NULL;cadnd=maiscn->get_suivant_noeud(itnds))
80     {
81     double x=cadnd->get_x();
82     double y=cadnd->get_y();
83     double z=cadnd->get_z();
84     MG_NOEUD *newno=new MG_NOEUD(NULL,x,y,z,cadnd->get_origine());
85     maimrg->ajouter_mg_noeud(newno);
86     cadnd->change_nouveau_numero(newno->get_id());
87     newno->change_nouveau_numero(2); //scanmesh nds in merge mesh has nouveau_numero=2
88     }
89     for (MG_SEGMENT * segment =maiscn->get_premier_segment(itSeg); segment!=NULL; segment=maiscn->get_suivant_segment(itSeg))
90     {
91     MG_ELEMENT_TOPOLOGIQUE *topseg=segment->get_lien_topologie();
92     MG_FACE* faceseg=(MG_FACE*) (segment->get_lien_topologie());
93     MG_NOEUD* no1=maimrg->get_mg_noeudid(segment->get_noeud1()->get_nouveau_numero());
94     MG_NOEUD* no2=maimrg->get_mg_noeudid(segment->get_noeud2()->get_nouveau_numero());
95     MG_SEGMENT *seg=new MG_SEGMENT(NULL,no1,no2,segment->get_origine());
96     maimrg->ajouter_mg_segment(seg);
97     }
98     for (MG_TRIANGLE * triangle =maiscn->get_premier_triangle(itTri); triangle; triangle=maiscn->get_suivant_triangle(itTri))
99     {
100     MG_ELEMENT_TOPOLOGIQUE *toptri=triangle->get_lien_topologie();
101     MG_FACE* facetri=(MG_FACE*) (triangle->get_lien_topologie());
102     MG_NOEUD* no1=maimrg->get_mg_noeudid(triangle->get_noeud1()->get_nouveau_numero());
103     MG_NOEUD* no2=maimrg->get_mg_noeudid(triangle->get_noeud2()->get_nouveau_numero());
104     MG_NOEUD* no3=maimrg->get_mg_noeudid(triangle->get_noeud3()->get_nouveau_numero());
105     maimrg->ajouter_mg_triangle(NULL,no1,no2,no3,triangle->get_origine());
106     }
107    
108     ///////
109     TPL_MAP_ENTITE<MG_SEGMENT*> lst_sgcad;
110     TPL_MAP_ENTITE<MG_NOEUD*> lst_ndcad;
111     for (MG_SEGMENT * segment =maimrg->get_premier_segment(itSeg); segment!=NULL; segment=maimrg->get_suivant_segment(itSeg))
112     {
113     if(segment->get_noeud1()->get_nouveau_numero()==1 && segment->get_noeud2()->get_nouveau_numero()==1)
114     {
115     lst_ndcad.ajouter(segment->get_noeud1());
116     lst_ndcad.ajouter(segment->get_noeud2());
117     lst_sgcad.ajouter(segment);
118     }
119     }
120     /////
121    
122     //find the boundary elements
123     TPL_MAP_ENTITE<MG_SEGMENT*> edgsegcad;
124     TPL_MAP_ENTITE<MG_NOEUD*> edgndcad;
125     TPL_MAP_ENTITE<MG_SEGMENT*> edgsegscn;
126     TPL_MAP_ENTITE<MG_NOEUD*> edgndscn;
127     TPL_MAP_ENTITE<MG_SEGMENT*> bndryseglstcad;
128     TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstcad;
129     TPL_MAP_ENTITE<MG_SEGMENT*> bndryseglstscan;
130     TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan;
131     for(MG_SEGMENT* segmnt=maimrg->get_premier_segment(itSeg);segmnt!=NULL;segmnt=maimrg->get_suivant_segment(itSeg))
132     {
133     if(segmnt->get_lien_triangle()->get_nb()==1)
134     {
135     if(segmnt->get_noeud1()->get_nouveau_numero()==1 && segmnt->get_noeud2()->get_nouveau_numero()==1)
136     {
137     segmnt->get_noeud1()->change_nouveau_numero(3);
138     segmnt->get_noeud2()->change_nouveau_numero(3);
139     bndryseglstcad.ajouter(segmnt);
140     edgsegcad.ajouter(segmnt);
141     bndryndlstcad.ajouter(segmnt->get_noeud1());
142     bndryndlstcad.ajouter(segmnt->get_noeud2());
143     edgndcad.ajouter(segmnt->get_noeud1());
144     edgndcad.ajouter(segmnt->get_noeud2());
145     }
146     if(segmnt->get_noeud1()->get_nouveau_numero()==2 && segmnt->get_noeud2()->get_nouveau_numero()==2)
147     {
148     segmnt->get_noeud1()->change_nouveau_numero(4);
149     segmnt->get_noeud2()->change_nouveau_numero(4);
150     bndryseglstscan.ajouter(segmnt);
151     edgsegscn.ajouter(segmnt);
152     bndryndlstscan.ajouter(segmnt->get_noeud1());
153     bndryndlstscan.ajouter(segmnt->get_noeud2());
154     edgndscn.ajouter(segmnt->get_noeud1());
155     edgndscn.ajouter(segmnt->get_noeud2());
156     }
157     }
158    
159     }
160     // the neighborhood
161     double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
162     TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
163     LISTE_MG_NOEUD::iterator it;
164     for (MG_NOEUD* no=maimrg->get_premier_noeud(it);no!=NULL;no=maimrg->get_suivant_noeud(it))
165     {
166     if (no->get_x()<xmin) xmin=no->get_x();
167     if (no->get_y()<ymin) ymin=no->get_y();
168     if (no->get_z()<zmin) zmin=no->get_z();
169     if (no->get_x()>xmax) xmax=no->get_x();
170     if (no->get_y()>ymax) ymax=no->get_y();
171     if (no->get_z()>zmax) zmax=no->get_z();
172     lstnoeud.ajouter(no);
173     }
174     OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
175     OT_VECTEUR_3D vec(vecmmax,vecmin);
176     double search_radius=0.001*(vec.get_longueur());
177     OT_VECTEUR_3D min(xmin,ymin,zmin); OT_VECTEUR_3D max(xmax,ymax,zmax); OT_VECTEUR_3D average=(min+max)/2.; OT_VECTEUR_3D lengthvec(min,max);
178     double length=sqrt(lengthvec*lengthvec); double bxr=2.1;
179     xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
180     xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
181    
182     TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> octreends;
183     //octreends.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
184     //for (MG_NOEUD* no=maimrg->get_premier_noeud(it);no!=NULL;no=maimrg->get_suivant_noeud(it))
185     //octreends.inserer(no);
186     octreends.initialiser(&bndryndlstcad,1,xmin,ymin,zmin,xmax,ymax,zmax);
187     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itbndryndlstcad;
188     for(MG_NOEUD* no1=bndryndlstcad.get_premier(itbndryndlstcad);no1!=NULL;no1=bndryndlstcad.get_suivant(itbndryndlstcad))
189     octreends.inserer(no1);
190    
191     TPL_OCTREE<MG_SEGMENT*,MG_NOEUD*> octreesegs;
192     //octreesegs.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
193     LISTE_MG_SEGMENT::iterator itseg;
194     //for(MG_SEGMENT* seg=maimrg->get_premier_segment(itseg);seg!=NULL;seg=maimrg->get_suivant_segment(itseg))
195     //octreesegs.inserer(seg);
196     //octreesegs.initialiser(&bndryndlstcad,1,xmin,ymin,zmin,xmax,ymax,zmax);
197     octreesegs.initialiser(&lst_ndcad,1,xmin,ymin,zmin,xmax,ymax,zmax);
198     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itbndryseglstcad;
199     //for(MG_SEGMENT* seg=bndryseglstcad.get_premier(itbndryseglstcad);seg!=NULL;seg=bndryseglstcad.get_suivant(itbndryseglstcad))
200     for(MG_SEGMENT* seg=lst_sgcad.get_premier(itbndryseglstcad);seg!=NULL;seg=lst_sgcad.get_suivant(itbndryseglstcad))
201     octreesegs.inserer(seg);
202    
203     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itmpnd;
204     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itmpsg;
205     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itmptri;
206    
207     for(MG_SEGMENT* seg=maimrg->get_premier_segment(itseg);seg!=NULL;seg=maimrg->get_suivant_segment(itseg))
208     {
209     //if(seg->get_lien_triangle()->get_nb()<1 || seg->get_lien_triangle()->get_nb()>2)
210     //cout<<"seg->get_lien_triangle()->get_nb()= "<<seg->get_lien_triangle()->get_nb()<<endl;
211     }
212    
213     //proximity
214     double proximity_coof=20.1*search_radius; //can be based on the size of scan mesh
215     //cout<<"proximity_coof= "<<proximity_coof<<endl;
216     //cout<<"bndryndlstscan.get_nb()= "<<bndryndlstscan.get_nb()<<endl;
217     int beshmar1=0;
218     TPL_MAP_ENTITE<MG_NOEUD*> removescnbndnd;
219     for(MG_NOEUD* nd=bndryndlstscan.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan.get_suivant(itmpnd))
220     {
221     beshmar1++;
222     //cout<<" beshmar1= "<<beshmar1<<endl;
223     //cout<<"bndryndlstscan.get_nb()= "<<bndryndlstscan.get_nb()<<endl;
224     proxndmerg(maimrg,search_radius,nd,octreends,proximity_coof,removescnbndnd,octreesegs);
225     }
226    
227     //cout<<"removescnbndnd.get_nb()= "<<removescnbndnd.get_nb()<<endl;
228     TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan_afterprox;
229     for(MG_NOEUD* nd=bndryndlstscan.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan.get_suivant(itmpnd))
230     {
231     int should_remove=0;
232     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itremovescnbndnd;
233     for(MG_NOEUD* ndbnd=removescnbndnd.get_premier(itremovescnbndnd);ndbnd!=NULL;ndbnd=removescnbndnd.get_suivant(itremovescnbndnd))
234     {
235     if(ndbnd==nd)
236     should_remove++;
237     }
238     if(should_remove==0)
239     bndryndlstscan_afterprox.ajouter(nd);
240     }
241     //cout<<"bndryndlstscan_afterprox.get_nb()= "<<bndryndlstscan_afterprox.get_nb()<<endl;
242     int testbeshmr=0;
243     TPL_MAP_ENTITE<MG_NOEUD*> removescnbndnd_prxseg;
244     for(MG_NOEUD* bndscnd=bndryndlstscan_afterprox.get_premier(itmpnd);bndscnd!=NULL;bndscnd=bndryndlstscan_afterprox.get_suivant(itmpnd))
245     {
246     testbeshmr++;
247     //cout<<"testbeshmr= "<<testbeshmr<<endl;
248     //if (testbeshmr<5)
249     proxsegmrg(maimrg,search_radius,bndscnd,octreesegs,removescnbndnd_prxseg);
250     }
251     TPL_MAP_ENTITE<MG_NOEUD*> bndryndlstscan_afterproxseg;
252     for(MG_NOEUD* nd=bndryndlstscan_afterprox.get_premier(itmpnd);nd!=NULL;nd=bndryndlstscan_afterprox.get_suivant(itmpnd))
253     {
254     int should_remove=0;
255     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itremovescnbndnd;
256     for(MG_NOEUD* ndbnd=removescnbndnd_prxseg.get_premier(itremovescnbndnd);ndbnd!=NULL;ndbnd=removescnbndnd_prxseg.get_suivant(itremovescnbndnd))
257     {
258     if(ndbnd==nd)
259     should_remove++;
260     }
261     if(should_remove==0)
262     bndryndlstscan_afterproxseg.ajouter(nd);
263     }
264     //cout<<" unmeged remained nodes number = "<<bndryndlstscan_afterproxseg.get_nb()<<endl;
265     mergegest.enregistrer(mergefilename);
266     }
267    
268     //////////////////////////////////////////////////////////////////////////////////
269     void MAILLEUR2D_MERGEMAI::proxndmerg(MG_MAILLAGE* maimrg, double search_radius,MG_NOEUD* nd,TPL_OCTREE<MG_NOEUD*,MG_NOEUD*> &octreends,double proximity_coof,
270     TPL_MAP_ENTITE<MG_NOEUD*> &removescnbndnd,TPL_OCTREE<MG_SEGMENT*,MG_NOEUD*> &octreesegs)
271     {
272     TPL_MAP_ENTITE<MG_NOEUD*> lstndnei;
273     int lstndneinb=lstndnei.get_nb();
274     double search_radius1=search_radius;
275    
276     //while(lstndneinb==0)
277     {
278     octreends.rechercher(nd->get_x(),nd->get_y(),nd->get_z(),search_radius1,lstndnei);
279     lstndneinb=lstndnei.get_nb();
280     //if(lstndneinb<1)
281     //maimrg->supprimer_mg_triangleid(nd->get_lien_triangle()->get(0)->get_id());
282    
283     if(lstndneinb>0)
284     {
285     //cout<<"lstndnei.get_nb() before:= "<<lstndnei.get_nb()<<endl;
286     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itmpnd1;
287     for(MG_NOEUD* ndclosecad=lstndnei.get_premier(itmpnd1);ndclosecad!=NULL;ndclosecad=lstndnei.get_suivant(itmpnd1))
288     {
289     double dist=sqrt(pow(ndclosecad->get_x()-nd->get_x(),2)+pow(ndclosecad->get_y()-nd->get_y(),2)+pow(ndclosecad->get_z()-nd->get_z(),2));
290     //cout<<" distdist= "<<dist<<endl;
291     if(ndclosecad->get_nouveau_numero()!=3)
292     lstndnei.supprimer(ndclosecad);
293     }
294     lstndneinb=lstndnei.get_nb();
295     }
296    
297     search_radius1=search_radius1+0.1*search_radius;
298     }
299    
300     //cout<<"lstndnei.get_nb()= "<<lstndnei.get_nb()<<endl;
301     multimap<double,MG_NOEUD*,std::less<double> > closends;
302     if(lstndnei.get_nb()>0)
303     {
304     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itmpnd2;
305     for(MG_NOEUD* ndclosecad=lstndnei.get_premier(itmpnd2);ndclosecad!=NULL;ndclosecad=lstndnei.get_suivant(itmpnd2))
306     {
307     if(ndclosecad->get_nouveau_numero()==3)
308     {
309     double dist=sqrt(pow(ndclosecad->get_x()-nd->get_x(),2)+pow(ndclosecad->get_y()-nd->get_y(),2)+pow(ndclosecad->get_z()-nd->get_z(),2));
310     closends.insert(pair<double,MG_NOEUD*> (dist,ndclosecad));
311     }
312     }
313    
314     TPL_MAP_ENTITE<MG_NOEUD*> proxnds;
315     for(multimap<double,MG_NOEUD*,std::less<double> >::iterator itclosends=closends.begin();itclosends!=closends.end();itclosends++)
316     {
317     double distancenew=(*itclosends).first;
318     //cout<<"distancenew= "<<distancenew<<endl;
319     if(distancenew<proximity_coof)
320     proxnds.ajouter((*itclosends).second);
321     }
322     /*
323     LISTE_MG_SEGMENT::iterator itseg1;
324     for(MG_SEGMENT* seg=maimrg->get_premier_segment(itseg1);seg!=NULL;seg=maimrg->get_suivant_segment(itseg1))
325     {
326     if(seg->get_lien_triangle()->get_nb()<1 || seg->get_lien_triangle()->get_nb()>2)
327     cout<<"seg->get_lien_triangle()->get_nb()11111111111111= "<<seg->get_lien_triangle()->get_nb()<<endl;
328     }
329     */
330     //cout<<"proxnds.get_nb()= "<<proxnds.get_nb()<<endl;
331     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itmpnd3;
332     for(MG_NOEUD* ndprx=proxnds.get_premier(itmpnd3);ndprx!=NULL;ndprx=proxnds.get_suivant(itmpnd3))
333     {
334     // cout<<"ndprx->get_lien_triangle()->get_nb()= "<<ndprx->get_lien_triangle()->get_nb()<<endl;
335    
336     //TPL_MAP_ENTITE<MG_SEGMENT*> lstseg_conestprox;
337     map<MG_SEGMENT*,MG_TRIANGLE*> lstseg_conestprox;
338     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri_conestprox;
339     TPL_MAP_ENTITE<MG_TRIANGLE*> lsttri_added;
340     for(int nbsg=0;nbsg<ndprx->get_lien_triangle()->get_nb();nbsg++)
341     {
342     int countr_ndsg1=0;
343     int countr_ndsg2=0;
344     int countr_ndsg3=0;
345     MG_TRIANGLE* tripr=ndprx->get_lien_triangle()->get(nbsg);
346     lsttri_conestprox.ajouter(tripr);
347     TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itmpnd4;
348     if(tripr->get_segment1()->get_noeud1()!=ndprx && tripr->get_segment1()->get_noeud2()!=ndprx)
349     {
350     /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
351     {
352     if(tripr->get_segment1()->get_noeud1()==ndprx1 || tripr->get_segment1()->get_noeud2()==ndprx1)
353     countr_ndsg1++;
354     }
355     if(countr_ndsg1==0)*/
356     lstseg_conestprox.insert(pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment1()),tripr));
357     //lstseg_conestprox.ajouter(tripr->get_segment1());
358     }
359    
360     if(tripr->get_segment2()->get_noeud1()!=ndprx && tripr->get_segment2()->get_noeud2()!=ndprx)
361     {
362     /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
363     {
364     if(tripr->get_segment2()->get_noeud1()==ndprx1 || tripr->get_segment2()->get_noeud2()==ndprx1)
365     countr_ndsg2++;
366     }
367     if(countr_ndsg2==0)*/
368     lstseg_conestprox.insert(pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment2()),tripr));
369     //lstseg_conestprox.ajouter(tripr->get_segment2());
370     }
371    
372     if(tripr->get_segment3()->get_noeud1()!=ndprx && tripr->get_segment3()->get_noeud2()!=ndprx)
373     {
374     /*for(MG_NOEUD* ndprx1=proxnds.get_premier(itmpnd4);ndprx1!=NULL;ndprx1=proxnds.get_suivant(itmpnd4))
375     {
376     if(tripr->get_segment3()->get_noeud1()==ndprx1 || tripr->get_segment3()->get_noeud2()==ndprx1)
377     countr_ndsg3++;
378     }
379     if(countr_ndsg3==0)*/
380     lstseg_conestprox.insert(pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment3()),tripr));
381     //lstseg_conestprox.ajouter(tripr->get_segment3());
382     }
383    
384     }
385    
386     TPL_MAP_ENTITE<MG_SEGMENT*> segadded;
387     //for(MG_SEGMENT* segconctprx=lstseg_conestprox.get_premier(itmpsg);segconctprx!=NULL;segconctprx=lstseg_conestprox.get_suivant(itmpsg))
388     for(map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstseg_conestprox=lstseg_conestprox.begin();itlstseg_conestprox!=lstseg_conestprox.end();itlstseg_conestprox++)
389     {
390     MG_SEGMENT* segconctprx=(*itlstseg_conestprox).first;
391     //cout<<"segconctprx->get_lien_triangle()->get_nb()= "<<segconctprx->get_lien_triangle()->get_nb()<<endl;
392     //cout<<"segconctprx->get_noeud1()->get_nouveau_numero()= "<<segconctprx->get_noeud1()->get_nouveau_numero()<<endl;
393     //cout<<"segconctprx->get_noeud2()->get_nouveau_numero()= "<<segconctprx->get_noeud2()->get_nouveau_numero()<<endl;
394     //if(segconctprx->get_lien_triangle()->get_nb()!=0)
395     {
396     //MG_TRIANGLE* trioppose=segconctprx->get_lien_triangle()->get(0);
397     MG_TRIANGLE* trioppose=(*itlstseg_conestprox).second;
398     int triorintation=0;
399     if(segconctprx->get_noeud1()==trioppose->get_noeud1() && segconctprx->get_noeud2()==trioppose->get_noeud2())
400     triorintation++;
401     if(segconctprx->get_noeud1()==trioppose->get_noeud2() && segconctprx->get_noeud2()==trioppose->get_noeud3())
402     triorintation++;
403     if(segconctprx->get_noeud1()==trioppose->get_noeud3() && segconctprx->get_noeud2()==trioppose->get_noeud1())
404     triorintation++;
405    
406     if(triorintation==0)
407     {
408     MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud2(),segconctprx->get_noeud1(),nd,IMPOSE);
409     nd->change_nouveau_numero(3);
410     segadded.ajouter(triad->get_segment1());
411     segadded.ajouter(triad->get_segment2());
412     segadded.ajouter(triad->get_segment3());
413     }
414    
415     else if(triorintation>0)
416     {
417     MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud1(),segconctprx->get_noeud2(),nd,IMPOSE);
418     nd->change_nouveau_numero(3);
419     segadded.ajouter(triad->get_segment1());
420     segadded.ajouter(triad->get_segment2());
421     segadded.ajouter(triad->get_segment3());
422     }
423     }
424     }
425     removescnbndnd.ajouter(nd);
426     octreends.supprimer(ndprx);
427    
428     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itsegadded;
429     for(MG_SEGMENT* segaded=segadded.get_premier(itsegadded);segaded!=NULL;segaded=segadded.get_suivant(itsegadded))
430     octreesegs.inserer(segaded);
431    
432    
433     TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itmptri;
434     for(MG_TRIANGLE* tridelet=lsttri_conestprox.get_premier(itmptri);tridelet!=NULL;tridelet=lsttri_conestprox.get_suivant(itmptri))
435     {
436     octreesegs.supprimer(tridelet->get_segment1());
437     octreesegs.supprimer(tridelet->get_segment2());
438     octreesegs.supprimer(tridelet->get_segment3());
439     maimrg->supprimer_mg_triangleid(tridelet->get_id());
440     }
441    
442    
443    
444    
445     }
446     }
447     }
448    
449     ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
450     void MAILLEUR2D_MERGEMAI::proxsegmrg(MG_MAILLAGE* maimrg, double search_radius,MG_NOEUD* bndscnd,TPL_OCTREE<MG_SEGMENT*,MG_NOEUD*> &octreesegs,TPL_MAP_ENTITE<MG_NOEUD*> &removescnbndnd_prxseg)
451     {
452     //cout<<"the second part started"<<endl;
453     TPL_MAP_ENTITE<MG_SEGMENT*> lstneisg;
454     int lstneisgnb=lstneisg.get_nb();
455     double search_radius1=search_radius;
456     //while(lstneisgnb==0)
457     {
458     octreesegs.rechercher(bndscnd->get_x(),bndscnd->get_y(),bndscnd->get_z(),search_radius1,lstneisg);
459     lstneisgnb=lstneisg.get_nb();
460     search_radius1=search_radius1+0.1*search_radius;
461     if(lstneisgnb>0)
462     {
463     //cout<<" lstneisgnb = "<<lstneisgnb<<endl;
464     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itmpsg1;
465     for(MG_SEGMENT* clsgcad=lstneisg.get_premier(itmpsg1);clsgcad!=NULL;clsgcad=lstneisg.get_suivant(itmpsg1))
466     {
467     if(clsgcad->get_noeud1()->get_nouveau_numero()!=3 && clsgcad->get_noeud2()->get_nouveau_numero()!=3)
468     lstneisg.supprimer(clsgcad);
469    
470     OT_VECTEUR_3D vec1(clsgcad->get_noeud1()->get_coord(),bndscnd->get_coord());
471     OT_VECTEUR_3D vec2(clsgcad->get_noeud1()->get_coord(),clsgcad->get_noeud2()->get_coord());
472     double val1=vec1*vec2;
473     double val2=vec2*vec2;
474    
475     if(val1<0 || val1>val2)
476     {
477     //cout<<" vec1*vec2= "<<val1<<" vec1*vec1= "<<val2<<endl;
478     //cout<<" vec1= "<<vec1.get_longueur()<<" vec1= "<<vec2.get_longueur()<<endl;
479     lstneisg.supprimer(clsgcad);
480     }
481     else
482     {
483     //cout<<" yeki moondehhhh"<<endl;
484     //cout<<"?????? vec1*vec2= "<<val1<<" vec1*vec1= "<<val2<<endl;
485     //cout<<"?????? vec1= "<<vec1.get_longueur()<<" vec1= "<<vec2.get_longueur()<<endl;
486     }
487    
488     //cout<<"clsgcad->get_lien_triangle()->get_nb()="<<clsgcad->get_lien_triangle()->get_nb()<<endl;
489     //if(clsgcad->get_lien_triangle()->get_nb()>1)
490     // lstneisg.supprimer(clsgcad);
491     }
492     }
493     }
494     //if(lstneisg.get_nb()==0)
495     //cout<<" lstneisg.get_nb()==0 lstneisg.get_nb()==0 lstneisg.get_nb()==0"<<endl;
496     if(lstneisg.get_nb()>0)
497     {
498     multimap<double,MG_SEGMENT*,std::less<double> > closesegscad;
499     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itmpsg2;
500     for(MG_SEGMENT* clsgcad=lstneisg.get_premier(itmpsg2);clsgcad!=NULL;clsgcad=lstneisg.get_suivant(itmpsg2))
501     {
502     if(clsgcad->get_noeud1()->get_nouveau_numero()!=2 || clsgcad->get_noeud2()->get_nouveau_numero()!=2)
503     {
504     //the distance between a point and a segment is not accurate in 3D
505     /*
506     double distns1=sqrt(pow(clsgcad->get_noeud1()->get_x()-bndscnd->get_x(),2)+pow(clsgcad->get_noeud1()->get_y()-bndscnd->get_y(),2)+pow(clsgcad->get_noeud1()->get_z()-bndscnd->get_z(),2));
507     double distns2=sqrt(pow(clsgcad->get_noeud2()->get_x()-bndscnd->get_x(),2)+pow(clsgcad->get_noeud2()->get_y()-bndscnd->get_y(),2)+pow(clsgcad->get_noeud2()->get_z()-bndscnd->get_z(),2));
508     double distns=(distns1+distns2)/2.;
509     */
510     OT_VECTEUR_3D vec1(clsgcad->get_noeud1()->get_coord(),bndscnd->get_coord());
511     OT_VECTEUR_3D vec2(clsgcad->get_noeud1()->get_coord(),clsgcad->get_noeud2()->get_coord());
512     double val1=vec1*vec2;
513     double val2=vec2*vec2;
514     OT_VECTEUR_3D vec3=(val1/(vec1.get_longueur()*vec1.get_longueur()))*vec1;
515     OT_VECTEUR_3D vec4=vec3-vec2;
516     double distns=vec4.get_longueur();
517     closesegscad.insert(pair<double,MG_SEGMENT*>(distns,clsgcad));
518     }
519     }
520     //for(multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();itclosgs!=closesegscad.end();itclosgs++)
521     multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();
522     {
523     MG_SEGMENT* cadsegprx=(*itclosgs).second;
524     MG_TRIANGLE* tricont=cadsegprx->get_lien_triangle()->get(0);
525     TPL_MAP_ENTITE<MG_SEGMENT*> tricontsgs;
526     if(tricont->get_segment1()!=cadsegprx)
527     tricontsgs.ajouter(tricont->get_segment1());
528     if(tricont->get_segment2()!=cadsegprx)
529     tricontsgs.ajouter(tricont->get_segment2());
530     if(tricont->get_segment3()!=cadsegprx)
531     tricontsgs.ajouter(tricont->get_segment3());
532     TPL_MAP_ENTITE<MG_SEGMENT*> segadded;
533     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR ittricontsgs;
534     for(MG_SEGMENT* seg=tricontsgs.get_premier(ittricontsgs);seg!=NULL;seg=tricontsgs.get_suivant(ittricontsgs))
535     {
536     int newtriorient=0;
537     if(seg->get_noeud1()==tricont->get_noeud1() && seg->get_noeud2()==tricont->get_noeud2())
538     newtriorient++;
539     if(seg->get_noeud1()==tricont->get_noeud2() && seg->get_noeud2()==tricont->get_noeud3())
540     newtriorient++;
541     if(seg->get_noeud1()==tricont->get_noeud3() && seg->get_noeud2()==tricont->get_noeud1())
542     newtriorient++;
543     if(newtriorient==0)
544     {
545     MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,seg->get_noeud2(),seg->get_noeud1(),bndscnd,IMPOSE);
546     bndscnd->change_nouveau_numero(3);
547     segadded.ajouter(triad->get_segment1());
548     segadded.ajouter(triad->get_segment2());
549     segadded.ajouter(triad->get_segment3());
550     }
551     else if(newtriorient>0)
552     {
553     MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,seg->get_noeud1(),seg->get_noeud2(),bndscnd,IMPOSE);
554     bndscnd->change_nouveau_numero(3);
555     segadded.ajouter(triad->get_segment1());
556     segadded.ajouter(triad->get_segment2());
557     segadded.ajouter(triad->get_segment3());
558     }
559     }
560     TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itsegadded;
561     for(MG_SEGMENT* segaded=segadded.get_premier(itsegadded);segaded!=NULL;segaded=segadded.get_suivant(itsegadded))
562     octreesegs.inserer(segaded);
563    
564     octreesegs.supprimer(tricont->get_segment1());
565     octreesegs.supprimer(tricont->get_segment2());
566     octreesegs.supprimer(tricont->get_segment3());
567     maimrg->supprimer_mg_triangleid(tricont->get_id());
568     }
569     removescnbndnd_prxseg.ajouter(bndscnd);
570     }
571    
572     }