ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/REPOS_ERICCA/magic/lib/mailleur/src/mailleur2d_mergemai.cpp
Revision: 1189
Committed: Tue Feb 4 17:26:49 2025 UTC (3 months ago) by francois
File size: 25440 byte(s)
Log Message:
Version 5.0 de MAGIC. Integration de ALGLIB pour faire de l'optimisation. ALGLIB se download automatiquement en executant un script dans le repertoire config update_magic.bash


File Contents

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