ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d_mergemai.cpp
Revision: 546
Committed: Fri Aug 15 22:34:45 2014 UTC (10 years, 8 months ago) by sattarpa
Original Path: magic/lib/mailleur_auto/src/mailleur2d_mergemai.cpp
File size: 25551 byte(s)
Log Message:
adding stlrefine by constant size and size map, insert points into stl file and insert point and boundary condition into stlfile

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