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

# Content
1 //####//------------------------------------------------------------
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 #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 #include "robustpredicates.hxx"
33 #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 :MAILLEUR(false),cadfilename(cadfilenametmp),scanfilename(scanfilenametmp),mergefilename(mergefilenametmp),cadmeshno(cadmeshnotmp),scnmeshno(scnmeshnotmp)//MAILLEUR(false): since it is a child of MAILLEUR
46 {
47 }
48 MAILLEUR2D_MERGEMAI::MAILLEUR2D_MERGEMAI(MAILLEUR2D_MERGEMAI& mdd)
49 :MAILLEUR(mdd),cadfilename(mdd.cadfilename),scanfilename(mdd.scanfilename),mergefilename(mdd.mergefilename),cadmeshno(mdd.cadmeshno),scnmeshno(mdd.scnmeshno)
50 {
51 }
52 MAILLEUR2D_MERGEMAI::~MAILLEUR2D_MERGEMAI()
53 {
54 }
55
56 void MAILLEUR2D_MERGEMAI::mergmsh(void)
57 {
58 affiche((char*) "merging started");
59 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 std::multimap<double,MG_NOEUD*,std::less<double> > closends;
306 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 closends.insert(std::pair<double,MG_NOEUD*> (dist,ndclosecad));
315 }
316 }
317
318 TPL_MAP_ENTITE<MG_NOEUD*> proxnds;
319 for(std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itclosends=closends.begin();itclosends!=closends.end();itclosends++)
320 {
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 std::map<MG_SEGMENT*,MG_TRIANGLE*> lstseg_conestprox;
341 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 lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment1()),tripr));
360 //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 lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment2()),tripr));
372 //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 lstseg_conestprox.insert(std::pair< MG_SEGMENT*,MG_TRIANGLE* >((tripr->get_segment3()),tripr));
384 //lstseg_conestprox.ajouter(tripr->get_segment3());
385 }
386
387 }
388
389 TPL_MAP_ENTITE<MG_SEGMENT*> segadded;
390 for(std::map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstseg_conestprox=lstseg_conestprox.begin();itlstseg_conestprox!=lstseg_conestprox.end();itlstseg_conestprox++)
391 {
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 MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud2(),segconctprx->get_noeud1(),nd,MAGIC::ORIGINE::IMPOSE);
411 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 MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,segconctprx->get_noeud1(),segconctprx->get_noeud2(),nd,MAGIC::ORIGINE::IMPOSE);
420 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 TPL_LISTE_ENTITE<MG_SEGMENT*> lstasupprimer;
456 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 lstasupprimer.ajouter(clsgcad);
471
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 lstasupprimer.ajouter(clsgcad);
482 }
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 for (int i=0;i<lstasupprimer.get_nb();i++)
497 {
498 MG_SEGMENT* seg=lstasupprimer.get(i);
499 lstneisg.supprimer(seg);
500 }
501 //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 std::multimap<double,MG_SEGMENT*,std::less<double> > closesegscad;
506 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 closesegscad.insert(std::pair<double,MG_SEGMENT*>(distns,clsgcad));
525 }
526 }
527 //for(multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();itclosgs!=closesegscad.end();itclosgs++)
528 std::multimap<double,MG_SEGMENT*,std::less<double> >::iterator itclosgs=closesegscad.begin();
529 {
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 MG_TRIANGLE* triad= maimrg->ajouter_mg_triangle(NULL,seg->get_noeud2(),seg->get_noeud1(),bndscnd,MAGIC::ORIGINE::IMPOSE);
553 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 MG_TRIANGLE* triad=maimrg->ajouter_mg_triangle(NULL,seg->get_noeud1(),seg->get_noeud2(),bndscnd,MAGIC::ORIGINE::IMPOSE);
561 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 }