MAGiC  V5.0
Mailleurs Automatiques de Géometries intégrés à la Cao
mailleur2d_stl_refine_ins_noeud.cpp
Aller à la documentation de ce fichier.
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_stl_refine_ins_noeud.cpp
15 //####//
16 //####//------------------------------------------------------------
17 //####//------------------------------------------------------------
18 //####// COPYRIGHT 2000-2024
19 //####// jeu 13 jun 2024 11:58:55 EDT
20 //####//------------------------------------------------------------
21 //####//------------------------------------------------------------
22 #include "mg_file.h"
23 #include <stdio.h>
24 #include <math.h>
25 #include <map>
27 #include <string.h>
28 #include <math.h>
29 #include "gestionversion.h"
30 #include "mg_gestionnaire.h"
31 #include "mg_maillage_outils.h"
32 #include <utility>
33 #include "robustpredicates.hxx"
35 #include "fct_generateur_3d.h"
37 #include <mg_sommet_noeud.h>
38 #include "tpl_liste_entite.h"
39 
40 
41 MAILLEUR2D_STL_REFINE_INS_NOEUD::MAILLEUR2D_STL_REFINE_INS_NOEUD(char* fichierstlmagictmp,char* fichierouttmp,int nummaitmp)
42 :MAILLEUR(false),fichierstlmagic(fichierstlmagictmp),fichierout(fichierouttmp),nummai(nummaitmp)
43 {
44 }
45 MAILLEUR2D_STL_REFINE_INS_NOEUD::MAILLEUR2D_STL_REFINE_INS_NOEUD(char* fichierstlmagictmp,char* fichierouttmp,char* fichiercartetmp,int nummaitmp)
46 :MAILLEUR(false),fichierstlmagic(fichierstlmagictmp),fichierout(fichierouttmp),fichiercarte(fichiercartetmp),nummai(nummaitmp)
47 {
48 }
49 MAILLEUR2D_STL_REFINE_INS_NOEUD::MAILLEUR2D_STL_REFINE_INS_NOEUD(char* fichierstlmagictmp,char* fichierinspointtmp,char* fichierouttmp,int nummaitmp,int qualswaptmp)
50 :MAILLEUR(false),fichierstlmagic(fichierstlmagictmp),fichierinspoint(fichierinspointtmp),fichierout(fichierouttmp),nummai(nummaitmp),qualswap(qualswaptmp)
51 {
52 }
54 :MAILLEUR(mdd),fichierstlmagic(mdd.fichierstlmagic),fichierout(mdd.fichierout),nummai(mdd.nummai),fichiercarte(mdd.fichiercarte),fichierinspoint(mdd.fichierinspoint),qualswap(mdd.qualswap)//,typedata(mdd.typedata)
55 {
56 }
58 {
59 }
61 {
62  /*
63  FCT_TAILLE* metrique;
64  if (app.get_action()==6)
65  {
66  FCT_GENERATEUR_3D<4> *carte=new FCT_GENERATEUR_3D<4>;
67  carte->lire(fichiercarte);
68  metrique=carte;
69  }
70  MG_FILE *gestcarte;
71  if (app.get_action()==16)
72  {
73  FCT_TAILLE_FEM_SOLUTION *carte=new FCT_TAILLE_FEM_SOLUTION(fichiercarte);
74  metrique=carte;
75  }
76  */
77  MG_FILE gest(fichierstlmagic); //"frshp.stl"
80  metrique=carte;
81  //qualswap=1;
82  double edge_angle_threshold=45.;
83  double geo_angle_threshold=25.;
86 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
88  LISTE_MG_NOEUD::iterator itn;
89  for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
90  {
91  if (no->get_x()<xmin) xmin=no->get_x();
92  if (no->get_y()<ymin) ymin=no->get_y();
93  if (no->get_z()<zmin) zmin=no->get_z();
94  if (no->get_x()>xmax) xmax=no->get_x();
95  if (no->get_y()>ymax) ymax=no->get_y();
96  if (no->get_z()>zmax) zmax=no->get_z();
97  lstnoeud.ajouter(no);
98  }
99 
100  OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
101  OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
102  OT_VECTEUR_3D vec(vecmmax,vecmin);
103  double bounbox_diag=vec.get_longueur();
104  double search_radius=0.1*bounbox_diag;
105  char bboxdiag[1000];
106  sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
107  affiche((char*) bboxdiag);
108 
109  OT_VECTEUR_3D min(xmin,ymin,zmin);
110  OT_VECTEUR_3D max(xmax,ymax,zmax);
111  OT_VECTEUR_3D average=(min+max)/2.;
112  OT_VECTEUR_3D lengthvec(min,max);
113  double length=sqrt(lengthvec*lengthvec);
114  double bxr=1.1;
115  xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
116  xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
118  stloctree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
119  LISTE_MG_TRIANGLE::iterator itoctrins1;
120  for (MG_TRIANGLE* stloctrins=stlmai->get_premier_triangle(itoctrins1);stloctrins!=NULL;stloctrins=stlmai->get_suivant_triangle(itoctrins1))
121  stloctree.inserer(stloctrins);
123  octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
124  LISTE_MG_TRIANGLE::iterator itoctrins;
125  for (MG_TRIANGLE* octrins=mai->get_premier_triangle(itoctrins);octrins!=NULL;octrins=mai->get_suivant_triangle(itoctrins))
126  octree.inserer(octrins);
127 
129 LISTE_MG_SEGMENT::iterator ited;
130 for (MG_SEGMENT* seged=mai->get_premier_segment(ited);seged!=NULL;seged=mai->get_suivant_segment(ited))
131 {
132  if (seged->get_lien_triangle()->get_nb()==1) lstedges.ajouter(seged); // The boundary segments in open surfaces
133  else if (seged->get_lien_triangle()->get_nb()==2)
134  {
135  MG_TRIANGLE* tri1=seged->get_lien_triangle()->get(0);
136  MG_TRIANGLE* tri2=seged->get_lien_triangle()->get(1);
137  MG_MAILLAGE_OUTILS getangle;
138  double teta=getangle.get_angle(tri1,tri2);teta=teta*180./3.14159265;
139  if (teta<=(180.-edge_angle_threshold) || teta>=(edge_angle_threshold+180.))
140  lstedges.ajouter(seged);
141  }
142 }
143 /*
144 std::map<unsigned long,unsigned long> nodemaicomp;
145 TPL_MAP_ENTITE<MG_NOEUD*> lstednd;
146 for(int ied1=0;ied1<lstedges.get_nb();ied1++)
147 {
148  MG_NOEUD* nd1=lstedges.get(ied1)->get_noeud1();
149  MG_NOEUD* nd2=lstedges.get(ied1)->get_noeud2();
150  lstednd.ajouter(nd1);
151  lstednd.ajouter(nd2);
152 }
153 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itlstednd;
154 for(MG_NOEUD* ndedg=lstednd.get_premier(itlstednd);ndedg!=NULL;ndedg=lstednd.get_suivant(itlstednd))
155 {
156  MG_NOEUD* nd=edgemai->ajouter_mg_noeud(NULL,ndedg->get_x(),ndedg->get_y(),ndedg->get_z(),IMPOSE);
157  nodemaicomp.insert(pair<unsigned long,unsigned long> (ndedg->get_id(),nd->get_id()));
158 }
159 
160 for(int ied1=0;ied1<lstedges.get_nb();ied1++)
161 {
162  std::map<unsigned long,unsigned long>::iterator itnd;
163  MG_NOEUD* maind1=lstedges.get(ied1)->get_noeud1();
164  itnd=nodemaicomp.find(maind1->get_id());
165  MG_NOEUD* segnd1=edgemai->get_mg_noeudid((*itnd).second);
166  MG_NOEUD* maind2=lstedges.get(ied1)->get_noeud2();
167  itnd=nodemaicomp.find(maind2->get_id());
168  MG_NOEUD* segnd2=edgemai->get_mg_noeudid((*itnd).second);
169  edgemai->ajouter_mg_segment(NULL,segnd1,segnd2,IMPOSE);
170 }
171 
172 cout<<"edgemai->get_nb_mg_noeud()= "<<edgemai->get_nb_mg_noeud()<<endl;
173 cout<<"edgemai->get_nb_mg_segment()= "<<edgemai->get_nb_mg_segment()<<endl;
174 */
176 LISTE_MG_SEGMENT::iterator itsegsz;
177 for (MG_SEGMENT* sizseg=mai->get_premier_segment(itsegsz);sizseg!=NULL;sizseg=mai->get_suivant_segment(itsegsz))
178 {
179  double* xyz1=sizseg->get_noeud1()->get_coord();
180  double* xyz2=sizseg->get_noeud2()->get_coord();
181  double metriclength=calcul_distance_metrique(xyz1,xyz2,32,metrique);
182  sizemapsorting.insert(std::pair<double,MG_SEGMENT*>(metriclength,sizseg));
183 }
184 
185 SIZMAPSORT:: iterator itm = sizemapsorting.begin();
186  while((*itm).first>1.35)
187  {
188  //cout<<"refineing steps"<<endl;
189  MG_SEGMENT* segbgsz=(*itm).second;
190  bisection_operator_sizemapref(mai,segbgsz,sizemapsorting,lstedges,octree,stloctree,geo_angle_threshold,metrique);
191  itm = sizemapsorting.begin();
192  }
193 stl_smoothing(mai,lstedges,octree,stloctree,search_radius);
195 }
196 double MAILLEUR2D_STL_REFINE_INS_NOEUD::calcul_distance_metrique(double *xyz1,double* xyz2,int pas,FCT_TAILLE* metrique)
197 {
198  double longueur=0.;
199  double dxyz[3];
200  dxyz[0]=xyz2[0]-xyz1[0];
201  dxyz[1]=xyz2[1]-xyz1[1];
202  dxyz[2]=xyz2[2]-xyz1[2];
203  for (int i=0;i<pas;i++)
204  {
205  double ti=1.0*i/pas; //1.0 is to change the int fraction into a double
206  double tii=1.0*(i+1)/pas;
207  double tgauss1=0.7886751345*tii+0.2113248654*ti;
208  double xyz[3];
209  xyz[0]=xyz1[0]+tgauss1*(xyz2[0]-xyz1[0]);
210  xyz[1]=xyz1[1]+tgauss1*(xyz2[1]-xyz1[1]);
211  xyz[2]=xyz1[2]+tgauss1*(xyz2[2]-xyz1[2]);
212  double tenseur[9];
213  metrique->evaluer(xyz,tenseur); // output is sizemap tensor at coordinate xyz
214  double val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
215  longueur=longueur+0.5*(tii-ti)*val;
216 
217  double tgauss2=0.7886751345*ti+0.2113248654*tii;
218  xyz[0]=xyz1[0]+tgauss2*(xyz2[0]-xyz1[0]);
219  xyz[1]=xyz1[1]+tgauss2*(xyz2[1]-xyz1[1]);
220  xyz[2]=xyz1[2]+tgauss2*(xyz2[2]-xyz1[2]);
221  metrique->evaluer(xyz,tenseur);// output is sizemap tensor at coordinate xyz
222  val= sqrt(dxyz[0]*dxyz[0]*tenseur[0]+dxyz[0]*dxyz[1]*tenseur[3]+dxyz[0]*dxyz[2]*tenseur[6]+dxyz[1]*dxyz[0]*tenseur[1]+dxyz[1]*dxyz[1]*tenseur[4]+dxyz[1]*dxyz[2]*tenseur[7]+dxyz[2]*dxyz[0]*tenseur[2]+dxyz[2]*dxyz[1]*tenseur[5]+dxyz[2]*dxyz[2]*tenseur[8]);
223  longueur=longueur+0.5*(tii-ti)*val;
224 
225  if (longueur<0.000001) std::cout<<" dxyz[0]="<<dxyz[0]<<" dxyz[1]="<<dxyz[1]<<" dxyz[2]="<<dxyz[2]<<std::endl;
226  }
227  return longueur;
228 }
230  TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &octree,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree,double geo_angle_threshold,FCT_TAILLE* metrique)
231 {
232  MG_NOEUD* nod1=segbgsz->get_noeud1();
233  MG_NOEUD* nod2=segbgsz->get_noeud2();
234  OT_VECTEUR_3D vec1(nod1->get_coord());
235  OT_VECTEUR_3D vec2(nod2->get_coord());
236  OT_VECTEUR_3D vec=(vec1+vec2)/2.;
238 
239 int edgechk=0;
241 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
242 {
243  if (segedg==segbgsz)
244  edgechk++;
245 }
246 
248 MG_TRIANGLE* trilien=segbgsz->get_lien_triangle()->get(0);
249 MG_NOEUD* othernodtrilien;
250 if(segbgsz->get_noeud1()==trilien->get_noeud1() && segbgsz->get_noeud2()==trilien->get_noeud2()) othernodtrilien=trilien->get_noeud3();
251 else if(segbgsz->get_noeud1()==trilien->get_noeud2() && segbgsz->get_noeud2()==trilien->get_noeud1()) othernodtrilien=trilien->get_noeud3();
252 else if(segbgsz->get_noeud1()==trilien->get_noeud2() && segbgsz->get_noeud2()==trilien->get_noeud3()) othernodtrilien=trilien->get_noeud1();
253 else if(segbgsz->get_noeud1()==trilien->get_noeud3() && segbgsz->get_noeud2()==trilien->get_noeud2()) othernodtrilien=trilien->get_noeud1();
254 else if(segbgsz->get_noeud1()==trilien->get_noeud1() && segbgsz->get_noeud2()==trilien->get_noeud3()) othernodtrilien=trilien->get_noeud2();
255 else if(segbgsz->get_noeud1()==trilien->get_noeud3() && segbgsz->get_noeud2()==trilien->get_noeud1()) othernodtrilien=trilien->get_noeud2();
256 int clockwisetri=0;
257 int counterclockwisetri=0;
258  if(segbgsz->get_noeud1()==trilien->get_noeud1() && segbgsz->get_noeud2()==trilien->get_noeud2())
259  clockwisetri++;
260  else if(segbgsz->get_noeud1()==trilien->get_noeud2() && segbgsz->get_noeud2()==trilien->get_noeud3())
261  clockwisetri++;
262  else if(segbgsz->get_noeud1()==trilien->get_noeud3() && segbgsz->get_noeud2()==trilien->get_noeud1())
263  clockwisetri++;
264  else if(segbgsz->get_noeud1()==trilien->get_noeud2() && segbgsz->get_noeud2()==trilien->get_noeud1())
265  counterclockwisetri++;
266  else if(segbgsz->get_noeud1()==trilien->get_noeud1() && segbgsz->get_noeud2()==trilien->get_noeud3())
267  counterclockwisetri++;
268  else if(segbgsz->get_noeud1()==trilien->get_noeud3() && segbgsz->get_noeud2()==trilien->get_noeud2())
269  counterclockwisetri++;
270 
271 if (segbgsz->get_lien_triangle()->get_nb()==1)
272 {
273  deletingtis.ajouter(trilien);
274  MG_TRIANGLE* addtri1;
275  MG_TRIANGLE* addtri2;
276  if(clockwisetri>0)
277  {
278  addtri1=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud1(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
279  addtri2=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud2(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
280  }
281  else if(counterclockwisetri>0)
282  {
283  addtri1=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud2(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
284  addtri2=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud1(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
285  }
286  /*
287  octree.inserer(addtri1);
288  octree.inserer(addtri2);*/
289 }
290 
291 if (segbgsz->get_lien_triangle()->get_nb()==2)
292 {
293  MG_TRIANGLE* trilienother=segbgsz->get_lien_triangle()->get(1);
294  MG_NOEUD* othernodtrilienother;
295  if(segbgsz->get_noeud1()==trilienother->get_noeud1() && segbgsz->get_noeud2()==trilienother->get_noeud2()) othernodtrilienother=trilienother->get_noeud3();
296 else if(segbgsz->get_noeud1()==trilienother->get_noeud2() && segbgsz->get_noeud2()==trilienother->get_noeud1()) othernodtrilienother=trilienother->get_noeud3();
297 else if(segbgsz->get_noeud1()==trilienother->get_noeud2() && segbgsz->get_noeud2()==trilienother->get_noeud3()) othernodtrilienother=trilienother->get_noeud1();
298 else if(segbgsz->get_noeud1()==trilienother->get_noeud3() && segbgsz->get_noeud2()==trilienother->get_noeud2()) othernodtrilienother=trilienother->get_noeud1();
299 else if(segbgsz->get_noeud1()==trilienother->get_noeud1() && segbgsz->get_noeud2()==trilienother->get_noeud3()) othernodtrilienother=trilienother->get_noeud2();
300 else if(segbgsz->get_noeud1()==trilienother->get_noeud3() && segbgsz->get_noeud2()==trilienother->get_noeud1()) othernodtrilienother=trilienother->get_noeud2();
301  deletingtis.ajouter(trilien);
302  deletingtis.ajouter(trilienother);
303  MG_TRIANGLE* addtri1;
304  MG_TRIANGLE* addtri2;
305  MG_TRIANGLE* addtri3;
306  MG_TRIANGLE* addtri4;
307  if(clockwisetri>0)
308  {
309  addtri1=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud1(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
310  addtri2=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud2(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
311  addtri3=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud1(),othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
312  addtri4=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud2(),midnd,othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
313  }
314  else if(counterclockwisetri>0)
315  {
316  addtri1=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud2(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
317  addtri2=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud1(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
318  addtri3=mai->ajouter_mg_triangle(NULL,midnd,segbgsz->get_noeud2(),othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
319  addtri4=mai->ajouter_mg_triangle(NULL,segbgsz->get_noeud1(),midnd,othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
320  }
321  /*
322  octree.inserer(addtri1);
323  octree.inserer(addtri2);
324  octree.inserer(addtri3);
325  octree.inserer(addtri4);*/
326 }
327 
328 
329 double* segbgszxyz1=segbgsz->get_noeud1()->get_coord();
330 double* segbgszxyz2=segbgsz->get_noeud2()->get_coord();
331 double delsegbgsz=calcul_distance_metrique(segbgszxyz1,segbgszxyz2,32,metrique);
332 for (SIZMAPSORT::iterator itdelsegbgsz=sizemapsorting.find(delsegbgsz);itdelsegbgsz!=sizemapsorting.end();itdelsegbgsz++)
333 {
334  if ((*itdelsegbgsz).second==segbgsz)
335  {sizemapsorting.erase(itdelsegbgsz);
336  break;}
337 }
338 
339 
340 
341 
342 if (edgechk!=0)
343 {
344  lstedges.supprimer(segbgsz);
345  for (int noliensegmdnd=0;noliensegmdnd<midnd->get_lien_segment()->get_nb();noliensegmdnd++)
346  {
347  MG_SEGMENT* seglien=midnd->get_lien_segment()->get(noliensegmdnd);
348  if(seglien->get_noeud1()==segbgsz->get_noeud1() || seglien->get_noeud1()==segbgsz->get_noeud2() || seglien->get_noeud2()==segbgsz->get_noeud1() || seglien->get_noeud2()==segbgsz->get_noeud2())
349  lstedges.ajouter(seglien);
350  }
351 }
352 
353 for(int nodeletingtis=0;nodeletingtis<deletingtis.get_nb();nodeletingtis++)
354 {
355  MG_TRIANGLE* deletingti=deletingtis.get(nodeletingtis);
356  octree.supprimer(deletingti);
357  mai->supprimer_mg_triangleid(deletingti->get_id());
358 }
359 
360 TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctri;
361 int stltrinb=lststloctri.get_nb();
362 int midndonstlorig=0;
363 double search_radius=vec.get_longueur();
364  // while (intristltribas==0 && stltrisearchit<5)
365 while(stltrinb==0)
366 {
367  stloctree.rechercher(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,lststloctri);
368  stltrinb=lststloctri.get_nb(); search_radius=1.2*search_radius;
369 }
370 
372 for (MG_TRIANGLE* stltr1=lststloctri.get_premier(itstl1);stltr1!=NULL;stltr1=lststloctri.get_suivant(itstl1))
373 {
374  MG_MAILLAGE_OUTILS mdndintritest;
375  int mdndintritestval=mdndintritest.estdansletriangle(stltr1,midnd->get_x(),midnd->get_y(),midnd->get_z());
376  MG_MAILLAGE_OUTILS tribas;
377  int outstl=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::INTERIEUR);
378  if (outstl==1) midndonstlorig++;
379 }
380 if(midndonstlorig==0)
381 {
382  //cout<<"projection onto original stl have to be performed"<<endl;
383  OT_VECTEUR_3D prndxyz=projecton_stlorig(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,stloctree);
384  if (prndxyz.get_x()!=midnd->get_x() || prndxyz.get_y()!=midnd->get_y() || prndxyz.get_z()!=midnd->get_z())
385  {
386  //cout<<" PROJECTEEEEDDD"<<endl;
387  //cout<< prndxyz.get_x()<<" and "<<prndxyz.get_x()<<" and "<<prndxyz.get_x()<<endl;
388  //cout<< midnd->get_x()<<" and "<<midnd->get_x()<<" and "<<midnd->get_x()<<endl;
389  midnd->change_coord(prndxyz);
390  }
391 }
392 
393 for(int mdndtrsno=0;mdndtrsno<midnd->get_lien_triangle()->get_nb();mdndtrsno++)
394 {
395  MG_TRIANGLE* mdndlnktr=midnd->get_lien_triangle()->get(mdndtrsno);
396  octree.inserer(mdndlnktr);
397 }
398 for(int mdndsgsno=0;mdndsgsno<midnd->get_lien_segment()->get_nb();mdndsgsno++)
399 {
400  MG_SEGMENT* mdndlnksg=midnd->get_lien_segment()->get(mdndsgsno);
401  double* mdndlnksgxyz1=mdndlnksg->get_noeud1()->get_coord();
402  double* mdndlnksgxyz2=mdndlnksg->get_noeud2()->get_coord();
403  double mdndlnksgmetriclength=calcul_distance_metrique(mdndlnksgxyz1,mdndlnksgxyz2,32,metrique);
404  sizemapsorting.insert(std::pair<double,MG_SEGMENT*>(mdndlnksgmetriclength,mdndlnksg));
405 }
406 
407 TPL_MAP_ENTITE<MG_TRIANGLE*> lstrilnkmidnd;
408 for(int notrilnkmidnd=0;notrilnkmidnd<midnd->get_lien_triangle()->get_nb();notrilnkmidnd++)
409  lstrilnkmidnd.ajouter(midnd->get_lien_triangle()->get(notrilnkmidnd));
410 TPL_MAP_ENTITE<MG_SEGMENT*> lstsgtrilnkmidnd;
412 TPL_LISTE_ENTITE<MG_SEGMENT*> lstasupprimer;
413 for(MG_TRIANGLE* trilnkmidnd=lstrilnkmidnd.get_premier(itlstrilnkmidnd);trilnkmidnd!=NULL;trilnkmidnd=lstrilnkmidnd.get_suivant(itlstrilnkmidnd))
414 {
415  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment1());
416  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment2());
417  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment3());
418 }
419 
420 TPL_LISTE_ENTITE<MG_SEGMENT*> lstsglnkmdnd;
421 for(int nosglnkmdnd=0;nosglnkmdnd<midnd->get_lien_segment()->get_nb();nosglnkmdnd++)
422  lstsglnkmdnd.ajouter(midnd->get_lien_segment()->get(nosglnkmdnd));
423 
424 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstsgtrilnkmidnd;
425 for(MG_SEGMENT* sgtrilnkmidnd=lstsgtrilnkmidnd.get_premier(itlstsgtrilnkmidnd);sgtrilnkmidnd!=NULL;sgtrilnkmidnd=lstsgtrilnkmidnd.get_suivant(itlstsgtrilnkmidnd))
426 {
427  for(int nolstsglnkmdnd=0;nolstsglnkmdnd<lstsglnkmdnd.get_nb();nolstsglnkmdnd++)
428  {
429  if(sgtrilnkmidnd==lstsglnkmdnd.get(nolstsglnkmdnd))
430  lstasupprimer.ajouter(sgtrilnkmidnd);
431  }
432 }
433 for (int i=0;i<lstasupprimer.get_nb();i++)
434  {
435  MG_SEGMENT* seg=lstasupprimer.get(i);
436  lstsgtrilnkmidnd.supprimer(seg);
437  }
438 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstsgtrilnkmidndswchk;
439 for(MG_SEGMENT* sgtrilnkmidndswchk=lstsgtrilnkmidnd.get_premier(itlstsgtrilnkmidndswchk);sgtrilnkmidndswchk!=NULL;sgtrilnkmidndswchk=lstsgtrilnkmidnd.get_suivant(itlstsgtrilnkmidndswchk))
440  swap_diag_delaunay_sizemapref(midnd,sgtrilnkmidndswchk,sizemapsorting,lstedges,octree,mai,geo_angle_threshold,stloctree,metrique);
441 }
443  TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &octree,MG_MAILLAGE* mai,double geo_angle_threshold,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree,FCT_TAILLE* metrique)
444 {
445  //cout<<" swap_diag_delaunay is started"<<endl;
446 int edgechk=0;
448 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
449 {
450  if (segedg==segchk)
451  edgechk++;
452 }
453 if (edgechk==0 && segchk->get_lien_triangle()->get_nb()==2)
454 {
455  MG_TRIANGLE* dchktri; // dchktri is triangle that includes the insertnod (midnd)
456  MG_TRIANGLE* trichk; // other connected tri is trichk
457 
458  //int segchktrinb=segchk->get_lien_triangle()->get_nb();
459  //if (segchktrinb>2 || segchktrinb<1) cout<<"PROBLEM IN TRIANGULATIONNNNNNNNNNNNNN"<<endl;
460  for (int isct=0;isct<segchk->get_lien_triangle()->get_nb();isct++)
461  {
462  MG_TRIANGLE* trick=segchk->get_lien_triangle()->get(isct);
463  if (trick->get_noeud1()==insertnod || trick->get_noeud2()==insertnod || trick->get_noeud3()==insertnod)
464  dchktri=trick;
465  else trichk=trick;
466  }
467  MG_MAILLAGE_OUTILS getangle;
468  double teta=getangle.get_angle(trichk,dchktri);
469  teta=teta*180./3.14159265;
470  //cout<<"teta= "<<teta<<endl;
471  if (teta>180.-geo_angle_threshold && teta<geo_angle_threshold+180.)
472  {
473  //cout<<"teta is OKkk :)"<<endl;
474  MG_NOEUD* othertrianglenode;
475  if(trichk->get_noeud1()!=segchk->get_noeud1() && trichk->get_noeud1()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud1();
476  else if(trichk->get_noeud2()!=segchk->get_noeud1() && trichk->get_noeud2()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud2();
477  else if(trichk->get_noeud3()!=segchk->get_noeud1() && trichk->get_noeud3()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud3();
478 
479 
480 TPL_MAP_ENTITE<MG_SEGMENT*> relatedseg;
481 for(int irelatedseg1=0;irelatedseg1<insertnod->get_lien_triangle()->get_nb();irelatedseg1++)
482 {
483  MG_TRIANGLE* trirel1=insertnod->get_lien_triangle()->get(irelatedseg1);
484  relatedseg.ajouter(trirel1->get_segment1());
485  relatedseg.ajouter(trirel1->get_segment2());
486  relatedseg.ajouter(trirel1->get_segment3());
487 }
488 for(int irelatedseg2=0;irelatedseg2<othertrianglenode->get_lien_triangle()->get_nb();irelatedseg2++)
489 {
490  MG_TRIANGLE* trirel2=othertrianglenode->get_lien_triangle()->get(irelatedseg2);
491  relatedseg.ajouter(trirel2->get_segment1());
492  relatedseg.ajouter(trirel2->get_segment2());
493  relatedseg.ajouter(trirel2->get_segment3());
494 }
495 int checkifswpdigisexist=0;
497 for(MG_SEGMENT* segtest=relatedseg.get_premier(itrelatedseg);segtest!=NULL;segtest=relatedseg.get_suivant(itrelatedseg))
498 {
499  if(segtest->get_noeud1()==insertnod && segtest->get_noeud2()==othertrianglenode) checkifswpdigisexist++;
500  if(segtest->get_noeud2()==insertnod && segtest->get_noeud1()==othertrianglenode) checkifswpdigisexist++;
501 }
502 
503 double anglestltiandswaptri1;
504 double anglestltiandswaptri2;
505 
506  MG_NOEUD* segchknd1=segchk->get_noeud1();
507  MG_NOEUD* segchknd2=segchk->get_noeud2();
508  MG_NOEUD* trichknd;
509  MG_NOEUD* trichknd1=trichk->get_noeud1();
510  MG_NOEUD* trichknd2=trichk->get_noeud2();
511  MG_NOEUD* trichknd3=trichk->get_noeud3();
512  if (trichknd1!=segchknd1 && trichknd1!=segchknd2) trichknd=trichknd1;
513  if (trichknd2!=segchknd1 && trichknd2!=segchknd2) trichknd=trichknd2;
514  if (trichknd3!=segchknd1 && trichknd3!=segchknd2) trichknd=trichknd3;
515  OT_VECTEUR_3D normaltriafterswaptri1;
516  OT_VECTEUR_3D normaltriafterswaptri2;
517 
518  double centrnoid[3];
519  centrnoid[0]=(segchknd1->get_x()+segchknd2->get_x())/2.;
520  centrnoid[1]=(segchknd1->get_y()+segchknd2->get_y())/2.;
521  centrnoid[2]=(segchknd1->get_z()+segchknd2->get_z())/2.;
522 
523 TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctriswtest1;
524 int stltriswtest1nb=lststloctriswtest1.get_nb();
525 double stl_rad_search_swdg=0.001;
526 while(stltriswtest1nb==0)
527 {
528  stloctree.rechercher(centrnoid[0],centrnoid[1],centrnoid[2],stl_rad_search_swdg,lststloctriswtest1);
529  stltriswtest1nb=lststloctriswtest1.get_nb(); stl_rad_search_swdg=1.1*stl_rad_search_swdg;
530 }
531 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itlststloctriswtest1;
532 MG_TRIANGLE* stlclostri=lststloctriswtest1.get_premier(itlststloctriswtest1);
533 OT_VECTEUR_3D vecstlclostri1=OT_VECTEUR_3D(stlclostri->get_noeud1()->get_coord(),stlclostri->get_noeud2()->get_coord());
534 OT_VECTEUR_3D vecstlclostri2=OT_VECTEUR_3D(stlclostri->get_noeud1()->get_coord(),stlclostri->get_noeud3()->get_coord());
535 OT_VECTEUR_3D normavecstlclostri=(vecstlclostri1&vecstlclostri2);
536 OT_VECTEUR_3D uninormavecstlclostri=normavecstlclostri; uninormavecstlclostri.norme();
537 
538  int counterclockwise=0;
539  if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud2()) counterclockwise++;
540  if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud3()) counterclockwise++;
541  if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud1()) counterclockwise++;
542  int clockwise=0;
543  if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud1()) clockwise++;
544  if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud2()) clockwise++;
545  if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud3()) clockwise++;
546 
547  if (counterclockwise>0 && clockwise==0)
548  {
549 anglestltiandswaptri1= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,segchknd1,trichknd);
550 anglestltiandswaptri2= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,trichknd,segchknd2);
551 
552  /*
553  OT_VECTEUR_3D vect11=OT_VECTEUR_3D(insertnod->get_coord(),segchknd1->get_coord());
554  OT_VECTEUR_3D vect12=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
555  OT_VECTEUR_3D normavectri1=(vect11&vect12);
556  normaltriafterswaptri1=normavectri1; normaltriafterswaptri1.norme();
557  //centrnoidtri1[0]=(insertnod->get_x()+segchknd1->get_x()+trichknd->get_x())/3.;
558  //centrnoidtri1[1]=(insertnod->get_y()+segchknd1->get_y()+trichknd->get_y())/3.;
559  //centrnoidtri1[2]=(insertnod->get_z()+segchknd1->get_z()+trichknd->get_z())/3.;
560 
561  OT_VECTEUR_3D vect21=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
562  OT_VECTEUR_3D vect22=OT_VECTEUR_3D(insertnod->get_coord(),segchknd2->get_coord());
563  OT_VECTEUR_3D normavectri2=(vect21&vect22);
564  normaltriafterswaptri2=normavectri2; normaltriafterswaptri2.norme();
565  // centrnoidtri2[0]=(insertnod->get_x()+segchknd2->get_x()+trichknd->get_x())/3.;
566  //centrnoidtri2[1]=(insertnod->get_y()+segchknd2->get_y()+trichknd->get_y())/3.;
567  //centrnoidtri2[2]=(insertnod->get_z()+segchknd2->get_z()+trichknd->get_z())/3.;
568  */
569  }
570  else if (clockwise>0 && counterclockwise==0)
571  {
572 anglestltiandswaptri1= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,segchknd2,trichknd);
573 anglestltiandswaptri2= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,trichknd,segchknd1);
574  /*
575  OT_VECTEUR_3D vect11=OT_VECTEUR_3D(insertnod->get_coord(),segchknd2->get_coord());
576  OT_VECTEUR_3D vect12=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
577  OT_VECTEUR_3D normavectri1=(vect11&vect12);
578  normaltriafterswaptri1=normavectri1; normaltriafterswaptri1.norme();
579  //centrnoidtri1[0]=(insertnod->get_x()+segchknd2->get_x()+trichknd->get_x())/3.;
580  //centrnoidtri1[1]=(insertnod->get_y()+segchknd2->get_y()+trichknd->get_y())/3.;
581  //centrnoidtri1[2]=(insertnod->get_z()+segchknd2->get_z()+trichknd->get_z())/3.;
582 
583  OT_VECTEUR_3D vect21=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
584  OT_VECTEUR_3D vect22=OT_VECTEUR_3D(insertnod->get_coord(),segchknd1->get_coord());
585  OT_VECTEUR_3D normavectri2=(vect21&vect22);
586  normaltriafterswaptri2=normavectri2; normaltriafterswaptri2.norme();
587  //centrnoidtri2[0]=(insertnod->get_x()+segchknd1->get_x()+trichknd->get_x())/3.;
588  //centrnoidtri2[1]=(insertnod->get_y()+segchknd1->get_y()+trichknd->get_y())/3.;
589  //centrnoidtri2[2]=(insertnod->get_z()+segchknd1->get_z()+trichknd->get_z())/3.;
590  */
591  }
592 
593 
594 
595 
596 
597 if(checkifswpdigisexist==0 && anglestltiandswaptri1<3.14159265 && anglestltiandswaptri2<3.14159265)
598 {
599  double pinsphnbnewtri=inshper_point(othertrianglenode,dchktri);
600  double pinsphnbothertri=inshper_point(insertnod,trichk);
601 int qualchk=0;
602 std::map<double,MG_NOEUD*,std::less<double> > beforeswap;
603 std::map<double,MG_NOEUD*,std::less<double> > afterswap;
604 MG_MAILLAGE_OUTILS triquality;
605 double triqualnew=triquality.qualite_triangle(dchktri->get_noeud1()->get_coord(),dchktri->get_noeud2()->get_coord(),dchktri->get_noeud3()->get_coord());
606 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualnew,dchktri->get_noeud1()));
607 double triqualchek=triquality.qualite_triangle(trichk->get_noeud1()->get_coord(),trichk->get_noeud2()->get_coord(),trichk->get_noeud3()->get_coord());
608 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualchek,dchktri->get_noeud2()));
609 double afterswap1=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud1()->get_coord());
610 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap1,insertnod));
611 double afterswap2=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud2()->get_coord());
612 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap2,othertrianglenode));
613 std::map<double,MG_NOEUD*,std::less<double> >::iterator itbeforeswap=beforeswap.begin();
614 std::map<double,MG_NOEUD*,std::less<double> >::iterator itafterswap=afterswap.begin();
615 
616 if (qualswap>0 && (*itafterswap).first>(*itbeforeswap).first) qualchk=qualchk+1;
617 if (pinsphnbnewtri<=0.|| pinsphnbothertri<=0.) //inside sphere
618  if(qualchk>0)
619  {
620 
621  //cout<<" swap diagonal is operated"<<endl;
622  //MG_NOEUD* segchknd1=segchk->get_noeud1();
623  //MG_NOEUD* segchknd2=segchk->get_noeud2();
624 
625  MG_TRIANGLE* triad1;
626  MG_TRIANGLE* triad2;
627  int counterclockwise=0;
628  if (segchk->get_noeud1()==dchktri->get_noeud1() && segchk->get_noeud2()==dchktri->get_noeud2()) counterclockwise++;
629  if (segchk->get_noeud1()==dchktri->get_noeud2() && segchk->get_noeud2()==dchktri->get_noeud3()) counterclockwise++;
630  if (segchk->get_noeud1()==dchktri->get_noeud3() && segchk->get_noeud2()==dchktri->get_noeud1()) counterclockwise++;
631  int clockwise=0;
632  if (segchk->get_noeud1()==dchktri->get_noeud2() && segchk->get_noeud2()==dchktri->get_noeud1()) clockwise++;
633  if (segchk->get_noeud1()==dchktri->get_noeud3() && segchk->get_noeud2()==dchktri->get_noeud2()) clockwise++;
634  if (segchk->get_noeud1()==dchktri->get_noeud1() && segchk->get_noeud2()==dchktri->get_noeud3()) clockwise++;
635  //cout<<"counterclockwise= "<<counterclockwise<<" clockwise= "<<clockwise<<endl;
636 
637  if (counterclockwise>0 && clockwise==0)
638  {
639  //cout<<" counterclockwise"<<endl;
640  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchk->get_noeud1(),othertrianglenode, MAGIC::ORIGINE::MAILLEUR_AUTO);
641  triad2=mai->ajouter_mg_triangle(NULL,insertnod,othertrianglenode,segchk->get_noeud2(), MAGIC::ORIGINE::MAILLEUR_AUTO);
642  }
643  if (clockwise>0 && counterclockwise==0)
644  {
645  //cout<<" clockwise"<<endl;
646  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchk->get_noeud2(),othertrianglenode, MAGIC::ORIGINE::MAILLEUR_AUTO);
647  triad2=mai->ajouter_mg_triangle(NULL,insertnod,othertrianglenode,segchk->get_noeud1(), MAGIC::ORIGINE::MAILLEUR_AUTO);
648  }
649 
650  octree.inserer(triad1);
651  octree.inserer(triad2);
652  octree.supprimer(dchktri);
653  octree.supprimer(trichk);
654 
655 
656  //MG_SEGMENT* sizseg=mai->get_mg_segment(insertnod->get_id(),othertrianglenode->get_id()); //if the order of nodes in segments are not important
659  triad1segs.ajouter(triad1->get_segment1());
660  triad1segs.ajouter(triad1->get_segment2());
661  triad1segs.ajouter(triad1->get_segment3());
662  triad2segs.ajouter(triad2->get_segment1());
663  triad2segs.ajouter(triad2->get_segment2());
664  triad2segs.ajouter(triad2->get_segment3());
665  MG_SEGMENT* sizsegment;
666 
667  for(int count1=0;count1<triad1segs.get_nb();count1++)
668  {
669  MG_SEGMENT* segcount1=triad1segs.get(count1);
670  for(int count2=0;count2<triad2segs.get_nb();count2++)
671  {
672  MG_SEGMENT* segcount2=triad2segs.get(count2);
673  if (segcount1==segcount2)
674  {
675  sizsegment=segcount1;
676  //cout<<" yess adedd YEESSSSSSSSSS"<<endl;
677  }
678 
679 
680  }
681  }
682  //if (!(sizsegment->get_noeud1()==insertnod || sizsegment->get_noeud1()==othertrianglenode))
683  //cout<<" !(sizsegment->change_noeud1()==insertnod || sizsegment->change_noeud1()==othertrianglenode)"<<endl;
684  double* xyz11=sizsegment->get_noeud1()->get_coord();
685  double* xyz21=sizsegment->get_noeud2()->get_coord();
686  double metriclength1=calcul_distance_metrique(xyz11,xyz21,32,metrique);
687  sizemapsorting.insert(std::pair<double,MG_SEGMENT*>(metriclength1,sizsegment));
688 
689  // deletefrom sizemapsorting
690  double* segchkzxyz1=segchk->get_noeud1()->get_coord();
691  double* segchkzxyz2=segchk->get_noeud2()->get_coord();
692  double delsegchk=calcul_distance_metrique(segchkzxyz1,segchkzxyz2,32,metrique);
693  //cout<<"delsegchk= "<<delsegchk<<endl;
694 for (SIZMAPSORT::iterator itdelsegchksz=sizemapsorting.find(delsegchk);itdelsegchksz!=sizemapsorting.end();itdelsegchksz++)
695 {
696  //cout<<"the seg is found hereeee"<<endl;
697  if ((*itdelsegchksz).second==segchk)
698  {
699  sizemapsorting.erase(itdelsegchksz);break;
700  //cout<<"delition of segchk for delaunay flip in this step is doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooone"<<endl;
701  }
702 
703 }
704 mai->supprimer_mg_triangleid(dchktri->get_id());
705  mai->supprimer_mg_triangleid(trichk->get_id());
706  }
707 }
708  }
709 }
710 }
712 {
715  qualswap=1;
716  double edge_angle_threshold=45.;
717  double geo_angle_threshold=25.;
718  double targetsizecontrol=0.1;
721 
722 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
723  TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
724  LISTE_MG_NOEUD::iterator itn;
725  for (MG_NOEUD* no=mai->get_premier_noeud(itn);no!=NULL;no=mai->get_suivant_noeud(itn))
726  {
727  if (no->get_x()<xmin) xmin=no->get_x();
728  if (no->get_y()<ymin) ymin=no->get_y();
729  if (no->get_z()<zmin) zmin=no->get_z();
730  if (no->get_x()>xmax) xmax=no->get_x();
731  if (no->get_y()>ymax) ymax=no->get_y();
732  if (no->get_z()>zmax) zmax=no->get_z();
733  lstnoeud.ajouter(no);
734  }
735 
736  OT_VECTEUR_3D vecmin(xmin,ymin,zmin);OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
737  OT_VECTEUR_3D vec(vecmmax,vecmin);
738  double bounbox_diag=vec.get_longueur();
739  double search_radius=0.1*bounbox_diag;
740  char bboxdiag[1000];
741  sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
742  affiche((char*) bboxdiag);
743 
744  OT_VECTEUR_3D min(xmin,ymin,zmin);
745  OT_VECTEUR_3D max(xmax,ymax,zmax);
746  OT_VECTEUR_3D average=(min+max)/2.;
747  OT_VECTEUR_3D lengthvec(min,max);
748  double length=sqrt(lengthvec*lengthvec);
749  double bxr=1.1;
750  xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
751  xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
753  stloctree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
754  LISTE_MG_TRIANGLE::iterator itoctrins1;
755  for (MG_TRIANGLE* stloctrins=stlmai->get_premier_triangle(itoctrins1);stloctrins!=NULL;stloctrins=stlmai->get_suivant_triangle(itoctrins1))
756  stloctree.inserer(stloctrins);
758  octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
759  LISTE_MG_TRIANGLE::iterator itoctrins;
760  for (MG_TRIANGLE* octrins=mai->get_premier_triangle(itoctrins);octrins!=NULL;octrins=mai->get_suivant_triangle(itoctrins))
761  octree.inserer(octrins);
762 
763  double targetsize=2.*targetsizecontrol*bounbox_diag;
764  // initiate the material edge :)
766 LISTE_MG_SEGMENT::iterator ited;
767 for (MG_SEGMENT* seged=mai->get_premier_segment(ited);seged!=NULL;seged=mai->get_suivant_segment(ited))
768 {
769  if (seged->get_lien_triangle()->get_nb()==1) lstedges.ajouter(seged); // The boundary segments in open surfaces
770  else if (seged->get_lien_triangle()->get_nb()==2)
771  {
772  MG_TRIANGLE* tri1=seged->get_lien_triangle()->get(0);
773  MG_TRIANGLE* tri2=seged->get_lien_triangle()->get(1);
774  MG_MAILLAGE_OUTILS getangle;
775  double teta=getangle.get_angle(tri1,tri2);teta=teta*180./3.14159265;
776  if (teta<=(180.-edge_angle_threshold) || teta>=(edge_angle_threshold+180.)) lstedges.ajouter(seged);
777  }
778 }
779 /*
780 std::map<unsigned long,unsigned long> nodemaicomp;
781 TPL_MAP_ENTITE<MG_NOEUD*> lstednd;
782 for(int ied1=0;ied1<lstedges.get_nb();ied1++)
783 {
784  MG_NOEUD* nd1=lstedges.get(ied1)->get_noeud1();
785  MG_NOEUD* nd2=lstedges.get(ied1)->get_noeud2();
786  lstednd.ajouter(nd1);
787  lstednd.ajouter(nd2);
788 }
789 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itlstednd;
790 for(MG_NOEUD* ndedg=lstednd.get_premier(itlstednd);ndedg!=NULL;ndedg=lstednd.get_suivant(itlstednd))
791 {
792  MG_NOEUD* nd=edgemai->ajouter_mg_noeud(NULL,ndedg->get_x(),ndedg->get_y(),ndedg->get_z(),IMPOSE);
793  nodemaicomp.insert(pair<unsigned long,unsigned long> (ndedg->get_id(),nd->get_id()));
794 }
795 
796 for(int ied1=0;ied1<lstedges.get_nb();ied1++)
797 {
798  std::map<unsigned long,unsigned long>::iterator itnd;
799  MG_NOEUD* maind1=lstedges.get(ied1)->get_noeud1();
800  itnd=nodemaicomp.find(maind1->get_id());
801  MG_NOEUD* segnd1=edgemai->get_mg_noeudid((*itnd).second);
802  MG_NOEUD* maind2=lstedges.get(ied1)->get_noeud2();
803  itnd=nodemaicomp.find(maind2->get_id());
804  MG_NOEUD* segnd2=edgemai->get_mg_noeudid((*itnd).second);
805  edgemai->ajouter_mg_segment(NULL,segnd1,segnd2,IMPOSE);
806 }
807 
808 cout<<"edgemai->get_nb_mg_noeud()= "<<edgemai->get_nb_mg_noeud()<<endl;
809 cout<<"edgemai->get_nb_mg_segment()= "<<edgemai->get_nb_mg_segment()<<endl;
810 */
811 STLSORTMMAP stltrisorting;
812 LISTE_MG_TRIANGLE::iterator it1;
813 for (MG_TRIANGLE* tri=mai->get_premier_triangle(it1);tri!=NULL;tri=mai->get_suivant_triangle(it1))
814 {
815  double trisz=targetsize_criteria(tri);
816  stltrisorting.insert(std::pair<double,MG_TRIANGLE*>(trisz,tri));
817 }
818 STLSORTMMAP:: iterator itm = stltrisorting.begin();
819 
820 while ((*itm).first>targetsize)
821 {
822  //cout<<"size of selected triangle is= "<<(*itm).first<<endl;
823  MG_TRIANGLE* bigesttri=(*itm).second;
824  MG_SEGMENT* longs1;
825  MG_SEGMENT* s1=bigesttri->get_segment1(); double ls1=s1->get_longueur();
826  MG_SEGMENT* s2=bigesttri->get_segment2(); double ls2=s2->get_longueur();
827  MG_SEGMENT* s3=bigesttri->get_segment3(); double ls3=s3->get_longueur();
828  if (ls1>=ls2 && ls1>=ls3) longs1=s1;
829  else if (ls2>=ls1 && ls2>=ls3) longs1=s2;
830  else if (ls3>=ls1 && ls3>=ls2) longs1=s3;
831 MG_TRIANGLE* lscktriold=bigesttri;
832 MG_SEGMENT* longsidold=longs1;
833 MG_TRIANGLE* lscktri;
834 MG_SEGMENT* longsid;
835  int l=1;
836  while (l==1)
837  {
838  for (int i=0;i<longsidold->get_lien_triangle()->get_nb();i++)
839  {
840  MG_TRIANGLE* lscktrinei=longsidold->get_lien_triangle()->get(i);
841  if (lscktrinei!=lscktriold) lscktri=lscktrinei;
842  }
843  MG_SEGMENT* lscks1=lscktri->get_segment1(); double lscks1len=lscks1->get_longueur();
844  MG_SEGMENT* lscks2=lscktri->get_segment2(); double lscks2len=lscks2->get_longueur();
845  MG_SEGMENT* lscks3=lscktri->get_segment3(); double lscks3len=lscks3->get_longueur();
846  if (lscks1!=longsidold && lscks1len>longsidold->get_longueur()) longsid=lscks1;
847  else if (lscks2!=longsidold && lscks2len>longsidold->get_longueur()) longsid=lscks2;
848  else if (lscks3!=longsidold && lscks3len>longsidold->get_longueur()) longsid=lscks3;
849  else longsid=longsidold;
850  if (longsid==longsidold) l++;
851  lscktriold=lscktri;
852  longsidold=longsid;
853  }
854 
856  lstlscktri.ajouter(lscktriold->get_segment1());
857  lstlscktri.ajouter(lscktriold->get_segment2());
858  lstlscktri.ajouter(lscktriold->get_segment3());
859  std::multimap< double, MG_SEGMENT*, std::greater<double> > mmifedge;
860  int edgesintri=0;
861 
862  for(int ilscktri=0;ilscktri<lstlscktri.get_nb();ilscktri++)
863  {
864  MG_SEGMENT* seglscktri=lstlscktri.get(ilscktri);
865  double seglscktri_length=seglscktri->get_longueur();
866  double longsidold_length=longsidold->get_longueur();
868 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
869 {
870  if (seglscktri_length>(0.3*longsidold_length) && segedg==seglscktri)
871  {
872  mmifedge.insert(std::pair<double, MG_SEGMENT*>(seglscktri->get_longueur(),seglscktri));
873  edgesintri++;
874  //cout<<"the boundary treatment of triangles is done"<<endl;
875  }
876 }
877  }
878 
879  std::multimap< double, MG_SEGMENT*, std::greater<double> >::iterator itmmifedge=mmifedge.begin();
880  if(edgesintri>0 && useboundrytreatment>0)
881  longsidold=(*itmmifedge).second;
882 
883  MG_SEGMENT* lastlsseg=longsidold;
884 
885  bisection_operator_refstl(mai,lastlsseg,stltrisorting,lstedges,octree,stloctree,geo_angle_threshold,lscktriold);
886 
887 
888 
889 
890  itm = stltrisorting.begin();
891  }
892 
893 
894 stl_smoothing(mai,lstedges,octree,stloctree,search_radius);
896  }
899  TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &octree,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree,double geo_angle_threshold,MG_TRIANGLE* lscktriold)
900 {
901  int midndnotonedge=0;
902  MG_NOEUD* nd1=lastlsseg->get_noeud1();
903  MG_NOEUD* nd2=lastlsseg->get_noeud2();
904  OT_VECTEUR_3D vec1(nd1->get_coord());
905  OT_VECTEUR_3D vec2(nd2->get_coord());
906  OT_VECTEUR_3D vec=(vec1+vec2)/2.;
908  // if segment is an edge ? ??
909 int edgechk=0;
911 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
912 {
913  if (segedg==lastlsseg)
914  edgechk++;
915 }
916 
917  // another method, the new one:
919 MG_TRIANGLE* trilien=lastlsseg->get_lien_triangle()->get(0);
920 MG_NOEUD* othernodtrilien;
921 if(lastlsseg->get_noeud1()==trilien->get_noeud1() && lastlsseg->get_noeud2()==trilien->get_noeud2()) othernodtrilien=trilien->get_noeud3();
922 else if(lastlsseg->get_noeud1()==trilien->get_noeud2() && lastlsseg->get_noeud2()==trilien->get_noeud1()) othernodtrilien=trilien->get_noeud3();
923 else if(lastlsseg->get_noeud1()==trilien->get_noeud2() && lastlsseg->get_noeud2()==trilien->get_noeud3()) othernodtrilien=trilien->get_noeud1();
924 else if(lastlsseg->get_noeud1()==trilien->get_noeud3() && lastlsseg->get_noeud2()==trilien->get_noeud2()) othernodtrilien=trilien->get_noeud1();
925 else if(lastlsseg->get_noeud1()==trilien->get_noeud1() && lastlsseg->get_noeud2()==trilien->get_noeud3()) othernodtrilien=trilien->get_noeud2();
926 else if(lastlsseg->get_noeud1()==trilien->get_noeud3() && lastlsseg->get_noeud2()==trilien->get_noeud1()) othernodtrilien=trilien->get_noeud2();
927 int clockwisetri=0;
928 int counterclockwisetri=0;
929  if(lastlsseg->get_noeud1()==trilien->get_noeud1() && lastlsseg->get_noeud2()==trilien->get_noeud2())
930  clockwisetri++;
931  else if(lastlsseg->get_noeud1()==trilien->get_noeud2() && lastlsseg->get_noeud2()==trilien->get_noeud3())
932  clockwisetri++;
933  else if(lastlsseg->get_noeud1()==trilien->get_noeud3() && lastlsseg->get_noeud2()==trilien->get_noeud1())
934  clockwisetri++;
935  else if(lastlsseg->get_noeud1()==trilien->get_noeud2() && lastlsseg->get_noeud2()==trilien->get_noeud1())
936  counterclockwisetri++;
937  else if(lastlsseg->get_noeud1()==trilien->get_noeud1() && lastlsseg->get_noeud2()==trilien->get_noeud3())
938  counterclockwisetri++;
939  else if(lastlsseg->get_noeud1()==trilien->get_noeud3() && lastlsseg->get_noeud2()==trilien->get_noeud2())
940  counterclockwisetri++;
941 
942 if (lastlsseg->get_lien_triangle()->get_nb()==1)
943 {
944  deletingtis.ajouter(trilien);
945  MG_TRIANGLE* addtri1;
946  MG_TRIANGLE* addtri2;
947  if(clockwisetri>0)
948  {
949  addtri1=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud1(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
950  addtri2=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud2(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
951  }
952  else if(counterclockwisetri>0)
953  {
954  addtri1=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud2(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
955  addtri2=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud1(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
956  }
957  /*
958  octree.inserer(addtri1);
959  octree.inserer(addtri2);
960  double trisiz1=targetsize_criteria(addtri1);
961  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz1,addtri1));
962  double trisiz2=targetsize_criteria(addtri2);
963  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz2,addtri2));*/
964 }
965 
966 if (lastlsseg->get_lien_triangle()->get_nb()==2)
967 {
968  MG_TRIANGLE* trilienother=lastlsseg->get_lien_triangle()->get(1);
969  MG_NOEUD* othernodtrilienother;
970  if(lastlsseg->get_noeud1()==trilienother->get_noeud1() && lastlsseg->get_noeud2()==trilienother->get_noeud2()) othernodtrilienother=trilienother->get_noeud3();
971 else if(lastlsseg->get_noeud1()==trilienother->get_noeud2() && lastlsseg->get_noeud2()==trilienother->get_noeud1()) othernodtrilienother=trilienother->get_noeud3();
972 else if(lastlsseg->get_noeud1()==trilienother->get_noeud2() && lastlsseg->get_noeud2()==trilienother->get_noeud3()) othernodtrilienother=trilienother->get_noeud1();
973 else if(lastlsseg->get_noeud1()==trilienother->get_noeud3() && lastlsseg->get_noeud2()==trilienother->get_noeud2()) othernodtrilienother=trilienother->get_noeud1();
974 else if(lastlsseg->get_noeud1()==trilienother->get_noeud1() && lastlsseg->get_noeud2()==trilienother->get_noeud3()) othernodtrilienother=trilienother->get_noeud2();
975 else if(lastlsseg->get_noeud1()==trilienother->get_noeud3() && lastlsseg->get_noeud2()==trilienother->get_noeud1()) othernodtrilienother=trilienother->get_noeud2();
976  deletingtis.ajouter(trilien);
977  deletingtis.ajouter(trilienother);
978  MG_TRIANGLE* addtri1;
979  MG_TRIANGLE* addtri2;
980  MG_TRIANGLE* addtri3;
981  MG_TRIANGLE* addtri4;
982  if(clockwisetri>0)
983  {
984  addtri1=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud1(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
985  addtri2=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud2(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
986  addtri3=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud1(),othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
987  addtri4=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud2(),midnd,othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
988  }
989  else if(counterclockwisetri>0)
990  {
991  addtri1=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud2(),midnd,othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
992  addtri2=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud1(),othernodtrilien,MAGIC::ORIGINE::MAILLEUR_AUTO);
993  addtri3=mai->ajouter_mg_triangle(NULL,midnd,lastlsseg->get_noeud2(),othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
994  addtri4=mai->ajouter_mg_triangle(NULL,lastlsseg->get_noeud1(),midnd,othernodtrilienother,MAGIC::ORIGINE::MAILLEUR_AUTO);
995  }
996  /*
997  octree.inserer(addtri1);
998  octree.inserer(addtri2);
999  octree.inserer(addtri3);
1000  octree.inserer(addtri4);
1001  double trisiz1=targetsize_criteria(addtri1);
1002  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz1,addtri1));
1003  double trisiz2=targetsize_criteria(addtri2);
1004  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz2,addtri2));
1005  double trisiz3=targetsize_criteria(addtri3);
1006  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz3,addtri3));
1007  double trisiz4=targetsize_criteria(addtri4);
1008  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz4,addtri4));*/
1009 }
1010 
1011 if (edgechk!=0)
1012 {
1013  lstedges.supprimer(lastlsseg);
1014  for (int noliensegmdnd=0;noliensegmdnd<midnd->get_lien_segment()->get_nb();noliensegmdnd++)
1015  {
1016  MG_SEGMENT* seglien=midnd->get_lien_segment()->get(noliensegmdnd);
1017  if(seglien->get_noeud1()==lastlsseg->get_noeud1() || seglien->get_noeud1()==lastlsseg->get_noeud2() || seglien->get_noeud2()==lastlsseg->get_noeud1() || seglien->get_noeud2()==lastlsseg->get_noeud2())
1018  {
1019  lstedges.ajouter(seglien);
1020  }
1021  }
1022 }
1023 
1024 
1025 
1026 for(int nodeletingtis=0;nodeletingtis<deletingtis.get_nb();nodeletingtis++)
1027 {
1028  MG_TRIANGLE* deletingti=deletingtis.get(nodeletingtis);
1029  octree.supprimer(deletingti);
1030  double deltriarea=targetsize_criteria(deletingti);
1031  STLSORTMMAP::iterator itdeloned1;
1032  for (itdeloned1=stltrisorting.find(deltriarea);itdeloned1!=stltrisorting.end();itdeloned1++)
1033  if ((*itdeloned1).second==deletingti) {stltrisorting.erase(itdeloned1);break;}
1034  mai->supprimer_mg_triangleid(deletingti->get_id());
1035 }
1036 
1037 TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctri;
1038 int stltrinb=lststloctri.get_nb();
1039 int midndonstlorig=0;
1040 double search_radius=vec.get_longueur();
1041  // while (intristltribas==0 && stltrisearchit<5)
1042 while(stltrinb==0)
1043 {
1044  stloctree.rechercher(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,lststloctri);
1045  stltrinb=lststloctri.get_nb(); search_radius=1.2*search_radius;
1046 }
1047 
1049 for (MG_TRIANGLE* stltr1=lststloctri.get_premier(itstl1);stltr1!=NULL;stltr1=lststloctri.get_suivant(itstl1))
1050 {
1051  MG_MAILLAGE_OUTILS mdndintritest;
1052  int mdndintritestval=mdndintritest.estdansletriangle(stltr1,midnd->get_x(),midnd->get_y(),midnd->get_z());
1053  MG_MAILLAGE_OUTILS tribas;
1054  int outstl=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::INTERIEUR);
1055  if (outstl==1) midndonstlorig++;
1056 }
1057 if(midndonstlorig==0)
1058 {
1059  //cout<<"projection onto original stl have to be performed"<<endl;
1060  OT_VECTEUR_3D prndxyz=projecton_stlorig(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,stloctree);
1061  if (prndxyz.get_x()!=midnd->get_x() || prndxyz.get_y()!=midnd->get_y() || prndxyz.get_z()!=midnd->get_z())
1062  {
1063  //cout<<" PROJECTEEEEDDD"<<endl;
1064  //cout<< prndxyz.get_x()<<" and "<<prndxyz.get_x()<<" and "<<prndxyz.get_x()<<endl;
1065  //cout<< midnd->get_x()<<" and "<<midnd->get_x()<<" and "<<midnd->get_x()<<endl;
1066  midnd->change_coord(prndxyz);
1067  }
1068 }
1069 
1070 for(int mdndsgsno=0;mdndsgsno<midnd->get_lien_triangle()->get_nb();mdndsgsno++)
1071 {
1072  MG_TRIANGLE* mdndlnksg=midnd->get_lien_triangle()->get(mdndsgsno);
1073  octree.inserer(mdndlnksg);
1074  double trisiz=targetsize_criteria(mdndlnksg);
1075  stltrisorting.insert(std::pair<double,MG_TRIANGLE*>(trisiz,mdndlnksg));
1076 }
1077 
1078 TPL_MAP_ENTITE<MG_TRIANGLE*> lstrilnkmidnd;
1079 for(int notrilnkmidnd=0;notrilnkmidnd<midnd->get_lien_triangle()->get_nb();notrilnkmidnd++)
1080  lstrilnkmidnd.ajouter(midnd->get_lien_triangle()->get(notrilnkmidnd));
1081 TPL_MAP_ENTITE<MG_SEGMENT*> lstsgtrilnkmidnd;
1083 TPL_LISTE_ENTITE<MG_SEGMENT*> lstasupprimer;
1084 
1085 for(MG_TRIANGLE* trilnkmidnd=lstrilnkmidnd.get_premier(itlstrilnkmidnd);trilnkmidnd!=NULL;trilnkmidnd=lstrilnkmidnd.get_suivant(itlstrilnkmidnd))
1086 {
1087  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment1());
1088  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment2());
1089  lstsgtrilnkmidnd.ajouter(trilnkmidnd->get_segment3());
1090 }
1091 
1092 TPL_LISTE_ENTITE<MG_SEGMENT*> lstsglnkmdnd;
1093 for(int nosglnkmdnd=0;nosglnkmdnd<midnd->get_lien_segment()->get_nb();nosglnkmdnd++)
1094  lstsglnkmdnd.ajouter(midnd->get_lien_segment()->get(nosglnkmdnd));
1095 
1096 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstsgtrilnkmidnd;
1097 for(MG_SEGMENT* sgtrilnkmidnd=lstsgtrilnkmidnd.get_premier(itlstsgtrilnkmidnd);sgtrilnkmidnd!=NULL;sgtrilnkmidnd=lstsgtrilnkmidnd.get_suivant(itlstsgtrilnkmidnd))
1098 {
1099  for(int nolstsglnkmdnd=0;nolstsglnkmdnd<lstsglnkmdnd.get_nb();nolstsglnkmdnd++)
1100  {
1101  if(sgtrilnkmidnd==lstsglnkmdnd.get(nolstsglnkmdnd))
1102  lstasupprimer.ajouter(sgtrilnkmidnd);
1103  }
1104 }
1105 for (int i=0;i<lstasupprimer.get_nb();i++)
1106  {
1107  MG_SEGMENT* seg=lstasupprimer.get(i);
1108  lstsgtrilnkmidnd.supprimer(seg);
1109  }
1110 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstsgtrilnkmidndswchk;
1111 for(MG_SEGMENT* sgtrilnkmidndswchk=lstsgtrilnkmidnd.get_premier(itlstsgtrilnkmidndswchk);sgtrilnkmidndswchk!=NULL;sgtrilnkmidndswchk=lstsgtrilnkmidnd.get_suivant(itlstsgtrilnkmidndswchk))
1112  swap_diag_delaunay_refstl(midnd,sgtrilnkmidndswchk,stltrisorting,lstedges,octree,mai,geo_angle_threshold,stloctree);
1113 
1114 /*
1115  // insert midnode :)
1116  MG_NOEUD* midndbeforeproj=midnd;
1117  MG_MAILLAGE_OUTILS mdndintritest;
1118  int mdndintritestval=mdndintritest.estdansletriangle(lscktriold,midnd->get_x(),midnd->get_y(),midnd->get_z());
1119  MG_MAILLAGE_OUTILS tribas;
1120  int intri=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::INTERIEUR);
1121  int onedg=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::SUR_ARETE);
1122  int insidetri=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
1123  int onver1=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::SOMMET1);
1124  int onver2=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::SOMMET2);
1125  int onver3=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::SOMMET3);
1126  int onedg1=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::ARETE1);
1127  int onedg2=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::ARETE2);
1128  int onedg3=tribas.compare_etat_triangle(mdndintritestval,MG_MAILLAGE_OUTILS::ARETE3);
1129 
1130  if (insidetri==1) {midndnotonedge++; cout<<"insidee ************ insidee ***********"<<endl;} // mai->supprimer_mg_triangleid(lscktriold->get_id());}
1131  else if (onver1==1 || onver2==1 || onver3==1) {midndnotonedge++; cout<<"**************** on vertexxx xxx *******************"<<endl;}
1132  else if (onedg1==1 || onedg2==1 || onedg3==1)
1133  {
1134  //cout<<"onedg onedg onedg onedg"<<endl;
1135  MG_TRIANGLE* ndontri=lscktriold;
1136  MG_SEGMENT* onseg;
1137  if (onedg1==1) onseg=ndontri->get_segment1();
1138  else if (onedg2==1) onseg=ndontri->get_segment2();
1139  else if (onedg3==1) onseg=ndontri->get_segment3();
1140  MG_NOEUD* onsegnd1=onseg->get_noeud1();
1141  MG_NOEUD* onsegnd2=onseg->get_noeud2();
1142  int edgechk=0;
1143  cout<<"lstedges.get_nb() inside the insertion procedure is="<<lstedges.get_nb()<<endl;
1144 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstedges;
1145 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
1146 {
1147  if (segedg==onseg)
1148  edgechk++;
1149 }
1150  //TPL_LISTE_ENTITE<MG_SEGMENT*> lstonedtriseg;
1151  cout<<"onseg->get_lien_triangle()->get_nb()= "<<onseg->get_lien_triangle()->get_nb()<<endl;
1152  std::map<MG_SEGMENT*,MG_TRIANGLE*>lstonedtriseg;
1153  TPL_LISTE_ENTITE<MG_TRIANGLE*> triswilldelete;
1154  cout<<"onseg->get_lien_triangle()->get_nb()= "<<onseg->get_lien_triangle()->get_nb()<<endl;
1155 if (onseg->get_lien_triangle()->get_nb()==2)
1156 {
1157  MG_TRIANGLE* onedtri1=onseg->get_lien_triangle()->get(0);
1158  MG_TRIANGLE* onedtri2=onseg->get_lien_triangle()->get(1);
1159  MG_SEGMENT* onedtri1seg1=onedtri1->get_segment1();
1160  if (onedtri1seg1!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
1161  MG_SEGMENT* onedtri1seg2=onedtri1->get_segment2();
1162  if (onedtri1seg2!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
1163  MG_SEGMENT* onedtri1seg3=onedtri1->get_segment3();
1164  if (onedtri1seg3!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
1165  MG_SEGMENT* onedtri2seg1=onedtri2->get_segment1();
1166  if (onedtri2seg1!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg1,onedtri2));
1167  MG_SEGMENT* onedtri2seg2=onedtri2->get_segment2();
1168  if (onedtri2seg2!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg2,onedtri2));
1169  MG_SEGMENT* onedtri2seg3=onedtri2->get_segment3();
1170  if (onedtri2seg3!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg3,onedtri2));
1171  octree.supprimer(onedtri1);
1172  octree.supprimer(onedtri2);
1173  double deltriarea1=targetsize_criteria(onedtri1);
1174  STLSORTMMAP::iterator itdeloned1;
1175  for (itdeloned1=stltrisorting.find(deltriarea1);itdeloned1!=stltrisorting.end();itdeloned1++)
1176  if ((*itdeloned1).second==onedtri1) stltrisorting.erase(itdeloned1);
1177  double deltriarea2=targetsize_criteria(onedtri2);
1178  STLSORTMMAP::iterator itdeloned2;
1179  for (itdeloned2=stltrisorting.find(deltriarea2);itdeloned2!=stltrisorting.end();itdeloned2++)
1180  if ((*itdeloned2).second==onedtri2) stltrisorting.erase(itdeloned2);
1181 
1182  if (edgechk>0) lstedges.supprimer(onseg);
1183  triswilldelete.ajouter(onedtri1);
1184  triswilldelete.ajouter(onedtri2);
1185 }
1186 else if(onseg->get_lien_triangle()->get_nb()==1)
1187 {
1188  MG_TRIANGLE* onedtri1=onseg->get_lien_triangle()->get(0);
1189  MG_SEGMENT* onedtri1seg1=onedtri1->get_segment1();
1190  if (onedtri1seg1!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
1191  MG_SEGMENT* onedtri1seg2=onedtri1->get_segment2();
1192  if (onedtri1seg2!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
1193  MG_SEGMENT* onedtri1seg3=onedtri1->get_segment3();
1194  if (onedtri1seg3!=onseg) lstonedtriseg.insert(pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
1195  octree.supprimer(onedtri1);
1196  double deltriarea1=targetsize_criteria(onedtri1);cout<<"deltriarea= "<<deltriarea1<<endl;
1197  STLSORTMMAP::iterator itdeloned1;
1198  for (itdeloned1=stltrisorting.find(deltriarea1);itdeloned1!=stltrisorting.end();itdeloned1++)
1199  if ((*itdeloned1).second==onedtri1) stltrisorting.erase(itdeloned1);
1200 
1201  if (edgechk>0) lstedges.supprimer(onseg);
1202  triswilldelete.ajouter(onedtri1);
1203 }
1204 cout<<"lstonedtriseg.size()= "<<lstonedtriseg.size()<<endl;
1205  TPL_LISTE_ENTITE<MG_TRIANGLE*> lstadtris;
1206  std::map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstonedtriseg;
1207  for (itlstonedtriseg=lstonedtriseg.begin();itlstonedtriseg!=lstonedtriseg.end();itlstonedtriseg++)
1208  {
1209  MG_SEGMENT* segcommon=(*itlstonedtriseg).first;
1210  MG_TRIANGLE* triold=(*itlstonedtriseg).second;
1211  MG_NOEUD* sgnd1=segcommon->get_noeud1();
1212  MG_NOEUD* sgnd2=segcommon->get_noeud2();
1213  MG_TRIANGLE* triad;
1214  if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd2,sgnd1, MAILLEUR_AUTO);
1215  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd1,sgnd2, MAILLEUR_AUTO);
1216  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd2,sgnd1, MAILLEUR_AUTO);
1217  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd1,sgnd2, MAILLEUR_AUTO);
1218  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd2,sgnd1, MAILLEUR_AUTO);
1219  else if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(NULL,midnd,sgnd1,sgnd2, MAILLEUR_AUTO);
1220  octree.inserer(triad);
1221  double trisiz=targetsize_criteria(triad);
1222  stltrisorting.insert(pair<double,MG_TRIANGLE*>(trisiz,triad));
1223  cout<<" tri area added onside:"<<trisiz<<endl;
1224  lstadtris.ajouter(triad);
1225 
1226  // unify the topology of the segments, keep the edges
1227  TPL_LISTE_ENTITE<MG_SEGMENT*> triadsegs;
1228 triadsegs.ajouter(triad->get_segment1());
1229 triadsegs.ajouter(triad->get_segment2());
1230 triadsegs.ajouter(triad->get_segment3());
1231 for(int itriadsegs=0;itriadsegs<triadsegs.get_nb();itriadsegs++)
1232 {
1233  MG_SEGMENT* triadseg=triadsegs.get(itriadsegs);
1234  if(triadseg!=segcommon)
1235  {
1236  if(triadseg->get_noeud1()==onseg->get_noeud1() || triadseg->get_noeud2()==onseg->get_noeud2()
1237  || triadseg->get_noeud2()==onseg->get_noeud1() || triadseg->get_noeud1()==onseg->get_noeud2())
1238  {
1239  if(edgechk>0) lstedges.ajouter(triadseg);
1240  }
1241 
1242  }
1243 }
1244  }
1245  for (int itriswilldelete=0;itriswilldelete<triswilldelete.get_nb();itriswilldelete++)
1246  {
1247  mai->supprimer_mg_triangleid(triswilldelete.get(itriswilldelete)->get_id());
1248  }
1249 
1250  for (int iadtris=0;iadtris<lstadtris.get_nb();iadtris++)
1251  {
1252  MG_TRIANGLE* swchktr=lstadtris.get(iadtris);
1253  swap_diag_delaunay_refstl(midnd,swchktr,stltrisorting,lstedges,octree,mai,geo_angle_threshold,stloctree);
1254  }
1255  }
1256 if (midndnotonedge>0) cout<<"the geometry angle treshold needs to be modified"<<endl;
1257 
1258  MG_NOEUD* midndold=midnd;
1259  TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctri;
1260  int stltrinb=lststloctri.get_nb();
1261  int intristltribas=0;
1262  int stltrisearchit=0;
1263  int onstl=0;
1264  // while (intristltribas==0 && stltrisearchit<5)
1265  {
1266  while(stltrinb==0)
1267  {
1268  stloctree.rechercher(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,lststloctri);
1269  stltrinb=lststloctri.get_nb(); search_radius=1.2*search_radius;
1270  }
1271  //cout<<"stltrinb= "<<stltrinb<<endl;
1272 
1273  TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itstl0;
1274  for (MG_TRIANGLE* stltr0=lststloctri.get_premier(itstl0);stltr0!=NULL;stltr0=lststloctri.get_suivant(itstl0))
1275  {
1276  MG_TRIANGLE* stltribas;
1277  MG_MAILLAGE_OUTILS stltribas0;
1278  int stltribasval0=stltribas0.estdansletriangle(stltr0,midnd->get_x(),midnd->get_y(),midnd->get_z());
1279  intristltribas=stltribas0.compare_etat_triangle(stltribasval0,MG_MAILLAGE_OUTILS::INTERIEUR);
1280  if (intristltribas==1) {stltribas=stltr0; onstl++; break;}
1281  }
1282  //stl_rad_search=1.5*stl_rad_search;
1283  }
1284 
1285  if (onstl==0)
1286 {
1287  OT_VECTEUR_3D prndxyz=projecton_stlorig(midnd->get_x(),midnd->get_y(),midnd->get_z(),search_radius,stloctree);
1288  TPL_MAP_ENTITE<MG_TRIANGLE*> lstoctri;
1289  double rad_search=search_radius;
1290  int tribasval1; int intri1=0;
1291  MG_MAILLAGE_OUTILS tribas1;
1292  MG_TRIANGLE* trichk;
1293  int chkit=0; int isinrefmesh=0;
1294  while (intri1==0 && chkit<10)
1295  {
1296  while (lstoctri.get_nb()==0)
1297  {
1298  octree.rechercher(midnd->get_x(),midnd->get_y(),midnd->get_z(),rad_search,lstoctri);
1299  rad_search=1.2*rad_search;
1300  }
1301  TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itnei;
1302  for (MG_TRIANGLE* neitri=lstoctri.get_premier(itnei);neitri!=NULL;neitri=lstoctri.get_suivant(itnei))
1303  {
1304  tribasval1=tribas1.estdansletriangle(neitri,midnd->get_x(),midnd->get_y(),midnd->get_z());
1305  intri1=tribas1.compare_etat_triangle(tribasval1,MG_MAILLAGE_OUTILS::INTERIEUR);
1306  if (intri1==1) {trichk=neitri; isinrefmesh++;cout<<"intri= "<<intri1<<endl;break;}
1307  }
1308  rad_search=1.5*rad_search;
1309  chkit++;
1310  }
1311  //cout<<"isinrefmesh is: "<<isinrefmesh<<endl;
1312  if (isinrefmesh!=0) cout<<"There is a projection on the existing mesh"<<endl; /////neeeeeded to be solved
1313  double projectedmidndxyz[3];
1314  projectedmidndxyz[0]=prndxyz.get_x();
1315  projectedmidndxyz[1]=prndxyz.get_y();
1316  projectedmidndxyz[2]=prndxyz.get_z();
1317  if (isinrefmesh==0) midndold->change_coord(projectedmidndxyz);
1318  }
1319  */
1320 }
1322  void MAILLEUR2D_STL_REFINE_INS_NOEUD::stl_optimize_nd(MG_TRIANGLE* tripri, MG_NOEUD* qualnd,double movstp,double stl_rad_search,
1324 {
1325  std::multimap<double,MG_TRIANGLE*,std::less<double> > lstlnktronqtrind1;
1326 
1327 
1328  MG_MAILLAGE_OUTILS qual;
1329  for (int ilnkti=0;ilnkti<qualnd->get_lien_triangle()->get_nb();ilnkti++)
1330  {
1331  MG_TRIANGLE* lnkti=qualnd->get_lien_triangle()->get(ilnkti);
1332  double lnktriqual=qual.qualite_triangle(lnkti->get_noeud1()->get_coord(),lnkti->get_noeud2()->get_coord(),lnkti->get_noeud3()->get_coord());
1333  lstlnktronqtrind1.insert(std::pair<double,MG_TRIANGLE*> (lnktriqual,lnkti));
1334  }
1335  //smoothing the qualnd
1336  OT_VECTEUR_3D smnd=smooth_nd(qualnd);
1337  //cout<<"qualnd->get_x()="<<qualnd->get_x()<<"qualnd->get_y()="<<qualnd->get_y()<<"qualnd->get_z()="<<qualnd->get_z()<<endl;
1338  //cout<<"smnd.get_x()="<<smnd.get_x()<<"smnd.get_y()="<<smnd.get_y()<<"smnd.get_z()="<<smnd.get_z()<<endl;
1339  double qualpri=qual.qualite_triangle(tripri->get_noeud1()->get_coord(),tripri->get_noeud2()->get_coord(),tripri->get_noeud3()->get_coord());
1340 
1341  OT_VECTEUR_3D ndcoord=OT_VECTEUR_3D(qualnd->get_coord());
1342 
1343  for(int alpha=1;alpha<movstp;alpha++)
1344  {
1345  //double ratio= alpha/movstp;
1346  //cout<<"ratio="<<ratio<<endl;
1347  OT_VECTEUR_3D smndstp=OT_VECTEUR_3D(qualnd->get_coord()) + (alpha/movstp)*(smnd - OT_VECTEUR_3D(qualnd->get_coord()));
1348  //cout<<" smndstp.get_x()="<<smndstp.get_x()<<" smndstp.get_y()="<<smndstp.get_y()<<" smndstp.get_z()="<<smndstp.get_z()<<endl;
1349  TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctrismnd1;
1350  int stltrinbsmnd1=lststloctrismnd1.get_nb();
1351  int intristltribassmnd1=0;
1352  int onstlsmnd1=0; //int stltrisearchit=0;
1353  double radsmnd1=stl_rad_search;
1354  // while (intristltribas==0 && stltrisearchit<5)
1355 
1356  while(stltrinbsmnd1==0)
1357  {
1358  stloctree.rechercher(smndstp.get_x(),smndstp.get_y(),smndstp.get_z(),radsmnd1,lststloctrismnd1);
1359  stltrinbsmnd1=lststloctrismnd1.get_nb(); radsmnd1=1.2*radsmnd1;
1360  }
1361  //cout<<"stltrinbsmnd1= "<<stltrinbsmnd1<<endl;
1363  for (MG_TRIANGLE* stltrsmnd1=lststloctrismnd1.get_premier(itsmnd1);stltrsmnd1!=NULL;stltrsmnd1=lststloctrismnd1.get_suivant(itsmnd1))
1364  {
1365  MG_TRIANGLE* stltribas;
1366  MG_MAILLAGE_OUTILS stltribas0;
1367  int stltribasval0=stltribas0.estdansletriangle(stltrsmnd1,smndstp.get_x(),smndstp.get_y(),smndstp.get_z());
1368  intristltribassmnd1=stltribas0.compare_etat_triangle(stltribasval0,MG_MAILLAGE_OUTILS::INTERIEUR);
1369  if (intristltribassmnd1==1) { onstlsmnd1++; break;}
1370  }
1371  //stl_rad_search=1.5*stl_rad_search;
1372 OT_VECTEUR_3D projection1;
1373 
1374  if (onstlsmnd1==0)
1375  projection1= projecton_stlorig(smndstp.get_x(),smndstp.get_y(),smndstp.get_z(),stl_rad_search,stloctree);
1376  else projection1=smndstp; //it should be modified to preserve the shape
1377 
1378  std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator ilnktri=lstlnktronqtrind1.begin();
1379  double quallast_step=(*ilnktri).first;
1380  std::multimap<double,MG_TRIANGLE*,std::less<double> > lstlnktronqtrind2;
1381  for(std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator ilnktri1=lstlnktronqtrind1.begin();ilnktri1!=lstlnktronqtrind1.end();ilnktri1++)
1382  {
1383  MG_TRIANGLE* qlnktrimod=(*ilnktri1).second;
1384  double qualnktriqual;
1385  if (qualnd==qlnktrimod->get_noeud1())
1386  qualnktriqual=qual.qualite_triangle(projection1,qlnktrimod->get_noeud2()->get_coord(),qlnktrimod->get_noeud3()->get_coord());
1387  else if (qualnd==qlnktrimod->get_noeud2())
1388  qualnktriqual=qual.qualite_triangle(qlnktrimod->get_noeud1()->get_coord(),projection1,qlnktrimod->get_noeud3()->get_coord());
1389  else if (qualnd==qlnktrimod->get_noeud3())
1390  qualnktriqual=qual.qualite_triangle(qlnktrimod->get_noeud1()->get_coord(),qlnktrimod->get_noeud2()->get_coord(),projection1);
1391  //cout<<"qualnktriqual="<<qualnktriqual<<endl;
1392  lstlnktronqtrind2.insert(std::pair<double,MG_TRIANGLE*> (qualnktriqual,qlnktrimod));
1393  //lstlnktronqtrind1.erase(ilnktri1);
1394  }
1395  lstlnktronqtrind1.clear();
1396  std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator itlnktri=lstlnktronqtrind2.begin();
1397  //cout<<"(*itlnktri).first="<<(*itlnktri).first<<endl;
1398  //cout<<"qualpri="<<qualpri<<endl;
1399  //cout<<"quallast_step="<<quallast_step<<endl;
1400  if ((*itlnktri).first>qualpri && (*itlnktri).first>quallast_step)
1401  //if ((*itlnktri).first>quallast_step)
1402  {
1403  //cout<<" SHOOOOODDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD SHOOOOODDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD"<<endl;
1404  qualpri=(*itlnktri).first;
1405  ndcoord=projection1;
1406  lstlnktronqtrind1.clear();
1407  for(std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator ilnktri2=lstlnktronqtrind2.begin();ilnktri2!=lstlnktronqtrind2.end();ilnktri2++)
1408  {
1409  lstlnktronqtrind1.insert(std::pair<double,MG_TRIANGLE*> ((*ilnktri2).first,(*ilnktri2).second));
1410  }
1411  }
1412  else break;
1413  }
1414 
1415 qualnd->change_coord(ndcoord);
1416  /*
1417  for (int ismo1=0;ismo1<qualnd->get_lien_triangle()->get_nb();ismo1++)
1418  {
1419  MG_TRIANGLE* smootht=qualnd->get_lien_triangle()->get(ismo1);
1420  MG_NOEUD* smtlnd1=smootht->get_noeud1();
1421  MG_NOEUD* smtlnd2=smootht->get_noeud2();
1422  MG_NOEUD* smtlnd3=smootht->get_noeud3();
1423  MG_NOEUD* nsm=mai->ajouter_mg_noeud(NULL,ndcoord.get_x(),ndcoord.get_y(),ndcoord.get_z(),IMPOSE);
1424  OT_VECTEUR_3D smtlnd11; OT_VECTEUR_3D smtlnd22; OT_VECTEUR_3D smtlnd33;
1425  MG_TRIANGLE* trismooth;
1426  if (smtlnd1==qualnd) trismooth=mai->ajouter_mg_triangle(NULL,nsm,smtlnd2,smtlnd3,IMPOSE);
1427  else if (smtlnd2==qualnd) trismooth=mai->ajouter_mg_triangle(NULL,smtlnd1,nsm,smtlnd3,IMPOSE);
1428  else if (smtlnd3==qualnd) trismooth=mai->ajouter_mg_triangle(NULL,smtlnd1,smtlnd2,nsm,IMPOSE);
1429  octree.inserer(trismooth);
1430  octree.supprimer(smootht);
1431  mai->supprimer_mg_triangleid(smootht->get_id());
1432  }
1433  */
1435 }
1438 {
1439  TPL_LISTE_ENTITE<MG_NOEUD*> lstlinknds;
1440  for(int i=0;i<nod->get_lien_segment()->get_nb();i++)
1441  {
1442  MG_SEGMENT* seg=nod->get_lien_segment()->get(i);
1443  if (seg->get_noeud1()!=nod) lstlinknds.ajouter(seg->get_noeud1());
1444  if (seg->get_noeud2()!=nod) lstlinknds.ajouter(seg->get_noeud2());
1445  }
1446  int numb=0;
1447  double x=0.;
1448  double y=0.;
1449  double z=0.;
1450  for(int ii=0;ii<lstlinknds.get_nb();ii++)
1451  {
1452  numb++;
1453  MG_NOEUD* linknd=lstlinknds.get(ii);
1454  x+=linknd->get_x();
1455  y+=linknd->get_y();
1456  z+=linknd->get_z();
1457  }
1458 
1459  OT_VECTEUR_3D ndxyz(x/numb,y/numb,z/numb);
1460  return ndxyz;
1461 }
1462 OT_VECTEUR_3D MAILLEUR2D_STL_REFINE_INS_NOEUD::projecton_stlorig(double midndx,double midndy,double midndz, double stl_rad_search,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree )
1463 {
1464  //cout<<"midnd chk if on original stl triangulation START"<<endl;
1465 TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctri;
1466 int stltrinb=lststloctri.get_nb();
1467 int intristltribas=0; int stltrisearchit=0; int onstl=0;
1468  // while (intristltribas==0 && stltrisearchit<5)
1469 
1470 
1471 /* an alternative method to find the normal
1472  OT_VECTEUR_3D normale(0.,0.,0.);
1473  TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it02;
1474  for (MG_NOEUD* nornd=lstneighbornds.get_premier(it02);nornd!=NULL;nornd=lstneighbornds.get_suivant(it02))
1475  {
1476  OT_VECTEUR_3D lngpnornd(p->get_coord(),nornd->get_coord());double lengpnornd=lngpnornd.get_longueur();
1477  OT_VECTEUR_3D norm=desc_norm(nornd);
1478  norm=lengpnornd*norm;
1479  normale=normale+norm;
1480  }
1481 */
1482 while(stltrinb==0)
1483 {
1484  stloctree.rechercher(midndx,midndy,midndz,stl_rad_search,lststloctri);
1485  stltrinb=lststloctri.get_nb(); stl_rad_search=1.2*stl_rad_search;
1486 }
1487 
1489 std::multimap<double,MG_TRIANGLE*,std::less<double> > lstprontri;
1490 std::multimap<double,OT_VECTEUR_3D,std::less<double> > lstprontriproj_origstl;
1491 for (MG_TRIANGLE* stltr1=lststloctri.get_premier(itstl1);stltr1!=NULL;stltr1=lststloctri.get_suivant(itstl1))
1492 {
1493  MG_NOEUD* nd1=stltr1->get_noeud1();
1494  MG_NOEUD* nd2=stltr1->get_noeud2();
1495  MG_NOEUD* nd3=stltr1->get_noeud3();
1496  OT_VECTEUR_3D vec1(nd1->get_coord(),nd2->get_coord());
1497  OT_VECTEUR_3D vec2(nd1->get_coord(),nd3->get_coord());
1498  OT_VECTEUR_3D norm=vec1&vec2; // Normale au triangle
1499  OT_VECTEUR_3D normunivec=norm;
1500  normunivec.norme();
1501 
1502 double pproj[3];
1503 double a1=(nd1->get_x()-midndx); double a2=(nd1->get_x()-nd2->get_x()); double a3=(nd1->get_x()-nd3->get_x());
1504 OT_VECTEUR_3D r1(a1,a2,a3);
1505 double a11=(nd1->get_y()-midndy); double a12=(nd1->get_y()-nd2->get_y()); double a13=(nd1->get_y()-nd3->get_y());
1506 OT_VECTEUR_3D r2(a11,a12,a13);
1507 double a21=(nd1->get_z()-midndz); double a22=(nd1->get_z()-nd2->get_z()); double a23=(nd1->get_z()-nd3->get_z());
1508 OT_VECTEUR_3D r3(a21,a22,a23);
1509 OT_VECTEUR_3D d1((normunivec.get_x()),(nd1->get_x()-nd2->get_x()),(nd1->get_x()-nd3->get_x()));
1510 OT_VECTEUR_3D d2((normunivec.get_y()),(nd1->get_y()-nd2->get_y()),(nd1->get_y()-nd3->get_y()));
1511 OT_VECTEUR_3D d3((normunivec.get_z()),(nd1->get_z()-nd2->get_z()),(nd1->get_z()-nd3->get_z()));
1512 
1513 OT_MATRICE_3D tr(r1,r2,r3);
1514 OT_MATRICE_3D td(d1,d2,d3);
1515 double detd=td.get_determinant();
1516 double detr=tr.get_determinant();
1517 double t=detr/detd;
1518 if (detd==0.) std::cout<<"origstlprojection BAD BAD BAD BAD"<<std::endl;
1519  if (detd!=0.)
1520  {
1521 pproj[0]=midndx+t*normunivec.get_x();
1522 pproj[1]=midndy+t*normunivec.get_y();
1523 pproj[2]=midndz+t*normunivec.get_z();
1524 MG_MAILLAGE_OUTILS stltribas;
1525 int stltribasval=stltribas.estdansletriangle(stltr1,pproj[0],pproj[1],pproj[2]);
1526 int stlintri=stltribas.compare_etat_triangle(stltribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
1527  if (stlintri==1)
1528  {
1529  OT_VECTEUR_3D pprojvec(pproj[0],pproj[1],pproj[2]);
1530  OT_VECTEUR_3D mdndvec(midndx,midndy,midndz);
1531  OT_VECTEUR_3D mdndtridistancevec(pprojvec,mdndvec); double mdndtridistanc=mdndtridistancevec.get_longueur(); //cout<<mdndtridistanc<<endl;
1532  (lstprontri).insert(std::pair<double,MG_TRIANGLE*>(mdndtridistanc,stltr1));
1533  (lstprontriproj_origstl).insert(std::pair<double,OT_VECTEUR_3D>(mdndtridistanc,pprojvec));
1534  }
1535  }
1536 }
1537 std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator it04=lstprontri.begin();
1538 std::multimap<double,OT_VECTEUR_3D,std::less<double> >::iterator it05=lstprontriproj_origstl.begin();
1539  //cout<<"lstprontri.size() "<<lstprontri.size()<<endl;
1540 if(lstprontri.size()==1)
1541 {
1542  //cout<<"lstprontri.size()==1"<<endl;
1543  OT_VECTEUR_3D prjonorigstl=(*it05).second;
1544  return prjonorigstl;
1545 }
1546 else if (lstprontri.size()==2)
1547 {
1548  double firstdist=(*it04).first;
1549  MG_TRIANGLE* trbasnd1=(*it04).second;
1550  it04++;
1551  MG_TRIANGLE* trbasnd2=(*it04).second;
1552  double scnddist=(*it04).first;
1553 
1554 if(firstdist<scnddist)
1555 {
1556  //cout<<"firstdist<scnddist"<<endl;
1557  OT_VECTEUR_3D prjonorigstl=(*it05).second;
1558  return prjonorigstl;
1559 }
1560 else if (firstdist==scnddist)
1561 {
1562  //cout<<"firstdist==scnddist && scnddist<trddist"<<endl;
1563  MG_SEGMENT* sg1=trbasnd1->get_segment1();
1564  MG_SEGMENT* sg2=trbasnd1->get_segment2();
1565  MG_SEGMENT* sg3=trbasnd1->get_segment3();
1566  MG_SEGMENT* sg11=trbasnd2->get_segment1();
1567  MG_SEGMENT* sg21=trbasnd2->get_segment2();
1568  MG_SEGMENT* sg31=trbasnd2->get_segment3();
1569  MG_SEGMENT* sgshare;
1570  int besh=0;
1571  if (sg1==sg11 || sg1==sg21 || sg1==sg31) {sgshare=sg1;besh++;}
1572  if (sg2==sg11 || sg2==sg21 || sg2==sg31) {sgshare=sg2;besh++;}
1573  if (sg3==sg11 || sg3==sg21 || sg3==sg31) {sgshare=sg3;besh++;}
1574  if ( besh>0) //if sharing one segment
1575  {
1576  MG_NOEUD* sgshnd1=sgshare->get_noeud1();
1577  MG_NOEUD* sgshnd2=sgshare->get_noeud2();
1578  double xx=midndx-sgshare->get_noeud1()->get_x();
1579  double yy=midndy-sgshare->get_noeud1()->get_y();
1580  double zz=midndz-sgshare->get_noeud1()->get_z();
1581  OT_VECTEUR_3D vec1(xx,yy,zz);
1582  OT_VECTEUR_3D vec2(sgshare->get_noeud1()->get_coord(),sgshare->get_noeud2()->get_coord());
1583  double prjv1v2=(vec1*vec2)/vec2.get_longueur();
1584  if (prjv1v2>=0 && prjv1v2<=vec2.get_longueur())
1585  {
1586  OT_VECTEUR_3D vec2nrm=vec2; vec2nrm.norme();
1587  double pprojectx=(sgshare->get_noeud1()->get_x())+(vec2nrm.get_x())*prjv1v2;
1588  double pprojecty=(sgshare->get_noeud1()->get_y())+(vec2nrm.get_y())*prjv1v2;
1589  double pprojectz=(sgshare->get_noeud1()->get_z())+(vec2nrm.get_z())*prjv1v2;
1590  OT_VECTEUR_3D pproject(pprojectx,pprojecty,pprojectz);
1591  return pproject;
1592  }
1593  }
1594 }
1595 
1596 }
1597 else if (lstprontri.size()>2)
1598 {
1599  it04=lstprontri.begin();
1600  double firstdist=(*it04).first;
1601  MG_TRIANGLE* trbasnd1=(*it04).second;
1602  it04++;
1603  MG_TRIANGLE* trbasnd2=(*it04).second;
1604  double scnddist=(*it04).first;
1605 it04++;
1606 double trddist=(*it04).first;
1607 
1608 if(firstdist<scnddist)
1609 {
1610  //cout<<"firstdist<scnddist"<<endl;
1611  OT_VECTEUR_3D prjonorigstl=(*it05).second;
1612  return prjonorigstl;
1613 }
1614 
1615 else if (firstdist==scnddist && scnddist<trddist)
1616 {
1617  //cout<<"firstdist==scnddist && scnddist<trddist"<<endl;
1618  MG_SEGMENT* sg1=trbasnd1->get_segment1();
1619  MG_SEGMENT* sg2=trbasnd1->get_segment2();
1620  MG_SEGMENT* sg3=trbasnd1->get_segment3();
1621  MG_SEGMENT* sg11=trbasnd2->get_segment1();
1622  MG_SEGMENT* sg21=trbasnd2->get_segment2();
1623  MG_SEGMENT* sg31=trbasnd2->get_segment3();
1624  MG_SEGMENT* sgshare;
1625  int besh=0;
1626  if (sg1==sg11 || sg1==sg21 || sg1==sg31) {sgshare=sg1;besh++;}
1627  if (sg2==sg11 || sg2==sg21 || sg2==sg31) {sgshare=sg2;besh++;}
1628  if (sg3==sg11 || sg3==sg21 || sg3==sg31) {sgshare=sg3;besh++;}
1629  if ( besh>0) //if sharing one segment
1630  {
1631  MG_NOEUD* sgshnd1=sgshare->get_noeud1();
1632  MG_NOEUD* sgshnd2=sgshare->get_noeud2();
1633  double xx=midndx-sgshare->get_noeud1()->get_x();
1634  double yy=midndy-sgshare->get_noeud1()->get_y();
1635  double zz=midndz-sgshare->get_noeud1()->get_z();
1636  OT_VECTEUR_3D vec1(xx,yy,zz);
1637  OT_VECTEUR_3D vec2(sgshare->get_noeud1()->get_coord(),sgshare->get_noeud2()->get_coord());
1638  double prjv1v2=(vec1*vec2)/vec2.get_longueur();
1639  if (prjv1v2>=0 && prjv1v2<=vec2.get_longueur())
1640  {
1641  OT_VECTEUR_3D vec2nrm=vec2; vec2nrm.norme();
1642  double pprojectx=(sgshare->get_noeud1()->get_x())+(vec2nrm.get_x())*prjv1v2;
1643  double pprojecty=(sgshare->get_noeud1()->get_y())+(vec2nrm.get_y())*prjv1v2;
1644  double pprojectz=(sgshare->get_noeud1()->get_z())+(vec2nrm.get_z())*prjv1v2;
1645  OT_VECTEUR_3D pproject(pprojectx,pprojecty,pprojectz);
1646  return pproject;
1647  }
1648  }
1649 }
1650 
1651 else //if 3 or more triangle are in the same distance to the midnd OR if 2 orig stl dont share a segment
1652  {
1653  //cout<<firstdist<<" "<<scnddist<<" "<<trddist<<endl;
1654  std::cout<<"on original STL situation need to be chaked !!!!!"<<std::endl;
1655  OT_VECTEUR_3D tot_norm(0.,0.,0.);
1656  for (std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator it04s=lstprontri.begin();it04s!=lstprontri.end();it04s++)
1657  {
1658  double normno=0.;
1659  //while((*it04s).first==firstdist)
1660  {
1661  MG_TRIANGLE* trnr=(*it04s).second;
1662  MG_NOEUD* trnrnd1=trnr->get_noeud1();
1663  MG_NOEUD* trnrnd2=trnr->get_noeud2();
1664  MG_NOEUD* trnrnd3=trnr->get_noeud3();
1665  OT_VECTEUR_3D vec1(trnrnd1->get_coord(),trnrnd2->get_coord());
1666  OT_VECTEUR_3D vec2(trnrnd1->get_coord(),trnrnd3->get_coord());
1667  OT_VECTEUR_3D norm=vec1&vec2; norm.norme();
1668  tot_norm+=norm;
1669  normno+=1.;
1670  it04s++;
1671  }
1672  tot_norm=tot_norm/normno;
1673  }
1674 
1675 std::multimap<double,MG_TRIANGLE*,std::less<double> > lstprojtri1;
1676 std::multimap<double,OT_VECTEUR_3D,std::less<double> > lstinproj_origstl;
1677 
1678 stloctree.rechercher(midndx,midndy,midndz,2.*stl_rad_search,lststloctri);
1679 for (MG_TRIANGLE* tris=lststloctri.get_premier(itstl1);tris!=NULL;tris=lststloctri.get_suivant(itstl1))
1680  {
1681  MG_NOEUD* nd1=tris->get_noeud1();
1682  MG_NOEUD* nd2=tris->get_noeud2();
1683  MG_NOEUD* nd3=tris->get_noeud3();
1684  double pproj[3];
1685 double a1=(nd1->get_x()-midndx); double a2=(nd1->get_x()-nd2->get_x()); double a3=(nd1->get_x()-nd3->get_x());
1686 OT_VECTEUR_3D r1(a1,a2,a3);
1687 double a11=(nd1->get_y()-midndy); double a12=(nd1->get_y()-nd2->get_y()); double a13=(nd1->get_y()-nd3->get_y());
1688 OT_VECTEUR_3D r2(a11,a12,a13);
1689 double a21=(nd1->get_z()-midndz); double a22=(nd1->get_z()-nd2->get_z()); double a23=(nd1->get_z()-nd3->get_z());
1690 OT_VECTEUR_3D r3(a21,a22,a23);
1691 OT_VECTEUR_3D d1((tot_norm.get_x()),(nd1->get_x()-nd2->get_x()),(nd1->get_x()-nd3->get_x()));
1692 OT_VECTEUR_3D d2((tot_norm.get_y()),(nd1->get_y()-nd2->get_y()),(nd1->get_y()-nd3->get_y()));
1693 OT_VECTEUR_3D d3((tot_norm.get_z()),(nd1->get_z()-nd2->get_z()),(nd1->get_z()-nd3->get_z()));
1694 
1695 OT_MATRICE_3D tr(r1,r2,r3);
1696 OT_MATRICE_3D td(d1,d2,d3);
1697 double detd=td.get_determinant();
1698 double detr=tr.get_determinant();
1699 double t=detr/detd;
1700 if (detd==0.) std::cout<<"origstlprojection BAD BAD BAD BAD"<<std::endl;
1701 if (detd!=0.)
1702 {
1703 pproj[0]=midndx+t*tot_norm.get_x();
1704 pproj[1]=midndy+t*tot_norm.get_y();
1705 pproj[2]=midndz+t*tot_norm.get_z();
1706 MG_MAILLAGE_OUTILS stltribas11;
1707 int stltribasval=stltribas11.estdansletriangle(tris,pproj[0],pproj[1],pproj[2]);
1708 int stlintri=stltribas11.compare_etat_triangle(stltribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
1709 
1710 if (stlintri==1)
1711 {
1712  OT_VECTEUR_3D pprojvec(pproj[0],pproj[1],pproj[2]);
1713  OT_VECTEUR_3D mdndvec(midndx,midndy,midndz);
1714  OT_VECTEUR_3D mdndtridistancevec(pprojvec,mdndvec); double mdndtridistanc=mdndtridistancevec.get_longueur();
1715  (lstprojtri1).insert(std::pair<double,MG_TRIANGLE*>(mdndtridistanc,tris));
1716  (lstinproj_origstl).insert(std::pair<double,OT_VECTEUR_3D>(mdndtridistanc,pprojvec));
1717 }
1718 }
1719  }
1720 
1721  std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator its1=lstprojtri1.begin();
1722  if((*its1).first<1.5*firstdist)
1723  {
1724  std::multimap<double,OT_VECTEUR_3D,std::less<double> >::iterator it05l=lstinproj_origstl.begin();
1725  OT_VECTEUR_3D prjonorigstl=(*it05l).second;
1726  return prjonorigstl;
1727  }
1728  else
1729  {
1730  OT_VECTEUR_3D prjonorigstl=(*it05).second;
1731  return prjonorigstl;
1732  }
1733  }
1734 }
1735 OT_VECTEUR_3D v(0.,0.,0.);
1736 return v;
1737 }
1739 {
1740  OT_VECTEUR_3D w_n_tot(0.,0.,0.);
1741  double norme_w_n_tot=0.;
1742  OT_VECTEUR_3D w2_n_tot(0.,0.,0.);
1743  double norme_w2_n_tot=0.;
1744  int nbtri=ndnrm->get_lien_triangle()->get_nb();
1745  for (int i=0;i<nbtri;i++)
1746  {
1747  MG_TRIANGLE* tri=(MG_TRIANGLE*)ndnrm->get_lien_triangle()->get(i);
1748 
1749  double *xyzn1=tri->get_noeud1()->get_coord();
1750  double *xyzn2=tri->get_noeud2()->get_coord();
1751  double *xyzn3=tri->get_noeud3()->get_coord();
1752 
1753  OT_VECTEUR_3D vec1(xyzn1,xyzn3);
1754  OT_VECTEUR_3D vec2(xyzn1,xyzn2);
1755  OT_VECTEUR_3D n_tri=vec1&vec2; // Normale au triangle
1756 
1757  double w=n_tri.get_longueur(); // 2 fois l'aire du triangle (pour éviter une division par 2)
1758  n_tri.norme();
1759  OT_VECTEUR_3D w_n=w*n_tri;
1760  double norme_w_n=w_n.get_longueur();
1761  w_n_tot=w_n_tot+w_n;
1762  norme_w_n_tot=norme_w_n_tot+norme_w_n;
1763  }
1764 
1765  OT_VECTEUR_3D n=w_n_tot/norme_w_n_tot; // Normale à la surface au noeud
1766  n.norme();
1767  return n;
1768 
1769 }
1770 
1772 {
1773  // circumspher passing through insphtri is checked if include the point insphp
1774  MG_NOEUD* node1=insphtri->get_noeud1();
1775  MG_NOEUD* node2=insphtri->get_noeud2();
1776  MG_NOEUD* node3=insphtri->get_noeud3();
1777  double bisectp1[3];
1778  double bisectp2[3];
1779  bisectp1[0]=(node1->get_x()+node2->get_x())/2.;
1780  bisectp1[1]=(node1->get_y()+node2->get_y())/2.;
1781  bisectp1[2]=(node1->get_z()+node2->get_z())/2.;
1782  bisectp2[0]=(node1->get_x()+node3->get_x())/2.;
1783  bisectp2[1]=(node1->get_y()+node3->get_y())/2.;
1784  bisectp2[2]=(node1->get_z()+node3->get_z())/2.;
1785 
1786  OT_VECTEUR_3D vec1(node1->get_coord(),node2->get_coord());
1787  OT_VECTEUR_3D vec2(node1->get_coord(),node3->get_coord());
1788  OT_VECTEUR_3D norvec=(vec1&vec2);
1789  OT_VECTEUR_3D norunivec=norvec; norunivec.norme();
1790  OT_VECTEUR_3D bivec1=(vec1&norunivec); //D1
1791  OT_VECTEUR_3D bivec2=(vec2&norunivec); //D2
1792  // check1,2and3 are determinans of A to solve Ax=b by cramer method x=(t,s), A=(bivec1,-bivec2) b=(bisectp2-bisectp1)
1793  double determinan1=bivec2.get_x()*bivec1.get_y()-bivec1.get_x()*bivec2.get_y();
1794  double determinan2=bivec2.get_x()*bivec1.get_z()-bivec1.get_x()*bivec2.get_z();
1795  double determinan3=bivec2.get_y()*bivec1.get_z()-bivec1.get_y()*bivec2.get_z();
1796 
1797  //cout<<"bivec1.change_x()="<<bivec1.get_x()<<"bivec1.change_y()="<<bivec1.get_y()<<"bivec1.change_z()="<<bivec1.get_z()<<endl;
1798  //cout<<"bivec2.change_x()="<<bivec2.get_x()<<"bivec2.change_y()="<<bivec2.get_y()<<"bivec2.change_z()="<<bivec2.get_z()<<endl;
1799 
1800  //cout<<"check1="<<determinan1<<"check2="<<determinan2<<"check3="<<determinan3<<endl;
1801  double s,t;
1802  if(determinan1!=0.)// && bivec1.get_x()!=0.)
1803  {
1804  s=(bivec1.get_x()*(bisectp2[1]-bisectp1[1])+bivec1.get_y()*(bisectp1[0]-bisectp2[0]))/determinan1;
1805  t=(bivec2.get_x()*(bisectp2[1]-bisectp1[1])+bivec2.get_y()*(bisectp1[0]-bisectp2[0]))/determinan1;
1806  //cout<<"s="<<s<<" t="<<t<<endl;
1807  }
1808  else if(determinan2!=0.)// && bivec1.get_y()!=0.)
1809  {
1810  s=(bivec1.get_x()*(bisectp2[2]-bisectp1[2])+bivec1.get_z()*(bisectp1[0]-bisectp2[0]))/determinan2;
1811  t=(bivec2.get_x()*(bisectp2[2]-bisectp1[2])+bivec2.get_z()*(bisectp1[0]-bisectp2[0]))/determinan2;
1812  //cout<<"s="<<s<<" t="<<t<<endl;
1813 
1814  }
1815  else if(determinan3!=0.) //&& bivec1.get_z()!=0.)
1816  {
1817  s=(bivec1.get_y()*(bisectp2[2]-bisectp1[2])+bivec1.get_z()*(bisectp1[1]-bisectp2[1]))/determinan3;
1818  t=(bivec2.get_y()*(bisectp2[2]-bisectp1[2])+bivec2.get_z()*(bisectp1[1]-bisectp2[1]))/determinan3;
1819  //cout<<"s="<<s<<" t="<<t<<endl;
1820  }
1821  else std::cout<<"probleeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeem"<<std::endl;
1822  double bisetlinz1=bisectp1[2]+t*bivec1.get_z();
1823  double bisetlinz2=bisectp2[2]+s*bivec2.get_z();
1824 
1825  double cx=bisectp2[0]+s*bivec2.get_x();
1826  double cy=bisectp2[1]+s*bivec2.get_y();
1827  double cz=bisectp2[2]+s*bivec2.get_z();
1828 double r=sqrt(pow((cx-node1->get_x()),2)+pow((cy-node1->get_y()),2)+pow((cz-node1->get_z()),2));
1829 double pcircum[3];
1830  pcircum[0]=(cx+r*norunivec.get_x());
1831  pcircum[1]=(cy+r*norunivec.get_y());
1832  pcircum[2]=(cz+r*norunivec.get_z());
1833 
1834  double pa[3];
1835  pa[0]=node1->get_x();
1836  pa[1]=node1->get_y();
1837  pa[2]=node1->get_z();
1838  double pb[3];
1839  pb[0]=node2->get_x();
1840  pb[1]=node2->get_y();
1841  pb[2]=node2->get_z();
1842  double pc[3];
1843  pc[0]=node3->get_x();
1844  pc[1]=node3->get_y();
1845  pc[2]=node3->get_z();
1846  double pe[3];
1847  pe[0]=insphp->get_x();
1848  pe[1]=insphp->get_y();
1849  pe[2]=insphp->get_z();
1850  double isphnb = robustPredicates::insphere(pa,pb,pc,pcircum,pe);
1851  //??? why <= ???? if insphnb<0
1852  return isphnb;
1853  }
1855 {
1856  MG_SEGMENT* seg1=tri->get_segment1(); double seg1leng=seg1->get_longueur();
1857  MG_SEGMENT* seg2=tri->get_segment2(); double seg2leng=seg2->get_longueur();
1858  MG_SEGMENT* seg3=tri->get_segment3(); double seg3leng=seg3->get_longueur();
1859  double avsegleng=(seg1leng+seg2leng+seg3leng)/3.;
1860  return avsegleng;
1861 }
1863  TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &octree,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree,double search_radius)
1864 {
1865 std::multimap<double,MG_TRIANGLE*,std::greater<double> > lstqualtri1st;
1866 LISTE_MG_TRIANGLE::iterator itqual1;
1867 for (MG_TRIANGLE* triqual1=mai->get_premier_triangle(itqual1);triqual1!=NULL;triqual1=mai->get_suivant_triangle(itqual1))
1868 {
1869  MG_MAILLAGE_OUTILS tq;
1870  double tqual=tq.qualite_triangle(triqual1->get_noeud1()->get_coord(),triqual1->get_noeud2()->get_coord(),triqual1->get_noeud3()->get_coord());
1871  lstqualtri1st.insert(std::pair<double,MG_TRIANGLE*> (tqual,triqual1));
1872 }
1873 
1874 std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator itqualtri1=lstqualtri1st.begin();
1875  while ((*itqualtri1).first<0.3)
1876  {
1877  MG_TRIANGLE* qtri=(*itqualtri1).second;
1878  MG_NOEUD* qtrind1=qtri->get_noeud1();
1879  MG_NOEUD* qtrind2=qtri->get_noeud2();
1880  MG_NOEUD* qtrind3=qtri->get_noeud3();
1881  int onedgqtrind1=0; int onedgqtrind2=0; int onedgqtrind3=0;
1882  TPL_MAP_ENTITE<MG_NOEUD*> edgends;
1884 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
1885 {
1886  MG_NOEUD* ednd1=segedg->get_noeud1();
1887  MG_NOEUD* ednd2=segedg->get_noeud2();
1888  edgends.ajouter(ednd1);
1889  edgends.ajouter(ednd2);
1890 }
1892 for(MG_NOEUD* ednds=edgends.get_premier(itednds);ednds!=NULL;ednds=edgends.get_suivant(itednds))
1893 {
1894 if (qtrind1==ednds) onedgqtrind1++;
1895 if (qtrind2==ednds) onedgqtrind2++;
1896 if (qtrind3==ednds) onedgqtrind3++;
1897 }
1898 
1899 if (onedgqtrind1==0) stl_optimize_nd(qtri,qtrind1,3.,search_radius,octree,stloctree);
1900 if (onedgqtrind2==0) stl_optimize_nd(qtri,qtrind2,3.,search_radius,octree,stloctree);
1901 if (onedgqtrind3==0) stl_optimize_nd(qtri,qtrind3,3.,search_radius,octree,stloctree);
1902 lstqualtri1st.erase(itqualtri1);
1903 itqualtri1=lstqualtri1st.begin();
1904  }
1905 
1906 
1907 std::multimap<double,MG_TRIANGLE*,std::less<double> > lstqualtri2nd;
1908 LISTE_MG_TRIANGLE::iterator itqual2;
1909 for (MG_TRIANGLE* triqual2=mai->get_premier_triangle(itqual2);triqual2!=NULL;triqual2=mai->get_suivant_triangle(itqual2))
1910 {
1911  MG_MAILLAGE_OUTILS tq;
1912  double tqual=tq.qualite_triangle(triqual2->get_noeud1()->get_coord(),triqual2->get_noeud2()->get_coord(),triqual2->get_noeud3()->get_coord());
1913  lstqualtri2nd.insert(std::pair<double,MG_TRIANGLE*> (tqual,triqual2));
1914 }
1915 
1916 std::multimap<double,MG_TRIANGLE*,std::less<double> >::iterator itqualtri2=lstqualtri2nd.begin();
1917  while ((*itqualtri2).first<0.5)
1918  {
1919  MG_TRIANGLE* qtri=(*itqualtri2).second;
1920  MG_NOEUD* qtrind1=qtri->get_noeud1();
1921  MG_NOEUD* qtrind2=qtri->get_noeud2();
1922  MG_NOEUD* qtrind3=qtri->get_noeud3();
1923  int onedgqtrind1=0; int onedgqtrind2=0; int onedgqtrind3=0;
1924  TPL_MAP_ENTITE<MG_NOEUD*> edgends;
1926 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
1927 {
1928  MG_NOEUD* ednd1=segedg->get_noeud1();
1929  MG_NOEUD* ednd2=segedg->get_noeud2();
1930  edgends.ajouter(ednd1);
1931  edgends.ajouter(ednd2);
1932 }
1934 for(MG_NOEUD* ednds=edgends.get_premier(itednds);ednds!=NULL;ednds=edgends.get_suivant(itednds))
1935 {
1936 if (qtrind1==ednds) onedgqtrind1++;
1937 if (qtrind2==ednds) onedgqtrind2++;
1938 if (qtrind3==ednds) onedgqtrind3++;
1939 }
1940 
1941 if (onedgqtrind1==0) stl_optimize_nd(qtri,qtrind1,3.,search_radius,octree,stloctree);
1942 if (onedgqtrind2==0) stl_optimize_nd(qtri,qtrind2,3.,search_radius,octree,stloctree);
1943 if (onedgqtrind3==0) stl_optimize_nd(qtri,qtrind3,3.,search_radius,octree,stloctree);
1944 lstqualtri2nd.erase(itqualtri2);
1945 itqualtri2=lstqualtri2nd.begin();
1946  }
1947 }
1949  TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &octree,MG_MAILLAGE* mai,double geo_angle_threshold,TPL_OCTREE<MG_TRIANGLE*,MG_NOEUD*> &stloctree)
1950 {
1951  //cout<<"swapchk start"<<endl;
1952 int edgechk=0;
1954 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
1955 {
1956  if (segedg==segchk)
1957  edgechk++;
1958 }
1959 if (edgechk==0 && segchk->get_lien_triangle()->get_nb()==2)
1960 {
1961  MG_TRIANGLE* dchktri=NULL; // dchktri is triangle that includes the insertnod (midnd)
1962  MG_TRIANGLE* trichk=NULL; // other connected tri is trichk
1963 
1964  int segchktrinb=segchk->get_lien_triangle()->get_nb();
1965  if (segchktrinb>2 || segchktrinb<1) std::cout<<"PROBLEM IN TRIANGULATIONNNNNNNNNNNNNN"<<std::endl;
1966  for (int isct=0;isct<segchk->get_lien_triangle()->get_nb();isct++)
1967  {
1968  MG_TRIANGLE* trick=segchk->get_lien_triangle()->get(isct);
1969  if (trick->get_noeud1()==insertnod || trick->get_noeud2()==insertnod || trick->get_noeud3()==insertnod)
1970  dchktri=trick;
1971  else trichk=trick;
1972  }
1973 if ((dchktri==NULL) || (trichk==NULL)) return;
1974  MG_MAILLAGE_OUTILS getangle;
1975  static int compteur=0;
1976  compteur++;
1977  double teta=getangle.get_angle(trichk,dchktri);
1978  teta=teta*180./3.14159265;
1979  //cout<<"teta= "<<teta<<endl;
1980  if (teta>180.-geo_angle_threshold && teta<geo_angle_threshold+180.)
1981  {
1982  //cout<<"teta is OKkk :)"<<endl;
1983  MG_NOEUD* othertrianglenode;
1984  if(trichk->get_noeud1()!=segchk->get_noeud1() && trichk->get_noeud1()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud1();
1985  else if(trichk->get_noeud2()!=segchk->get_noeud1() && trichk->get_noeud2()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud2();
1986  else if(trichk->get_noeud3()!=segchk->get_noeud1() && trichk->get_noeud3()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud3();
1987 
1988 
1989 TPL_MAP_ENTITE<MG_SEGMENT*> relatedseg;
1990 for(int irelatedseg1=0;irelatedseg1<insertnod->get_lien_triangle()->get_nb();irelatedseg1++)
1991 {
1992  MG_TRIANGLE* trirel1=insertnod->get_lien_triangle()->get(irelatedseg1);
1993  relatedseg.ajouter(trirel1->get_segment1());
1994  relatedseg.ajouter(trirel1->get_segment2());
1995  relatedseg.ajouter(trirel1->get_segment3());
1996 }
1997 for(int irelatedseg2=0;irelatedseg2<othertrianglenode->get_lien_triangle()->get_nb();irelatedseg2++)
1998 {
1999  MG_TRIANGLE* trirel2=othertrianglenode->get_lien_triangle()->get(irelatedseg2);
2000  relatedseg.ajouter(trirel2->get_segment1());
2001  relatedseg.ajouter(trirel2->get_segment2());
2002  relatedseg.ajouter(trirel2->get_segment3());
2003 }
2004 int checkifswpdigisexist=0;
2006 for(MG_SEGMENT* segtest=relatedseg.get_premier(itrelatedseg);segtest!=NULL;segtest=relatedseg.get_suivant(itrelatedseg))
2007 {
2008  if(segtest->get_noeud1()==insertnod && segtest->get_noeud2()==othertrianglenode) checkifswpdigisexist++;
2009  if(segtest->get_noeud2()==insertnod && segtest->get_noeud1()==othertrianglenode) checkifswpdigisexist++;
2010 }
2011 
2012 double anglestltiandswaptri1;
2013 double anglestltiandswaptri2;
2014 
2015  MG_NOEUD* segchknd1=segchk->get_noeud1();
2016  MG_NOEUD* segchknd2=segchk->get_noeud2();
2017  MG_NOEUD* trichknd;
2018  MG_NOEUD* trichknd1=trichk->get_noeud1();
2019  MG_NOEUD* trichknd2=trichk->get_noeud2();
2020  MG_NOEUD* trichknd3=trichk->get_noeud3();
2021  if (trichknd1!=segchknd1 && trichknd1!=segchknd2) trichknd=trichknd1;
2022  if (trichknd2!=segchknd1 && trichknd2!=segchknd2) trichknd=trichknd2;
2023  if (trichknd3!=segchknd1 && trichknd3!=segchknd2) trichknd=trichknd3;
2024  OT_VECTEUR_3D normaltriafterswaptri1;
2025  OT_VECTEUR_3D normaltriafterswaptri2;
2026 
2027  double centrnoid[3];
2028  centrnoid[0]=(segchknd1->get_x()+segchknd2->get_x())/2.;
2029  centrnoid[1]=(segchknd1->get_y()+segchknd2->get_y())/2.;
2030  centrnoid[2]=(segchknd1->get_z()+segchknd2->get_z())/2.;
2031 
2032 TPL_MAP_ENTITE<MG_TRIANGLE*> lststloctriswtest1;
2033 int stltriswtest1nb=lststloctriswtest1.get_nb();
2034 double stl_rad_search_swdg=0.001;
2035 while(stltriswtest1nb==0)
2036 {
2037  stloctree.rechercher(centrnoid[0],centrnoid[1],centrnoid[2],stl_rad_search_swdg,lststloctriswtest1);
2038  stltriswtest1nb=lststloctriswtest1.get_nb(); stl_rad_search_swdg=1.1*stl_rad_search_swdg;
2039 }
2040 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR itlststloctriswtest1;
2041 MG_TRIANGLE* stlclostri=lststloctriswtest1.get_premier(itlststloctriswtest1);
2042 OT_VECTEUR_3D vecstlclostri1=OT_VECTEUR_3D(stlclostri->get_noeud1()->get_coord(),stlclostri->get_noeud2()->get_coord());
2043 OT_VECTEUR_3D vecstlclostri2=OT_VECTEUR_3D(stlclostri->get_noeud1()->get_coord(),stlclostri->get_noeud3()->get_coord());
2044 OT_VECTEUR_3D normavecstlclostri=(vecstlclostri1&vecstlclostri2);
2045 OT_VECTEUR_3D uninormavecstlclostri=normavecstlclostri; uninormavecstlclostri.norme();
2046 
2047  int counterclockwise=0;
2048  if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud2()) counterclockwise++;
2049  if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud3()) counterclockwise++;
2050  if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud1()) counterclockwise++;
2051  int clockwise=0;
2052  if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud1()) clockwise++;
2053  if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud2()) clockwise++;
2054  if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud3()) clockwise++;
2055 
2056  if (counterclockwise>0 && clockwise==0)
2057  {
2058 anglestltiandswaptri1= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,segchknd1,trichknd);
2059 anglestltiandswaptri2= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,trichknd,segchknd2);
2060 
2061  /*
2062  OT_VECTEUR_3D vect11=OT_VECTEUR_3D(insertnod->get_coord(),segchknd1->get_coord());
2063  OT_VECTEUR_3D vect12=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
2064  OT_VECTEUR_3D normavectri1=(vect11&vect12);
2065  normaltriafterswaptri1=normavectri1; normaltriafterswaptri1.norme();
2066  //centrnoidtri1[0]=(insertnod->get_x()+segchknd1->get_x()+trichknd->get_x())/3.;
2067  //centrnoidtri1[1]=(insertnod->get_y()+segchknd1->get_y()+trichknd->get_y())/3.;
2068  //centrnoidtri1[2]=(insertnod->get_z()+segchknd1->get_z()+trichknd->get_z())/3.;
2069 
2070  OT_VECTEUR_3D vect21=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
2071  OT_VECTEUR_3D vect22=OT_VECTEUR_3D(insertnod->get_coord(),segchknd2->get_coord());
2072  OT_VECTEUR_3D normavectri2=(vect21&vect22);
2073  normaltriafterswaptri2=normavectri2; normaltriafterswaptri2.norme();
2074  // centrnoidtri2[0]=(insertnod->get_x()+segchknd2->get_x()+trichknd->get_x())/3.;
2075  //centrnoidtri2[1]=(insertnod->get_y()+segchknd2->get_y()+trichknd->get_y())/3.;
2076  //centrnoidtri2[2]=(insertnod->get_z()+segchknd2->get_z()+trichknd->get_z())/3.;
2077  */
2078  }
2079  else if (clockwise>0 && counterclockwise==0)
2080  {
2081 anglestltiandswaptri1= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,segchknd2,trichknd);
2082 anglestltiandswaptri2= get_angle_par_noeud<MG_NOEUD*>(stlclostri->get_noeud1(),stlclostri->get_noeud2(),stlclostri->get_noeud3(),insertnod,trichknd,segchknd1);
2083  /*
2084  OT_VECTEUR_3D vect11=OT_VECTEUR_3D(insertnod->get_coord(),segchknd2->get_coord());
2085  OT_VECTEUR_3D vect12=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
2086  OT_VECTEUR_3D normavectri1=(vect11&vect12);
2087  normaltriafterswaptri1=normavectri1; normaltriafterswaptri1.norme();
2088  //centrnoidtri1[0]=(insertnod->get_x()+segchknd2->get_x()+trichknd->get_x())/3.;
2089  //centrnoidtri1[1]=(insertnod->get_y()+segchknd2->get_y()+trichknd->get_y())/3.;
2090  //centrnoidtri1[2]=(insertnod->get_z()+segchknd2->get_z()+trichknd->get_z())/3.;
2091 
2092  OT_VECTEUR_3D vect21=OT_VECTEUR_3D(insertnod->get_coord(),trichknd->get_coord());
2093  OT_VECTEUR_3D vect22=OT_VECTEUR_3D(insertnod->get_coord(),segchknd1->get_coord());
2094  OT_VECTEUR_3D normavectri2=(vect21&vect22);
2095  normaltriafterswaptri2=normavectri2; normaltriafterswaptri2.norme();
2096  //centrnoidtri2[0]=(insertnod->get_x()+segchknd1->get_x()+trichknd->get_x())/3.;
2097  //centrnoidtri2[1]=(insertnod->get_y()+segchknd1->get_y()+trichknd->get_y())/3.;
2098  //centrnoidtri2[2]=(insertnod->get_z()+segchknd1->get_z()+trichknd->get_z())/3.;
2099  */
2100  }
2101 
2102 
2103 
2104 
2105 
2106 if(checkifswpdigisexist==0 && anglestltiandswaptri1<3.14159265 && anglestltiandswaptri2<3.14159265)
2107 {
2108  double pinsphnbnewtri=inshper_point(othertrianglenode,dchktri);
2109  double pinsphnbothertri=inshper_point(insertnod,trichk);
2110 int qualchk=0;
2111 std::map<double,MG_NOEUD*,std::less<double> > beforeswap;
2112 std::map<double,MG_NOEUD*,std::less<double> > afterswap;
2113 MG_MAILLAGE_OUTILS triquality;
2114 double triqualnew=triquality.qualite_triangle(dchktri->get_noeud1()->get_coord(),dchktri->get_noeud2()->get_coord(),dchktri->get_noeud3()->get_coord());
2115 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualnew,dchktri->get_noeud1()));
2116 double triqualchek=triquality.qualite_triangle(trichk->get_noeud1()->get_coord(),trichk->get_noeud2()->get_coord(),trichk->get_noeud3()->get_coord());
2117 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualchek,dchktri->get_noeud2()));
2118 double afterswap1=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud1()->get_coord());
2119 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap1,insertnod));
2120 double afterswap2=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud2()->get_coord());
2121 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap2,othertrianglenode));
2122 std::map<double,MG_NOEUD*,std::less<double> >::iterator itbeforeswap=beforeswap.begin();
2123 std::map<double,MG_NOEUD*,std::less<double> >::iterator itafterswap=afterswap.begin();
2124 
2125 if (qualswap>0 && (*itafterswap).first>(*itbeforeswap).first) qualchk=qualchk+1;
2126 if (pinsphnbnewtri<=0.|| pinsphnbothertri<=0.) //inside sphere
2127  if(qualchk>0)
2128  {
2129 
2130  //cout<<" swap diagonal is operated"<<endl;
2131  //MG_NOEUD* segchknd1=segchk->get_noeud1();
2132  //MG_NOEUD* segchknd2=segchk->get_noeud2();
2133 
2134  MG_TRIANGLE* triad1;
2135  MG_TRIANGLE* triad2;
2136  int counterclockwise=0;
2137  if (segchk->get_noeud1()==dchktri->get_noeud1() && segchk->get_noeud2()==dchktri->get_noeud2()) counterclockwise++;
2138  if (segchk->get_noeud1()==dchktri->get_noeud2() && segchk->get_noeud2()==dchktri->get_noeud3()) counterclockwise++;
2139  if (segchk->get_noeud1()==dchktri->get_noeud3() && segchk->get_noeud2()==dchktri->get_noeud1()) counterclockwise++;
2140  int clockwise=0;
2141  if (segchk->get_noeud1()==dchktri->get_noeud2() && segchk->get_noeud2()==dchktri->get_noeud1()) clockwise++;
2142  if (segchk->get_noeud1()==dchktri->get_noeud3() && segchk->get_noeud2()==dchktri->get_noeud2()) clockwise++;
2143  if (segchk->get_noeud1()==dchktri->get_noeud1() && segchk->get_noeud2()==dchktri->get_noeud3()) clockwise++;
2144  //cout<<"counterclockwise= "<<counterclockwise<<" clockwise= "<<clockwise<<endl;
2145 
2146  if (counterclockwise>0 && clockwise==0)
2147  {
2148  //cout<<" counterclockwise"<<endl;
2149  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchk->get_noeud1(),othertrianglenode, MAGIC::ORIGINE::MAILLEUR_AUTO);
2150  triad2=mai->ajouter_mg_triangle(NULL,insertnod,othertrianglenode,segchk->get_noeud2(), MAGIC::ORIGINE::MAILLEUR_AUTO);
2151  }
2152  if (clockwise>0 && counterclockwise==0)
2153  {
2154  //cout<<" clockwise"<<endl;
2155  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchk->get_noeud2(),othertrianglenode, MAGIC::ORIGINE::MAILLEUR_AUTO);
2156  triad2=mai->ajouter_mg_triangle(NULL,insertnod,othertrianglenode,segchk->get_noeud1(), MAGIC::ORIGINE::MAILLEUR_AUTO);
2157  }
2158 
2159  octree.inserer(triad1);
2160  octree.inserer(triad2);
2161  octree.supprimer(dchktri);
2162  octree.supprimer(trichk);
2163 
2164  double trisiz1=targetsize_criteria(triad1);
2165  (stlsortings).insert(std::pair<double,MG_TRIANGLE*>(trisiz1,triad1));//std::cout<<" tri area aded swap:"<<trisiz1<<endl;
2166  double trisiz2=targetsize_criteria(triad2);
2167  (stlsortings).insert(std::pair<double,MG_TRIANGLE*>(trisiz2,triad2));//std::cout<<" tri area aded swap:"<<trisiz2<<endl;
2168  double intriarea1=targetsize_criteria(dchktri);
2169  STLSORTMMAP::iterator ite1;
2170  for (ite1= (stlsortings).find(intriarea1);ite1!= (stlsortings).end();ite1++)
2171  {
2172  if ((*ite1).second==dchktri)
2173  {(stlsortings).erase(ite1); ;break;}
2174  }
2175  double intriarea2=targetsize_criteria(trichk);
2176  STLSORTMMAP::iterator ite2;
2177  for (ite2= (stlsortings).find(intriarea2);ite2!= (stlsortings).end();ite2++)
2178  {
2179  if ((*ite2).second==trichk)
2180  {(stlsortings).erase(ite2);break;}
2181  }
2182 
2183 /*
2184  //MG_SEGMENT* sizseg=mai->get_mg_segment(insertnod->get_id(),othertrianglenode->get_id()); //if the order of nodes in segments are not important
2185  TPL_LISTE_ENTITE<MG_SEGMENT*> triad1segs;
2186  TPL_LISTE_ENTITE<MG_SEGMENT*> triad2segs;
2187  triad1segs.ajouter(triad1->get_segment1());
2188  triad1segs.ajouter(triad1->get_segment2());
2189  triad1segs.ajouter(triad1->get_segment3());
2190  triad2segs.ajouter(triad2->get_segment1());
2191  triad2segs.ajouter(triad2->get_segment2());
2192  triad2segs.ajouter(triad2->get_segment3());
2193  MG_SEGMENT* sizsegment;
2194 
2195  for(int count1=0;count1<triad1segs.get_nb();count1++)
2196  {
2197  MG_SEGMENT* segcount1=triad1segs.get(count1);
2198  for(int count2=0;count2<triad2segs.get_nb();count2++)
2199  {
2200  MG_SEGMENT* segcount2=triad2segs.get(count2);
2201  if (segcount1==segcount2)
2202  {
2203  sizsegment=segcount1;
2204  //cout<<" yess adedd YEESSSSSSSSSS"<<endl;
2205  }
2206 
2207 
2208  }
2209  }
2210  //if (!(sizsegment->get_noeud1()==insertnod || sizsegment->get_noeud1()==othertrianglenode))
2211  //cout<<" !(sizsegment->change_noeud1()==insertnod || sizsegment->change_noeud1()==othertrianglenode)"<<endl;
2212  double* xyz11=sizsegment->get_noeud1()->get_coord();
2213  double* xyz21=sizsegment->get_noeud2()->get_coord();
2214  double metriclength1=calcul_distance_metrique(xyz11,xyz21,32,metrique);
2215  sizemapsorting.insert(pair<double,MG_SEGMENT*>(metriclength1,sizsegment));
2216 
2217  // deletefrom sizemapsorting
2218  double* segchkzxyz1=segchk->get_noeud1()->get_coord();
2219  double* segchkzxyz2=segchk->get_noeud2()->get_coord();
2220  double delsegchk=calcul_distance_metrique(segchkzxyz1,segchkzxyz2,32,metrique);
2221  //cout<<"delsegchk= "<<delsegchk<<endl;
2222 for (SIZMAPSORT::iterator itdelsegchksz=sizemapsorting.find(delsegchk);itdelsegchksz!=sizemapsorting.end();itdelsegchksz++)
2223 {
2224  //cout<<"the seg is found hereeee"<<endl;
2225  if ((*itdelsegchksz).second==segchk)
2226  {
2227  sizemapsorting.erase(itdelsegchksz);
2228  cout<<"delition of segchk for delaunay flip in this step is doooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooone"<<endl;
2229  }
2230 
2231 }
2232 */
2233 mai->supprimer_mg_triangleid(dchktri->get_id());
2234 mai->supprimer_mg_triangleid(trichk->get_id());
2235  }
2236 }
2237  }
2238 }
2239 /*
2240 if (edgechk==0)
2241 {
2242  MG_TRIANGLE* trichk;
2243  int segchktrinb=segchk->get_lien_triangle()->get_nb();
2244  for (int isct=0;isct<segchktrinb;isct++)
2245  {
2246  MG_TRIANGLE* trick=segchk->get_lien_triangle()->get(isct);
2247  if (trick!=dchktri) trichk=trick;
2248  }
2249  MG_MAILLAGE_OUTILS getangle;
2250  double teta=getangle.get_angle(trichk,dchktri);
2251  teta=teta*180./3.14159265;cout<<"teta= "<<teta<<endl;
2252  if (teta>180.-geo_angle_threshold && teta<geo_angle_threshold+180.)
2253  {
2254  //cout<<"teta is OKkk :)"<<endl;
2255  MG_NOEUD* othertrianglenode;
2256  if(trichk->get_noeud1()!=segchk->get_noeud1() && trichk->get_noeud1()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud1();
2257  else if(trichk->get_noeud2()!=segchk->get_noeud1() && trichk->get_noeud2()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud2();
2258  else if(trichk->get_noeud3()!=segchk->get_noeud1() && trichk->get_noeud3()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud3();
2259 
2260 TPL_MAP_ENTITE<MG_SEGMENT*> relatedseg;
2261 for(int irelatedseg1=0;irelatedseg1<insertnod->get_lien_triangle()->get_nb();irelatedseg1++)
2262 {
2263  MG_TRIANGLE* trirel1=insertnod->get_lien_triangle()->get(irelatedseg1);
2264  relatedseg.ajouter(trirel1->get_segment1());
2265  relatedseg.ajouter(trirel1->get_segment2());
2266  relatedseg.ajouter(trirel1->get_segment3());
2267 }
2268 for(int irelatedseg2=0;irelatedseg2<othertrianglenode->get_lien_triangle()->get_nb();irelatedseg2++)
2269 {
2270  MG_TRIANGLE* trirel2=othertrianglenode->get_lien_triangle()->get(irelatedseg2);
2271  relatedseg.ajouter(trirel2->get_segment1());
2272  relatedseg.ajouter(trirel2->get_segment2());
2273  relatedseg.ajouter(trirel2->get_segment3());
2274 }
2275 int checkifswpdigisexist=0;
2276 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itrelatedseg;
2277 for(MG_SEGMENT* segtest=relatedseg.get_premier(itrelatedseg);segtest!=NULL;segtest=relatedseg.get_suivant(itrelatedseg))
2278 {
2279  if(segtest->get_noeud1()==insertnod && segtest->get_noeud2()==othertrianglenode) checkifswpdigisexist++;
2280  if(segtest->get_noeud2()==insertnod && segtest->get_noeud1()==othertrianglenode) checkifswpdigisexist++;
2281 }
2282 cout<<"checkifswpdigisexist= "<<checkifswpdigisexist<<endl;
2283 if(checkifswpdigisexist==0)
2284 {
2285  double pinsphnbnewtri=inshper_point(othertrianglenode,dchktri);
2286  double pinsphnbothertri=inshper_point(insertnod,trichk);
2287 int qualchk=0;
2288 std::map<double,MG_NOEUD*,std::less<double> > beforeswap;
2289 std::map<double,MG_NOEUD*,std::less<double> > afterswap;
2290 MG_MAILLAGE_OUTILS triquality;
2291 double triqualnew=triquality.qualite_triangle(dchktri->get_noeud1()->get_coord(),dchktri->get_noeud2()->get_coord(),dchktri->get_noeud3()->get_coord());
2292 beforeswap.insert(pair<double,MG_NOEUD*> (triqualnew,dchktri->get_noeud1()));
2293 double triqualchek=triquality.qualite_triangle(trichk->get_noeud1()->get_coord(),trichk->get_noeud2()->get_coord(),trichk->get_noeud3()->get_coord());
2294 beforeswap.insert(pair<double,MG_NOEUD*> (triqualchek,dchktri->get_noeud2()));
2295 double afterswap1=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud1()->get_coord());
2296 afterswap.insert(pair<double,MG_NOEUD*>(afterswap1,insertnod));
2297 double afterswap2=triquality.qualite_triangle(insertnod->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud2()->get_coord());
2298 afterswap.insert(pair<double,MG_NOEUD*>(afterswap2,othertrianglenode));
2299 std::map<double,MG_NOEUD*,std::less<double> >::iterator itbeforeswap=beforeswap.begin();
2300 std::map<double,MG_NOEUD*,std::less<double> >::iterator itafterswap=afterswap.begin();
2301 
2302 if (qualswap>0 && (*itafterswap).first>(*itbeforeswap).first) qualchk=qualchk+1;
2303 if (pinsphnbnewtri<=0.|| pinsphnbothertri<=0.) //inside sphere
2304  if(qualchk>0)
2305  {
2306  MG_NOEUD* segchknd1=segchk->get_noeud1();
2307  MG_NOEUD* segchknd2=segchk->get_noeud2();
2308  MG_NOEUD* trichknd;
2309  MG_NOEUD* trichknd1=trichk->get_noeud1();
2310  MG_NOEUD* trichknd2=trichk->get_noeud2();
2311  MG_NOEUD* trichknd3=trichk->get_noeud3();
2312  if (trichknd1!=segchknd1 && trichknd1!=segchknd2) trichknd=trichknd1;
2313  if (trichknd2!=segchknd1 && trichknd2!=segchknd2) trichknd=trichknd2;
2314  if (trichknd3!=segchknd1 && trichknd3!=segchknd2) trichknd=trichknd3;
2315  MG_TRIANGLE* triad1;
2316  MG_TRIANGLE* triad2;
2317  if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud2())
2318  {
2319  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd1,trichknd, MAILLEUR_AUTO);
2320  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd2, MAILLEUR_AUTO);
2321  }
2322  else if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud3())
2323  {
2324  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd1,trichknd, MAILLEUR_AUTO);
2325  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd2, MAILLEUR_AUTO);
2326  }
2327  else if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud1())
2328  {
2329  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd1,trichknd, MAILLEUR_AUTO);
2330  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd2, MAILLEUR_AUTO);
2331  }
2332  else if (segchknd1==dchktri->get_noeud2() && segchknd2==dchktri->get_noeud1())
2333  {
2334  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd2,trichknd, MAILLEUR_AUTO);
2335  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd1, MAILLEUR_AUTO);
2336  }
2337  else if (segchknd1==dchktri->get_noeud3() && segchknd2==dchktri->get_noeud2())
2338  {
2339  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd2,trichknd, MAILLEUR_AUTO);
2340  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd1, MAILLEUR_AUTO);
2341  }
2342  else if (segchknd1==dchktri->get_noeud1() && segchknd2==dchktri->get_noeud3())
2343  {
2344  triad1=mai->ajouter_mg_triangle(NULL,insertnod,segchknd2,trichknd, MAILLEUR_AUTO);
2345  triad2=mai->ajouter_mg_triangle(NULL,insertnod,trichknd,segchknd1, MAILLEUR_AUTO);
2346  }
2347  octree.inserer(triad1);
2348  octree.inserer(triad2);
2349  octree.supprimer(dchktri);
2350  octree.supprimer(trichk);
2351  double trisiz1=targetsize_criteria(triad1);
2352  (stlsortings).insert(pair<double,MG_TRIANGLE*>(trisiz1,triad1));std::cout<<" tri area aded swap:"<<trisiz1<<endl;
2353  double trisiz2=targetsize_criteria(triad2);
2354  (stlsortings).insert(pair<double,MG_TRIANGLE*>(trisiz2,triad2));std::cout<<" tri area aded swap:"<<trisiz2<<endl;
2355  double intriarea1=targetsize_criteria(dchktri);
2356  STLSORTMMAP::iterator ite1;
2357  for (ite1= (stlsortings).find(intriarea1);ite1!= (stlsortings).end();ite1++)
2358  if ((*ite1).second==dchktri) {(stlsortings).erase(ite1);
2359  std::cout<<" tri area delet swap:"<<(*ite1).first<<endl;}
2360  double intriarea2=targetsize_criteria(trichk);
2361  STLSORTMMAP::iterator ite2;
2362  for (ite2= (stlsortings).find(intriarea2);ite2!= (stlsortings).end();ite2++)
2363  if ((*ite2).second==trichk){(stlsortings).erase(ite2);
2364  std::cout<<" tri area delet swap:"<<(*ite2).first<<endl;}
2365 
2366  mai->supprimer_mg_triangleid(dchktri->get_id());
2367  mai->supprimer_mg_triangleid(trichk->get_id());
2368  }
2369 
2370 }
2371  }
2372 }
2373  */
2374 }
2376 {
2377  double edge_angle_threshold=45.;
2378  double geo_angle_threshold=25.;
2380  MG_MAILLAGE* mai;
2384  FILE *in=fopen(fichierinspoint,"rt");
2385  if (in==NULL) affiche((char*) "file is not available");
2386  while (!feof(in))
2387  {
2388  char chaine[500];
2389  char* res=fgets(chaine,500,in);
2390  if(res!=NULL)
2391  {
2392  double x,y,z;
2393  int nb=sscanf(chaine,"%le %le %le",&x,&y,&z);
2394  if (nb!=-1 && nb!=3) affiche((char*)"Wrong file format");
2395 else if (nb!=-1 && nb==3)
2396 {
2398  pins.ajouter(p);
2399 }
2400  }
2401  }
2402  fclose(in);
2403  double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
2404  TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
2405  LISTE_MG_NOEUD::iterator it;
2406 for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2407  {
2408  if (no->get_x()<xmin) xmin=no->get_x();
2409  if (no->get_y()<ymin) ymin=no->get_y();
2410  if (no->get_z()<zmin) zmin=no->get_z();
2411  if (no->get_x()>xmax) xmax=no->get_x();
2412  if (no->get_y()>ymax) ymax=no->get_y();
2413  if (no->get_z()>zmax) zmax=no->get_z();
2414  lstnoeud.ajouter(no);
2415  }
2416  OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
2417  OT_VECTEUR_3D vecmmax(xmax,ymax,zmax);
2418  OT_VECTEUR_3D vec(vecmmax,vecmin);
2419  double bounbox_diag=vec.get_longueur();
2420  double search_radius=0.1*bounbox_diag;
2421  char bboxdiag[1000];
2422  sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
2423  affiche((char*) bboxdiag);
2424 
2425  OT_VECTEUR_3D min(xmin,ymin,zmin);
2426  OT_VECTEUR_3D max(xmax,ymax,zmax);
2427  OT_VECTEUR_3D average=(min+max)/2.;
2428  OT_VECTEUR_3D lengthvec(min,max);
2429  double length=sqrt(lengthvec*lengthvec);
2430  double bxr=1.1;
2431  xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
2432  xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
2434  stloctree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2435 
2437  octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2438  LISTE_MG_TRIANGLE::iterator itoctrins;
2439  for (MG_TRIANGLE* octrins=mai->get_premier_triangle(itoctrins);octrins!=NULL;octrins=mai->get_suivant_triangle(itoctrins))
2440  octree.inserer(octrins);
2441 
2443 LISTE_MG_SEGMENT::iterator ited;
2444 for (MG_SEGMENT* seged=mai->get_premier_segment(ited);seged!=NULL;seged=mai->get_suivant_segment(ited))
2445 {
2446  if (seged->get_lien_triangle()->get_nb()==1) lstedges.ajouter(seged); // The boundary segments in open surfaces
2447  else if (seged->get_lien_triangle()->get_nb()==2)
2448  {
2449  MG_TRIANGLE* tri1=seged->get_lien_triangle()->get(0);
2450  MG_TRIANGLE* tri2=seged->get_lien_triangle()->get(1);
2451  MG_MAILLAGE_OUTILS getangle;
2452  double teta=getangle.get_angle(tri1,tri2);teta=teta*180./3.14159265;
2453  if (teta<=(180.-edge_angle_threshold) || teta>=(edge_angle_threshold+180.)) lstedges.ajouter(seged);
2454  }
2455 }
2456 
2457 int pointinsnumber=0;
2458 for (int ipins=0;ipins<pins.get_nb();ipins++)
2459 {
2460  pointinsnumber++;
2461  std::cout<<"insertedpoint NO= "<<pointinsnumber<<std::endl;
2462  int sameinsnd_meshnd=0;
2463  double proximityqual;
2464  double delaunyinsqual;
2465  std::multimap<double,MG_NOEUD*,std::greater<double> > lstqualprxndfinal;
2466  MG_MAILLAGE_OUTILS tq;
2467  MG_NOEUD* p=pins.get(ipins);
2468  //MG_ELEMENT_TOPOLOGIQUE *top;
2469  TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
2470  int neitrinb1=lstneitri1.get_nb();
2471  while(neitrinb1==0)
2472 {
2473  octree.rechercher(p->get_x(),p->get_y(),p->get_z(),search_radius,lstneitri1);
2474  neitrinb1=lstneitri1.get_nb();
2475  search_radius=search_radius+0.1*search_radius;
2476 }
2477  //check for the point proximity to any tri point
2478 
2479 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it01; //can be merged with the delaunay insertion method
2480 TPL_MAP_ENTITE<MG_NOEUD*> proxtrind;
2481 for (MG_TRIANGLE* tri01=lstneitri1.get_premier(it01);tri01!=NULL;tri01=lstneitri1.get_suivant(it01))
2482  {
2483  //top=tri01->get_lien_topologie();
2484  MG_NOEUD* dpnd1=tri01->get_noeud1();
2485  MG_NOEUD* dpnd2=tri01->get_noeud2();
2486  MG_NOEUD* dpnd3=tri01->get_noeud3();
2487  proxtrind.ajouter(dpnd1);
2488  proxtrind.ajouter(dpnd2);
2489  proxtrind.ajouter(dpnd3);
2490  }
2491 std::multimap< double, MG_NOEUD* , std::less<double> > lstdisproxnde;
2493 for(MG_NOEUD* prnde=proxtrind.get_premier(itprnde);prnde!=NULL;prnde=proxtrind.get_suivant(itprnde))
2494 {
2495  TPL_MAP_ENTITE<MG_SEGMENT*> lstprndelinksegs;
2496  for(int ilstprndelinksegs=0;ilstprndelinksegs<prnde->get_lien_petit_segment()->get_nb();ilstprndelinksegs++)
2497  lstprndelinksegs.ajouter(prnde->get_lien_petit_segment()->get(ilstprndelinksegs));
2498  int prndonedge=0;
2499  TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstprndelinksegs;
2501  for(MG_SEGMENT* prndelinksegs=lstprndelinksegs.get_premier(itlstprndelinksegs);prndelinksegs!=NULL;prndelinksegs=lstprndelinksegs.get_suivant(itlstprndelinksegs))
2502  {
2503  for(MG_SEGMENT* edges=lstedges.get_premier(itlstedges);edges!=NULL;edges=lstedges.get_suivant(itlstedges))
2504  {
2505  if(edges==prndelinksegs)
2506  prndonedge++;
2507  }
2508  }
2509  if (prnde->get_x()==p->get_x() && prnde->get_y()==p->get_y() && prnde->get_z()==p->get_z() && prndonedge==0)
2510  {
2511  //top=prnde->get_lien_topologie();
2512  stlproxnd_stlndinsert(prnde,p,mai,octree,lstedges);
2513  sameinsnd_meshnd=sameinsnd_meshnd+1;
2514  std::cout<<"the same node as insertion"<<std::endl;
2515  break;
2516  }
2517  else if(prndonedge==0)
2518  {
2519  double dp=sqrt(pow((p->get_x()-prnde->get_x()),2)+pow((p->get_y()-prnde->get_y()),2)+pow((p->get_z()-prnde->get_z()),2));
2520  lstdisproxnde.insert(std::pair<double, MG_NOEUD*> (dp,prnde));
2521  }
2522 }
2523 if( sameinsnd_meshnd==0 && lstdisproxnde.size()>0)
2524  {
2525 std::multimap< double, MG_NOEUD* , std::less<double> >::iterator itlstdprnd=lstdisproxnde.begin();
2526 double mindis=(*itlstdprnd).first;
2527 TPL_MAP_ENTITE<MG_NOEUD*> lstprnds;
2528 double distelorance=1.1;
2529 
2530 for (itlstdprnd=lstdisproxnde.begin();itlstdprnd!=lstdisproxnde.end();itlstdprnd++)
2531 {
2532  if ((*itlstdprnd).first<(distelorance*mindis))
2533  lstprnds.ajouter((*itlstdprnd).second);
2534 }
2535 
2536 std::multimap<double,MG_NOEUD*,std::less<double> > lstqualtri;
2538 for(MG_NOEUD* proxnd=lstprnds.get_premier(itlstprnds);proxnd!=NULL;proxnd=lstprnds.get_suivant(itlstprnds))
2539 {
2540  if(proxnd->get_x()==p->get_x() && proxnd->get_y()==p->get_y() && proxnd->get_z()==p->get_z()) std::cout<<"proxinod is the same as insertion node"<<std::endl;
2541 
2542  int checkisinspoint=0;
2543  for(int ipins1=0;ipins1<pins.get_nb();ipins1++ )
2544  {
2545  MG_NOEUD* checknotinspoint=pins.get(ipins1);
2546  if (checknotinspoint==proxnd)
2547  checkisinspoint=checkisinspoint+1; //cout<<"checknotinspoint==proxnd"<<endl;}
2548  }
2549  if (checkisinspoint==0)
2550  {
2551  //int proxndtop=proxnd->get_lien_topologie()->get_dimension();
2552  //if (proxndtop!=0 && proxndtop!=1) //prox node is not on edge
2553  for(int iptr=0;iptr<proxnd->get_lien_triangle()->get_nb();iptr++)
2554  {
2555  MG_TRIANGLE* prli=proxnd->get_lien_triangle()->get(iptr);
2556  MG_SEGMENT* prliseg1=prli->get_segment1(); MG_NOEUD* prliseg1nd1=prliseg1->get_noeud1(); MG_NOEUD* prliseg1nd2=prliseg1->get_noeud2();
2557  MG_SEGMENT* prliseg2=prli->get_segment2(); MG_NOEUD* prliseg2nd1=prliseg2->get_noeud1(); MG_NOEUD* prliseg2nd2=prliseg2->get_noeud2();
2558  MG_SEGMENT* prliseg3=prli->get_segment3(); MG_NOEUD* prliseg3nd1=prliseg3->get_noeud1(); MG_NOEUD* prliseg3nd2=prliseg3->get_noeud2();
2559  MG_NOEUD* prlind1=prli->get_noeud1();
2560  MG_NOEUD* prlind2=prli->get_noeud2();
2561  MG_NOEUD* prlind3=prli->get_noeud3();
2562  MG_SEGMENT* sgchk;
2563  if(proxnd!=prliseg1nd1 && proxnd!=prliseg1nd2) sgchk=prliseg1;
2564  if(proxnd!=prliseg2nd1 && proxnd!=prliseg2nd2) sgchk=prliseg2;
2565  if(proxnd!=prliseg3nd1 && proxnd!=prliseg3nd2) sgchk=prliseg3;
2566  MG_TRIANGLE* othertriangle;
2567  //cout<<"sgchk->get_lien_triangle()->get_nb()= "<<sgchk->get_lien_triangle()->get_nb()<<endl;
2568  double insph_swap_chk=1;
2569  if(sgchk->get_lien_triangle()->get_nb()>1)
2570  {
2571  if(sgchk->get_lien_triangle()->get(0)!=prli) othertriangle=sgchk->get_lien_triangle()->get(0);
2572  else if(sgchk->get_lien_triangle()->get(1)!=prli) othertriangle=sgchk->get_lien_triangle()->get(1);
2573  insph_swap_chk=inshper_point(p,othertriangle);
2574  MG_NOEUD* trimateothernd;
2575  if(othertriangle->get_noeud1()!=sgchk->get_noeud1() && othertriangle->get_noeud1()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud1();
2576  else if(othertriangle->get_noeud2()!=sgchk->get_noeud1() && othertriangle->get_noeud2()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud2();
2577  else if(othertriangle->get_noeud3()!=sgchk->get_noeud1() && othertriangle->get_noeud3()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud3();
2578 
2579 
2580 
2581  if(prlind1==proxnd)
2582  {
2583  if(insph_swap_chk<=0)
2584  {
2585  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),trimateothernd->get_coord());
2586  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud3()->get_coord(),trimateothernd->get_coord());
2587  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
2588  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
2589  }
2590  else
2591  {
2592  double tqual=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),prli->get_noeud3()->get_coord());
2593  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
2594  }
2595  }
2596 
2597  else if(prlind2==proxnd)
2598  {
2599  if(insph_swap_chk<=0)
2600  {
2601  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud1()->get_coord(),trimateothernd->get_coord());
2602  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud3()->get_coord(),trimateothernd->get_coord());
2603  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
2604  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
2605  }
2606  else
2607  {
2608  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),p->get_coord(),prli->get_noeud3()->get_coord());
2609  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
2610  }
2611  }
2612  else if(prlind3==proxnd)
2613  {
2614  if(insph_swap_chk<=0)
2615  {
2616  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud1()->get_coord(),trimateothernd->get_coord());
2617  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),trimateothernd->get_coord());
2618  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
2619  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
2620  }
2621  else
2622  {
2623  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),prli->get_noeud2()->get_coord(),p->get_coord());
2624  lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
2625  }
2626  }
2627  }
2628  }
2629 
2630  std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itlstqualtri=lstqualtri.begin();
2631  lstqualprxndfinal.insert(std::pair<double,MG_NOEUD*>((*itlstqualtri).first,(*itlstqualtri).second));
2632  }
2633 }
2634 
2635 if (lstqualprxndfinal.size()==0)
2636  proximityqual=0.;
2637 else
2638 {
2639 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
2640  proximityqual=(*itlstqualprxndfinal).first;
2641 }
2642  /*
2643 std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
2644 
2645 
2646 TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
2647 int neitrinb=lstneitri.get_nb();
2648 while(neitrinb==0)
2649 {
2650  octree.rechercher(p->get_x(),p->get_y(),p->get_z(),search_radius,lstneitri);
2651  neitrinb=lstneitri.get_nb();
2652  search_radius=search_radius+0.01*search_radius;
2653 }
2654 TPL_MAP_ENTITE<MG_NOEUD*> lstneighbornds;
2655 TPL_MAP_ENTITE<MG_TRIANGLE*> insphtri;
2656 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it1;
2657 for (MG_TRIANGLE* tri1=lstneitri.get_premier(it1);tri1!=NULL;tri1=lstneitri.get_suivant(it1))
2658  {
2659  lstneighbornds.ajouter(tri1->get_noeud1());
2660  lstneighbornds.ajouter(tri1->get_noeud2());
2661  lstneighbornds.ajouter(tri1->get_noeud3());
2662  //top=tri1->get_lien_topologie();
2663  double insphchk=inshper_point(p,tri1);
2664  if (insphchk<=0.) insphtri.ajouter(tri1);
2665  }
2666  OT_VECTEUR_3D normale(0.,0.,0.);
2667  TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it02;
2668  for (MG_NOEUD* nornd=lstneighbornds.get_premier(it02);nornd!=NULL;nornd=lstneighbornds.get_suivant(it02))
2669  {
2670  OT_VECTEUR_3D lngpnornd(p->get_coord(),nornd->get_coord());double lengpnornd=lngpnornd.get_longueur();
2671  OT_VECTEUR_3D norm=discrete_norm(nornd);
2672  norm=lengpnornd*norm;
2673  normale=normale+norm;
2674  }
2675 
2676 TPL_MAP_ENTITE<MG_SEGMENT*> segbase;
2677 TPL_MAP_ENTITE<MG_TRIANGLE*> basetri;
2678 double pproj[3];
2679 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
2680 for (MG_TRIANGLE* insphertri=insphtri.get_premier(inspi);insphertri!=NULL;insphertri=insphtri.get_suivant(inspi))
2681 {
2682 MG_NOEUD* inspnd1=insphertri->get_noeud1();
2683 MG_NOEUD* inspnd2=insphertri->get_noeud2();
2684 MG_NOEUD* inspnd3=insphertri->get_noeud3();
2685 OT_VECTEUR_3D norm=normale;
2686 double a1=inspnd1->get_x()-p->get_x();double a2=inspnd1->get_x()-inspnd2->get_x();double a3=inspnd1->get_x()-inspnd3->get_x();
2687 OT_VECTEUR_3D r1(a1,a2,a3);
2688 double a11=inspnd1->get_y()-p->get_y();double a12=inspnd1->get_y()-inspnd2->get_y();double a13=inspnd1->get_y()-inspnd3->get_y();
2689 OT_VECTEUR_3D r2(a11,a12,a13);
2690 double a21=inspnd1->get_z()-p->get_z();double a22=inspnd1->get_z()-inspnd2->get_z();double a23=inspnd1->get_z()-inspnd3->get_z();
2691 OT_VECTEUR_3D r3(a21,a22,a23);
2692 double a31=norm.get_x();double a32=inspnd1->get_x()-inspnd2->get_x();double a33=inspnd1->get_x()-inspnd3->get_x();
2693 OT_VECTEUR_3D d1(a31,a32,a33);
2694 OT_VECTEUR_3D d2((norm.get_y()),(inspnd1->get_y()-inspnd2->get_y()),(inspnd1->get_y()-inspnd3->get_y()));
2695 OT_VECTEUR_3D d3((norm.get_z()),(inspnd1->get_z()-inspnd2->get_z()),(inspnd1->get_z()-inspnd3->get_z()));
2696 
2697 OT_MATRICE_3D tr(r1,r2,r3);
2698 OT_MATRICE_3D td(d1,d2,d3);
2699 double detd=td.get_determinant();
2700 double detr=tr.get_determinant();
2701 double t=detr/detd;
2702 if (detd==0. || detr==0.) affiche((char*)"wrong ins point projection on the mesh");
2703 pproj[0]=p->get_x()+t*norm.get_x();
2704 pproj[1]=p->get_y()+t*norm.get_y();
2705 pproj[2]=p->get_z()+t*norm.get_z();
2706 MG_MAILLAGE_OUTILS tribas;
2707 int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
2708 int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
2709 int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
2710 int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
2711 
2712 
2713 
2714 
2715 if (insidtri==1)
2716 {
2717  //cout<<"insidtri==1"<<endl;
2718  MG_TRIANGLE* ndintri=insphertri;
2719  MG_SEGMENT* seg1=ndintri->get_segment1();
2720  MG_SEGMENT* seg2=ndintri->get_segment2();
2721  MG_SEGMENT* seg3=ndintri->get_segment3();
2722  MG_NOEUD* nd1=ndintri->get_noeud1();
2723  MG_NOEUD* nd2=ndintri->get_noeud2();
2724  MG_NOEUD* nd3=ndintri->get_noeud3();
2725 
2726  MG_TRIANGLE* trioth1;
2727  if (seg1->get_lien_triangle()->get(0)!=ndintri) trioth1=seg1->get_lien_triangle()->get(0);
2728  else if (seg1->get_lien_triangle()->get(1)!=ndintri) trioth1=seg1->get_lien_triangle()->get(1);
2729  double pinsphnb1=inshper_point(p,trioth1);
2730  if (pinsphnb1<=0.)
2731  {
2732  MG_NOEUD* othnd;
2733  if (trioth1->get_noeud1()!=seg1->get_noeud1() && trioth1->get_noeud1()!=seg1->get_noeud2()) othnd=trioth1->get_noeud1();
2734  else if (trioth1->get_noeud2()!=seg1->get_noeud1() && trioth1->get_noeud2()!=seg1->get_noeud2()) othnd=trioth1->get_noeud2();
2735  else if (trioth1->get_noeud3()!=seg1->get_noeud1() && trioth1->get_noeud3()!=seg1->get_noeud2()) othnd=trioth1->get_noeud3();
2736  double qual1=tq.qualite_triangle(p->get_coord(),seg1->get_noeud1()->get_coord(),othnd->get_coord());
2737  double qual2=tq.qualite_triangle(p->get_coord(),seg1->get_noeud2()->get_coord(),othnd->get_coord());
2738  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2739  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
2740  }
2741  else
2742  {
2743  double qual1=tq.qualite_triangle(p->get_coord(),seg1->get_noeud1()->get_coord(),seg1->get_noeud2()->get_coord());
2744  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2745  }
2746 
2747  MG_TRIANGLE* trioth2;
2748  if (seg2->get_lien_triangle()->get(0)!=ndintri) trioth2=seg2->get_lien_triangle()->get(0);
2749  else if (seg2->get_lien_triangle()->get(1)!=ndintri) trioth2=seg2->get_lien_triangle()->get(1);
2750  double pinsphnb2=inshper_point(p,trioth2);
2751  if (pinsphnb2<=0.)
2752  {
2753  MG_NOEUD* othnd;
2754  if (trioth2->get_noeud1()!=seg2->get_noeud1() && trioth2->get_noeud1()!=seg2->get_noeud2()) othnd=trioth2->get_noeud1();
2755  else if (trioth2->get_noeud2()!=seg2->get_noeud1() && trioth2->get_noeud2()!=seg2->get_noeud2()) othnd=trioth2->get_noeud2();
2756  else if (trioth2->get_noeud3()!=seg2->get_noeud1() && trioth2->get_noeud3()!=seg2->get_noeud2()) othnd=trioth2->get_noeud3();
2757  double qual1=tq.qualite_triangle(p->get_coord(),seg2->get_noeud1()->get_coord(),othnd->get_coord());
2758  double qual2=tq.qualite_triangle(p->get_coord(),seg2->get_noeud2()->get_coord(),othnd->get_coord());
2759  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2760  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
2761  }
2762  else
2763  {
2764  double qual1=tq.qualite_triangle(p->get_coord(),seg2->get_noeud1()->get_coord(),seg2->get_noeud2()->get_coord());
2765  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2766  }
2767 
2768  MG_TRIANGLE* trioth3;
2769  if (seg3->get_lien_triangle()->get(0)!=ndintri) trioth3=seg3->get_lien_triangle()->get(0);
2770  else if (seg3->get_lien_triangle()->get(1)!=ndintri) trioth3=seg3->get_lien_triangle()->get(1);
2771  double pinsphnb3=inshper_point(p,trioth3);
2772  if (pinsphnb3<=0.)
2773  {
2774  MG_NOEUD* othnd;
2775  if (trioth3->get_noeud1()!=seg3->get_noeud1() && trioth3->get_noeud1()!=seg3->get_noeud2()) othnd=trioth3->get_noeud1();
2776  else if (trioth3->get_noeud2()!=seg3->get_noeud1() && trioth3->get_noeud2()!=seg3->get_noeud2()) othnd=trioth3->get_noeud2();
2777  else if (trioth3->get_noeud3()!=seg3->get_noeud1() && trioth3->get_noeud3()!=seg3->get_noeud2()) othnd=trioth3->get_noeud3();
2778  double qual1=tq.qualite_triangle(p->get_coord(),seg3->get_noeud1()->get_coord(),othnd->get_coord());
2779  double qual2=tq.qualite_triangle(p->get_coord(),seg3->get_noeud2()->get_coord(),othnd->get_coord());
2780  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2781  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
2782  }
2783  else
2784  {
2785  double qual1=tq.qualite_triangle(p->get_coord(),seg3->get_noeud1()->get_coord(),seg3->get_noeud2()->get_coord());
2786  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
2787  }
2788 
2789 }
2790 
2791 if (onedge==1)
2792 {
2793  MG_TRIANGLE* ndontri=insphertri;
2794  MG_NOEUD* ndo1=ndontri->get_noeud1();
2795  MG_NOEUD* ndo2=ndontri->get_noeud2();
2796  MG_NOEUD* ndo3=ndontri->get_noeud3();
2797  int onvert1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET1);
2798  int onvert2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET2);
2799  int onvert3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET3);
2800  int onedge1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE1);
2801  int onedge2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE2);
2802  int onedge3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE3);
2803  if (onvert1==1 || onvert2==1 || onvert3==1)
2804  {
2805  MG_NOEUD* ond;
2806  if(onvert1==1)ond=ndo1;
2807  if(onvert2==1)ond=ndo2;
2808  if(onvert3==1)ond=ndo3;
2809  for(int iind=0;iind<ond->get_lien_triangle()->get_nb();iind++)
2810  {
2811  MG_TRIANGLE* trlie=ond->get_lien_triangle()->get(iind);
2812  MG_SEGMENT* trlieseg1=trlie->get_segment1();
2813  MG_SEGMENT* trlieseg2=trlie->get_segment2();
2814  MG_SEGMENT* trlieseg3=trlie->get_segment3();
2815  MG_SEGMENT* segchkk;
2816  if (trlieseg1->get_noeud1()!=ond && trlieseg1->get_noeud2()!=ond) segchkk=trlieseg1;
2817  else if (trlieseg2->get_noeud1()!=ond && trlieseg2->get_noeud2()!=ond) segchkk=trlieseg2;
2818  else if (trlieseg3->get_noeud1()!=ond && trlieseg3->get_noeud2()!=ond) segchkk=trlieseg3;
2819  MG_TRIANGLE* trioth;
2820  if(segchkk->get_lien_triangle()->get(0)!=trlie) trioth=segchkk->get_lien_triangle()->get(0);
2821  else if(segchkk->get_lien_triangle()->get(1)!=trlie) trioth=segchkk->get_lien_triangle()->get(1);
2822 
2823  double pinsphnb=inshper_point(p,trioth);
2824  if (pinsphnb<=0.)
2825  {
2826  MG_NOEUD* othnd;
2827  if (trioth->get_noeud1()!=segchkk->get_noeud1() && trioth->get_noeud1()!=segchkk->get_noeud2()) othnd=trioth->get_noeud1();
2828  else if (trioth->get_noeud2()!=segchkk->get_noeud1() && trioth->get_noeud2()!=segchkk->get_noeud2()) othnd=trioth->get_noeud2();
2829  else if (trioth->get_noeud3()!=segchkk->get_noeud1() && trioth->get_noeud3()!=segchkk->get_noeud2()) othnd=trioth->get_noeud3();
2830  double qual1=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud1()->get_coord(),othnd->get_coord());
2831  double qual2=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud2()->get_coord(),othnd->get_coord());
2832  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,trlie));
2833  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,trlie));
2834  }
2835  else
2836  {
2837  double qual1=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud1()->get_coord(),segchkk->get_noeud2()->get_coord());
2838  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,trlie));
2839  }
2840  }
2841  }
2842 
2843  else if(onedge1==1 || onedge2==1 || onedge3==1)
2844  {
2845  MG_TRIANGLE* ndontri=insphertri;
2846  MG_SEGMENT* onseg;
2847  if (onedge1==1)onseg=ndontri->get_segment1();
2848  if (onedge2==1)onseg=ndontri->get_segment2();
2849  if (onedge3==1)onseg=ndontri->get_segment3();
2850  TPL_MAP_ENTITE<MG_SEGMENT*> freesegs;
2851  for(int ifr=0;ifr<onseg->get_lien_triangle()->get_nb();ifr++)
2852  {
2853  MG_TRIANGLE* trfr=onseg->get_lien_triangle()->get(ifr);
2854  if (trfr->get_segment1()!=onseg) freesegs.ajouter(trfr->get_segment1());
2855  if (trfr->get_segment2()!=onseg) freesegs.ajouter(trfr->get_segment2());
2856  if (trfr->get_segment3()!=onseg) freesegs.ajouter(trfr->get_segment3());
2857  }
2858  TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itfr;
2859  for (MG_SEGMENT* segfre=freesegs.get_premier(itfr);segfre!=NULL;segfre=freesegs.get_suivant(itfr))
2860  {
2861  MG_TRIANGLE* trioth;
2862  if(segfre->get_lien_triangle()->get(0)==onseg->get_lien_triangle()->get(0) || segfre->get_lien_triangle()->get(0)==onseg->get_lien_triangle()->get(1))
2863  trioth=segfre->get_lien_triangle()->get(1);
2864  else if(segfre->get_lien_triangle()->get(1)==onseg->get_lien_triangle()->get(0) || segfre->get_lien_triangle()->get(1)==onseg->get_lien_triangle()->get(1))
2865  trioth=segfre->get_lien_triangle()->get(0);
2866  double pinsphnb=inshper_point(p,trioth);
2867  if (pinsphnb<=0.)
2868  {
2869  MG_NOEUD* othnd;
2870  if (trioth->get_noeud1()!=segfre->get_noeud1() && trioth->get_noeud1()!=segfre->get_noeud2()) othnd=trioth->get_noeud1();
2871  else if (trioth->get_noeud2()!=segfre->get_noeud1() && trioth->get_noeud2()!=segfre->get_noeud2()) othnd=trioth->get_noeud2();
2872  else if (trioth->get_noeud3()!=segfre->get_noeud1() && trioth->get_noeud3()!=segfre->get_noeud2()) othnd=trioth->get_noeud3();
2873  double qual1=tq.qualite_triangle(p->get_coord(),segfre->get_noeud1()->get_coord(),othnd->get_coord());
2874  double qual2=tq.qualite_triangle(p->get_coord(),segfre->get_noeud2()->get_coord(),othnd->get_coord());
2875  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
2876  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndontri));
2877  }
2878  else
2879  {
2880  double qual1=tq.qualite_triangle(p->get_coord(),segfre->get_noeud1()->get_coord(),segfre->get_noeud2()->get_coord());
2881  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
2882  }
2883 
2884  }
2885 
2886  }
2887 }
2888 
2889 }*/
2890 
2892 if (lstqualprxndfinal.size()>0 && proximityqual>delaunyinsqual)
2893 {
2894  std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
2895  stlproxnd_stlndinsert((*itlstqualprxndfinal).second,p,mai,octree,lstedges);
2896 }
2897 
2898 else
2899  delaunay_stlndinsert(p,mai,search_radius,octree);
2900  }
2901 /*
2902 int mgvolnb=geo->get_nb_mg_volume();
2903 MG_VOLUME* mgvol;
2904 for (int iv=0;iv<mai->get_mg_geometrie()->get_nb_mg_volume();iv++)
2905 {
2906  //MG_ELEMENT_TOPOLOGIQUE *top1=mai->get_mg_triangle(0)->get_lien_topologie();
2907  //MG_FACE *fac=(MG_FACE*)top1;
2908 
2909 if (fac->get_mg_coface(0)->get_coquille()->get_mg_volume()==mai->get_mg_geometrie()->get_mg_volume(iv))
2910  mgvol=mai->get_mg_geometrie()->get_mg_volume(iv);
2911 }
2912 MAILLEUR2D_OPTIMISATION opt(mai,nivopt);
2913 opt.optimise(mgvol);
2914 */
2915 
2916 
2917 }
2918  //stloctree.inserer(stloctrins);
2920 }
2922 {
2923  int verycloseee=0;
2924  int proxndiiadd=0;
2925  int delonnodiiadd=0;
2926  int removednodiadd=0;
2928  MG_GEOMETRIE* geo= new MG_GEOMETRIE((char*)"VIRTUALGEO");
2930  MG_MAILLAGE* mai;
2932 
2933  double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
2934  TPL_MAP_ENTITE<MG_NOEUD*> lstnoeud;
2935  LISTE_MG_NOEUD::iterator it;
2936 for (MG_NOEUD* no=mai->get_premier_noeud(it);no!=NULL;no=mai->get_suivant_noeud(it))
2937  {
2938  if (no->get_x()<xmin) xmin=no->get_x();
2939  if (no->get_y()<ymin) ymin=no->get_y();
2940  if (no->get_z()<zmin) zmin=no->get_z();
2941  if (no->get_x()>xmax) xmax=no->get_x();
2942  if (no->get_y()>ymax) ymax=no->get_y();
2943  if (no->get_z()>zmax) zmax=no->get_z();
2944  lstnoeud.ajouter(no);
2945  }
2946  OT_VECTEUR_3D vecmin(xmin,ymin,zmin);
2947  OT_VECTEUR_3D vecmax(xmax,ymax,zmax);
2948  OT_VECTEUR_3D lengthvec(vecmin,vecmax);
2949  double search_radius=0.001*(lengthvec.get_longueur());
2950  //char bboxdiag[1000];
2951  //sprintf(bboxdiag,"the bounding box diagonal is: %lf , and the neighborhood search radius is: %lf ",vec.get_longueur(),search_radius);
2952  //affiche((char*) bboxdiag);
2953  OT_VECTEUR_3D average=(vecmin+vecmax)/2.;
2954  double length=sqrt(lengthvec*lengthvec);
2955  double bxr=1.1;
2956  xmin=average.get_x()-(length*bxr);ymin=average.get_y()-(length*bxr);zmin=average.get_z()-(length*bxr);
2957  xmax=average.get_x()+(length*bxr);ymax=average.get_y()+(length*bxr);zmax=average.get_z()+(length*bxr);
2958 
2960  stloctree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2962  octree.initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
2963  LISTE_MG_TRIANGLE::iterator itoctrins;
2964  for (MG_TRIANGLE* octrins=mai->get_premier_triangle(itoctrins);octrins!=NULL;octrins=mai->get_suivant_triangle(itoctrins))
2965  {
2966  octree.inserer(octrins);
2967  stloctree.inserer(octrins);
2968  }
2969 
2970 double prop=0.001;
2971 std::map<MG_NOEUD*,double*> pins;
2972 FILE *in=fopen(fichierinspoint,"rt");
2973 if (in==NULL) affiche((char*) "file is not available");
2974 while (!feof(in))
2975 {
2976  char chaine[500];
2977  char* res=fgets(chaine,500,in);
2978  if(res!=NULL)
2979  {
2980  double x,y,z;
2981  double q1,q2,q3;
2982  int nb=sscanf(chaine,"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
2983  q1=prop*q1;
2984  q2=prop*q2;
2985  q3=prop*q3;
2986  if (nb!=-1 && nb!=6) affiche((char*)"Wrong file format");
2987  else if (nb==6)
2988  {
2989  int insp_exist=0;
2990  TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri_tstpexist;
2991  int tstpexistnb=lstneitri_tstpexist.get_nb();
2992  while(tstpexistnb==0)
2993 {
2994  octree.rechercher(x,y,z,3.*search_radius,lstneitri_tstpexist);
2995  tstpexistnb=lstneitri_tstpexist.get_nb();
2996  search_radius=search_radius+0.1*search_radius;
2997 }
2998 
2999 TPL_MAP_ENTITE<MG_NOEUD*> lstneinodins;
3000 double epsilon=0.000001;
3002 for (MG_TRIANGLE* tri_tstpexist=lstneitri_tstpexist.get_premier(itst_pexist);tri_tstpexist!=NULL;tri_tstpexist=lstneitri_tstpexist.get_suivant(itst_pexist))
3003 {
3004  lstneinodins.ajouter(tri_tstpexist->get_noeud1());
3005  lstneinodins.ajouter(tri_tstpexist->get_noeud2());
3006  lstneinodins.ajouter(tri_tstpexist->get_noeud3());
3007 }
3009 for (MG_NOEUD* ndaround=lstneinodins.get_premier(itlstneinodins);ndaround!=NULL;ndaround=lstneinodins.get_suivant(itlstneinodins))
3010  {
3011  int sgltop=0;
3013  for(int igtls=0;igtls<ndaround->get_lien_segment()->get_nb();igtls++)
3014  ndgls.ajouter(ndaround->get_lien_segment()->get(igtls));
3016  for(MG_SEGMENT* sgtls=ndgls.get_premier(itndgls);sgtls!=NULL;sgtls=ndgls.get_suivant(itndgls))
3017  {
3018  if(sgtls->get_lien_topologie()->get_dimension()<2)
3019  sgltop++;
3020  }
3021 
3022  if(ndaround->get_x()<x+epsilon && ndaround->get_x()>x-epsilon)
3023  if(ndaround->get_y()<y+epsilon && ndaround->get_y()>y-epsilon)
3024  if(ndaround->get_z()<z+epsilon && ndaround->get_z()>z-epsilon)
3025  if(ndaround->get_lien_topologie()->get_dimension()<2 || sgltop>0)
3026  {
3027 
3028  insp_exist++;
3029 
3030  //MG_GEOMETRIE* geo=gest->get_mg_geometrie(0);
3031  //class MG_SOMMET_NOEUD* somno=mai->get_mg_geometrie()->ajouter_mg_sommet_noeud(tri_tstpexist->get_noeud1());
3032  class MG_SOMMET_NOEUD* somno=geo->ajouter_mg_sommet_noeud(ndaround);
3033  //class MG_SOMMET_NOEUD* ajouter_mg_sommet_noeud(MG_NOEUD *noeud);
3034 
3035  somno->ajouter_ccf((char*)"Dx",q1);
3036  somno->ajouter_ccf((char*)"Dy",q2);
3037  somno->ajouter_ccf((char*)"Dz",q3);
3038  verycloseee++;
3039  }
3040  }
3041 
3042  if (insp_exist==0)
3043 {
3045  double* bc=new double[3];
3046  bc[0]=q1; bc[1]=q2; bc[2]=q3;
3047  pins.insert(std::pair<MG_NOEUD*,double*> (p,bc));
3048 }
3049  }
3050 
3051  }
3052 }
3053 fclose(in);
3054 /*
3055 for(map<MG_NOEUD*,double*>::iterator itpins=pins.begin();itpins!=pins.end();itpins++)
3056 {
3057  int sameinsnd_meshnd=0;
3058  double proximityqual;
3059  double delaunyinsqual;
3060  std::multimap<double,MG_NOEUD*,std::greater<double> > lstqualprxndfinal;
3061  MG_MAILLAGE_OUTILS tq;
3062  MG_NOEUD* p=(*itpins).first;
3063  MG_ELEMENT_TOPOLOGIQUE *top;
3064  TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri1;
3065  int neitrinb1=lstneitri1.get_nb();
3066  while(neitrinb1==0)
3067 {
3068  octree.rechercher(p->get_x(),p->get_y(),p->get_z(),25.*search_radius,lstneitri1);
3069  neitrinb1=lstneitri1.get_nb();
3070  search_radius=search_radius+0.1*search_radius;
3071 }
3072 
3073  //check for the point proximity to any tri point
3074 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it01; //can be merged with the delaunay insertion method
3075 TPL_MAP_ENTITE<MG_NOEUD*> proxtrind;
3076 for (MG_TRIANGLE* tri01=lstneitri1.get_premier(it01);tri01!=NULL;tri01=lstneitri1.get_suivant(it01))
3077  {
3078  MG_NOEUD* dpnd1=tri01->get_noeud1();
3079  MG_NOEUD* dpnd2=tri01->get_noeud2();
3080  MG_NOEUD* dpnd3=tri01->get_noeud3();
3081  proxtrind.ajouter(dpnd1);
3082  proxtrind.ajouter(dpnd2);
3083  proxtrind.ajouter(dpnd3);
3084  }
3085 std::multimap< double, MG_NOEUD* , std::less<double> > lstdisproxnde;
3086 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR itprnde;
3087 for(MG_NOEUD* prnde=proxtrind.get_premier(itprnde);prnde!=NULL;prnde=proxtrind.get_suivant(itprnde))
3088 {
3089  //if (prnde->get_x()==p->get_x() && prnde->get_y()==p->get_y() && prnde->get_z()==p->get_z())
3090  {
3091  //top=prnde->get_lien_topologie();
3092  //stlproxnd_stlndinsert(prnde,p,mai,octree,lstedges);
3093  //sameinsnd_meshnd=sameinsnd_meshnd+1;
3094  //cout<<"the same node as insertion"<<endl;
3095  //break;
3096  }
3097  //else
3098  {
3099  double dp=sqrt(pow((p->get_x()-prnde->get_x()),2)+pow((p->get_y()-prnde->get_y()),2)+pow((p->get_z()-prnde->get_z()),2));
3100  lstdisproxnde.insert(pair<double, MG_NOEUD*> (dp,prnde));
3101  }
3102 }
3103 if( sameinsnd_meshnd==0)
3104  {
3105 std::multimap< double, MG_NOEUD* , std::less<double> >::iterator itlstdprnd=lstdisproxnde.begin();
3106 double mindis=(*itlstdprnd).first;
3107 TPL_LISTE_ENTITE<MG_NOEUD*> lstprnds;
3108 double distelorance=1.1;
3109 
3110 for (itlstdprnd=lstdisproxnde.begin();itlstdprnd!=lstdisproxnde.end();itlstdprnd++)
3111 {
3112  if ((*itlstdprnd).first<(distelorance*mindis)) lstprnds.ajouter((*itlstdprnd).second);
3113 }
3114 
3115 std::multimap<double,MG_NOEUD*,std::less<double> > lstqualtri;
3116 for(int ilpn=0;ilpn<lstprnds.get_nb();ilpn++)
3117 {
3118  MG_NOEUD* proxnd=lstprnds.get(ilpn);
3119  if(proxnd->get_x()==p->get_x() && proxnd->get_y()==p->get_y() && proxnd->get_z()==p->get_z())
3120  cout<<"proxinod is the same as insertion node"<<endl;
3121 
3122  // int checkisinspoint=0;
3123 
3124  //for(int ipins1=0;ipins1<pins.get_nb();ipins1++ )
3125  {
3126  //MG_NOEUD* checknotinspoint=pins.get(ipins1);
3127  //if (checknotinspoint==proxnd) checkisinspoint=checkisinspoint+1; //cout<<"checknotinspoint==proxnd"<<endl;}
3128  }
3129  //cout<<"checkisinspoint= "<<checkisinspoint<<endl;
3130  //if (checkisinspoint==0)
3131  {
3132  //cout<<"INSIDE INSIDE *********************the insertion point is inside triangleee"<<endl;
3133  //this should be checked dddddddddddddddddddd !!!!!!!!!!!!!!!!!!!!!!!!!!!!!! /////////////////////// IF WITHOUT GEOMETRYYYYYYYYYYYYYYYYYYYY
3134  int edgechk=0;
3135 TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itlstedges;
3136 for (MG_SEGMENT* segedg=lstedges.get_premier(itlstedges);segedg!=NULL;segedg=lstedges.get_suivant(itlstedges))
3137 {
3138  if (proxnd==segedg->get_noeud1() ||proxnd==segedg->get_noeud2())
3139  edgechk++;
3140 }
3141 if(edgechk==0)
3142  {
3143  for(int iptr=0;iptr<proxnd->get_lien_triangle()->get_nb();iptr++)
3144  {
3145  MG_TRIANGLE* prli=proxnd->get_lien_triangle()->get(iptr);
3146  MG_SEGMENT* prliseg1=prli->get_segment1(); MG_NOEUD* prliseg1nd1=prliseg1->get_noeud1(); MG_NOEUD* prliseg1nd2=prliseg1->get_noeud2();
3147  MG_SEGMENT* prliseg2=prli->get_segment2(); MG_NOEUD* prliseg2nd1=prliseg2->get_noeud1(); MG_NOEUD* prliseg2nd2=prliseg2->get_noeud2();
3148  MG_SEGMENT* prliseg3=prli->get_segment3(); MG_NOEUD* prliseg3nd1=prliseg3->get_noeud1(); MG_NOEUD* prliseg3nd2=prliseg3->get_noeud2();
3149  MG_NOEUD* prlind1=prli->get_noeud1();
3150  MG_NOEUD* prlind2=prli->get_noeud2();
3151  MG_NOEUD* prlind3=prli->get_noeud3();
3152  MG_SEGMENT* sgchk;
3153  if(proxnd!=prliseg1nd1 && proxnd!=prliseg1nd2) sgchk=prliseg1;
3154  if(proxnd!=prliseg2nd1 && proxnd!=prliseg2nd2) sgchk=prliseg2;
3155  if(proxnd!=prliseg3nd1 && proxnd!=prliseg3nd2) sgchk=prliseg3;
3156 
3157  if(sgchk->get_lien_triangle()->get_nb()>1) //for open face check
3158  {
3159  MG_TRIANGLE* othertriangle;
3160  if(sgchk->get_lien_triangle()->get(0)!=prli) othertriangle=sgchk->get_lien_triangle()->get(0);
3161  else if(sgchk->get_lien_triangle()->get(1)!=prli) othertriangle=sgchk->get_lien_triangle()->get(1);
3162  double insph_swap_chk=inshper_point(p,othertriangle);
3163  MG_NOEUD* trimateothernd;
3164  if(othertriangle->get_noeud1()!=sgchk->get_noeud1() && othertriangle->get_noeud1()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud1();
3165  else if(othertriangle->get_noeud2()!=sgchk->get_noeud1() && othertriangle->get_noeud2()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud2();
3166  else if(othertriangle->get_noeud3()!=sgchk->get_noeud1() && othertriangle->get_noeud3()!=sgchk->get_noeud2()) trimateothernd=othertriangle->get_noeud3();
3167 
3168  if(prlind1==proxnd)
3169  {
3170  if(insph_swap_chk<=0)
3171  {
3172  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),trimateothernd->get_coord());
3173  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud3()->get_coord(),trimateothernd->get_coord());
3174  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual1,proxnd));
3175  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual2,proxnd));
3176  }
3177  else
3178  {
3179  double tqual=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),prli->get_noeud3()->get_coord());
3180  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3181  }
3182  }
3183 
3184  else if(prlind2==proxnd)
3185  {
3186  if(insph_swap_chk<=0)
3187  {
3188  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud1()->get_coord(),trimateothernd->get_coord());
3189  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud3()->get_coord(),trimateothernd->get_coord());
3190  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual1,proxnd));
3191  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual2,proxnd));
3192  }
3193  else
3194  {
3195  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),p->get_coord(),prli->get_noeud3()->get_coord());
3196  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3197  }
3198  }
3199  else if(prlind3==proxnd)
3200  {
3201  if(insph_swap_chk<=0)
3202  {
3203  double tqual1=tq.qualite_triangle(p->get_coord(),prli->get_noeud1()->get_coord(),trimateothernd->get_coord());
3204  double tqual2=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),trimateothernd->get_coord());
3205  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual1,proxnd));
3206  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual2,proxnd));
3207  }
3208  else
3209  {
3210  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),prli->get_noeud2()->get_coord(),p->get_coord());
3211  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3212  }
3213  }
3214  }
3215 
3216  else
3217  {
3218  if(prlind1==proxnd)
3219  {
3220  double tqual=tq.qualite_triangle(p->get_coord(),prli->get_noeud2()->get_coord(),prli->get_noeud3()->get_coord());
3221  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3222  }
3223  if(prlind2==proxnd)
3224  {
3225  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),p->get_coord(),prli->get_noeud3()->get_coord());
3226  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3227  }
3228  if(prlind3==proxnd)
3229  {
3230  double tqual=tq.qualite_triangle(prli->get_noeud1()->get_coord(),prli->get_noeud2()->get_coord(),p->get_coord());
3231  lstqualtri.insert(pair<double,MG_NOEUD*>(tqual,proxnd));
3232  }
3233 
3234 
3235  }
3236 
3237  }
3238 
3239  std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itlstqualtri=lstqualtri.begin();
3240  lstqualprxndfinal.insert(pair<double,MG_NOEUD*>((*itlstqualtri).first,(*itlstqualtri).second));
3241  }
3242 
3243  }
3244 }
3245 if (lstqualprxndfinal.size()==0) proximityqual=0.;
3246 else
3247 {
3248 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
3249  proximityqual=(*itlstqualprxndfinal).first;
3250 }
3251 
3252 std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
3253 
3254 TPL_MAP_ENTITE<MG_TRIANGLE*> lstneitri;
3255 int neitrinb=lstneitri.get_nb();
3256 while(neitrinb==0)
3257 {
3258  octree.rechercher(p->get_x(),p->get_y(),p->get_z(),search_radius,lstneitri);
3259  neitrinb=lstneitri.get_nb();
3260  search_radius=search_radius+0.01*search_radius;
3261 }
3262 TPL_MAP_ENTITE<MG_TRIANGLE*> insphtri;
3263 TPL_MAP_ENTITE< MG_NOEUD*> lstneighbornds;
3264 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR it1;
3265 for (MG_TRIANGLE* tri1=lstneitri.get_premier(it1);tri1!=NULL;tri1=lstneitri.get_suivant(it1))
3266  {
3267  lstneighbornds.ajouter(tri1->get_noeud1());
3268  lstneighbornds.ajouter(tri1->get_noeud2());
3269  lstneighbornds.ajouter(tri1->get_noeud3());
3270  double insphchk=inshper_point(p,tri1);
3271  if (insphchk<=0.) insphtri.ajouter(tri1);
3272  }
3273 OT_VECTEUR_3D normale(0.,0.,0.);
3274 TPL_MAP_ENTITE<MG_NOEUD*>::ITERATEUR it02;
3275 for (MG_NOEUD* nornd=lstneighbornds.get_premier(it02);nornd!=NULL;nornd=lstneighbornds.get_suivant(it02))
3276  {
3277  OT_VECTEUR_3D lngpnornd(p->get_coord(),nornd->get_coord());double lengpnornd=lngpnornd.get_longueur();
3278  OT_VECTEUR_3D norm=discrete_norm(nornd);
3279  norm=lengpnornd*norm;
3280  normale=normale+norm;
3281  }
3282 
3283 TPL_MAP_ENTITE<MG_SEGMENT*> segbase;
3284 TPL_MAP_ENTITE<MG_TRIANGLE*> basetri;
3285 double pproj[3];
3286 TPL_MAP_ENTITE<MG_TRIANGLE*>::ITERATEUR inspi;
3287 for (MG_TRIANGLE* insphertri=insphtri.get_premier(inspi);insphertri!=NULL;insphertri=insphtri.get_suivant(inspi))
3288 {
3289 MG_NOEUD* inspnd1=insphertri->get_noeud1();
3290 MG_NOEUD* inspnd2=insphertri->get_noeud2();
3291 MG_NOEUD* inspnd3=insphertri->get_noeud3();
3292 OT_VECTEUR_3D norm=normale;
3293 
3294 OT_VECTEUR_3D r1((-p->get_x()),(inspnd2->get_x()-inspnd1->get_x()),(inspnd3->get_x()-inspnd1->get_x()));
3295 OT_VECTEUR_3D r2((-p->get_y()),(inspnd2->get_y()-inspnd1->get_y()),(inspnd3->get_y()-inspnd1->get_y()));
3296 OT_VECTEUR_3D r3((-p->get_z()),(inspnd2->get_z()-inspnd1->get_z()),(inspnd3->get_z()-inspnd1->get_z()));
3297 OT_VECTEUR_3D d1((norm.get_x()),(inspnd2->get_x()-inspnd1->get_x()),(inspnd3->get_x()-inspnd1->get_x()));
3298 OT_VECTEUR_3D d2((norm.get_y()),(inspnd2->get_y()-inspnd1->get_y()),(inspnd3->get_y()-inspnd1->get_y()));
3299 OT_VECTEUR_3D d3((norm.get_z()),(inspnd2->get_z()-inspnd1->get_z()),(inspnd3->get_z()-inspnd1->get_z()));
3300 
3301 OT_MATRICE_3D tr(r1,r2,r3);
3302 OT_MATRICE_3D td(d1,d2,d3);
3303 double detd=td.get_determinant();
3304 double detr=tr.get_determinant();
3305 if (detd==0.)// || detr==0.)
3306 {
3307  //cout<<"wrong ins point projection on the mesh"<<endl;
3308 
3309 }
3310 if (detd!=0.)
3311 {
3312 double t=detr/detd;
3313 pproj[0]=p->get_x()+t*norm.get_x();
3314 pproj[1]=p->get_y()+t*norm.get_y();
3315 pproj[2]=p->get_z()+t*norm.get_z();
3316 MG_MAILLAGE_OUTILS tribas;
3317 int tribasval=tribas.estdansletriangle(insphertri,pproj[0],pproj[1],pproj[2]);
3318 int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
3319 int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
3320 int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
3321 
3322 
3323 if (insidtri==1)
3324 {
3325  //cout<<"before delaunay INSIDE INSIDE *********************the insertion point is inside triangleee"<<endl;
3326  MG_TRIANGLE* ndintri=insphertri;
3327  MG_SEGMENT* seg1=ndintri->get_segment1();
3328  MG_SEGMENT* seg2=ndintri->get_segment2();
3329  MG_SEGMENT* seg3=ndintri->get_segment3();
3330 
3331  if(seg1->get_lien_triangle()->get_nb()>1)
3332  {
3333  MG_TRIANGLE* trioth1;
3334  if (seg1->get_lien_triangle()->get(0)!=ndintri) trioth1=seg1->get_lien_triangle()->get(0);
3335  else if (seg1->get_lien_triangle()->get(1)!=ndintri) trioth1=seg1->get_lien_triangle()->get(1);
3336  double pinsphnb1=inshper_point(p,trioth1);
3337  if (pinsphnb1<=0. && seg1->get_lien_topologie()->get_dimension()>1)
3338  {
3339  MG_NOEUD* othnd;
3340  if (trioth1->get_noeud1()!=seg1->get_noeud1() && trioth1->get_noeud1()!=seg1->get_noeud2()) othnd=trioth1->get_noeud1();
3341  else if (trioth1->get_noeud2()!=seg1->get_noeud1() && trioth1->get_noeud2()!=seg1->get_noeud2()) othnd=trioth1->get_noeud2();
3342  else if (trioth1->get_noeud3()!=seg1->get_noeud1() && trioth1->get_noeud3()!=seg1->get_noeud2()) othnd=trioth1->get_noeud3();
3343  double qual1=tq.qualite_triangle(p->get_coord(),seg1->get_noeud1()->get_coord(),othnd->get_coord());
3344  double qual2=tq.qualite_triangle(p->get_coord(),seg1->get_noeud2()->get_coord(),othnd->get_coord());
3345  cout<<" qual1= "<<qual1;
3346  cout<<" qual2= "<<qual2;
3347  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3348  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
3349  }
3350  else
3351  {
3352  double qual1=tq.qualite_triangle(p->get_coord(),seg1->get_noeud1()->get_coord(),seg1->get_noeud2()->get_coord());
3353  cout<<" qual1= "<<qual1;
3354  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3355  }
3356  }
3357 else
3358 {
3359  double qual1=tq.qualite_triangle(p->get_coord(),seg1->get_noeud1()->get_coord(),seg1->get_noeud2()->get_coord());
3360  cout<<" qual1= "<<qual1;
3361  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3362 }
3363 
3364  if(seg2->get_lien_triangle()->get_nb()>1)
3365  {
3366  MG_TRIANGLE* trioth2;
3367  if (seg2->get_lien_triangle()->get(0)!=ndintri) trioth2=seg2->get_lien_triangle()->get(0);
3368  else if (seg2->get_lien_triangle()->get(1)!=ndintri) trioth2=seg2->get_lien_triangle()->get(1);
3369  double pinsphnb2=inshper_point(p,trioth2);
3370  if (pinsphnb2<=0. && seg2->get_lien_topologie()->get_dimension()>1)
3371  {
3372  MG_NOEUD* othnd;
3373  if (trioth2->get_noeud1()!=seg2->get_noeud1() && trioth2->get_noeud1()!=seg2->get_noeud2()) othnd=trioth2->get_noeud1();
3374  else if (trioth2->get_noeud2()!=seg2->get_noeud1() && trioth2->get_noeud2()!=seg2->get_noeud2()) othnd=trioth2->get_noeud2();
3375  else if (trioth2->get_noeud3()!=seg2->get_noeud1() && trioth2->get_noeud3()!=seg2->get_noeud2()) othnd=trioth2->get_noeud3();
3376  double qual1=tq.qualite_triangle(p->get_coord(),seg2->get_noeud1()->get_coord(),othnd->get_coord());
3377  double qual2=tq.qualite_triangle(p->get_coord(),seg2->get_noeud2()->get_coord(),othnd->get_coord());
3378  cout<<" qual1= "<<qual1;
3379  cout<<" qual2= "<<qual2;
3380  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3381  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
3382  }
3383  else
3384  {
3385  double qual1=tq.qualite_triangle(p->get_coord(),seg2->get_noeud1()->get_coord(),seg2->get_noeud2()->get_coord());
3386  cout<<" qual1= "<<qual1;
3387  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3388  }
3389  }
3390  else
3391  {
3392  double qual1=tq.qualite_triangle(p->get_coord(),seg2->get_noeud1()->get_coord(),seg2->get_noeud2()->get_coord());
3393  cout<<" qual1= "<<qual1;
3394  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3395  }
3396 
3397  if(seg3->get_lien_triangle()->get_nb()>1)
3398  {
3399  MG_TRIANGLE* trioth3;
3400  if (seg3->get_lien_triangle()->get(0)!=ndintri) trioth3=seg3->get_lien_triangle()->get(0);
3401  else if (seg3->get_lien_triangle()->get(1)!=ndintri) trioth3=seg3->get_lien_triangle()->get(1);
3402  double pinsphnb3=inshper_point(p,trioth3);
3403  if (pinsphnb3<=0. && seg3->get_lien_topologie()->get_dimension()>1)
3404  {
3405  MG_NOEUD* othnd;
3406  if (trioth3->get_noeud1()!=seg3->get_noeud1() && trioth3->get_noeud1()!=seg3->get_noeud2()) othnd=trioth3->get_noeud1();
3407  else if (trioth3->get_noeud2()!=seg3->get_noeud1() && trioth3->get_noeud2()!=seg3->get_noeud2()) othnd=trioth3->get_noeud2();
3408  else if (trioth3->get_noeud3()!=seg3->get_noeud1() && trioth3->get_noeud3()!=seg3->get_noeud2()) othnd=trioth3->get_noeud3();
3409  double qual1=tq.qualite_triangle(p->get_coord(),seg3->get_noeud1()->get_coord(),othnd->get_coord());
3410  double qual2=tq.qualite_triangle(p->get_coord(),seg3->get_noeud2()->get_coord(),othnd->get_coord());
3411  cout<<" qual1= "<<qual1;
3412  cout<<" qual2= "<<qual2;
3413  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3414  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndintri));
3415  }
3416  else
3417  {
3418  double qual1=tq.qualite_triangle(p->get_coord(),seg3->get_noeud1()->get_coord(),seg3->get_noeud2()->get_coord());
3419  cout<<" qual1= "<<qual1;
3420  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3421  }
3422  }
3423  else
3424  {
3425  double qual1=tq.qualite_triangle(p->get_coord(),seg3->get_noeud1()->get_coord(),seg3->get_noeud2()->get_coord());
3426  cout<<" qual1= "<<qual1;
3427  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndintri));
3428  }
3429 }
3430 
3431 else if (onedge==1)
3432 {
3433  MG_TRIANGLE* ndontri=insphertri;
3434  MG_NOEUD* ndo1=ndontri->get_noeud1();
3435  MG_NOEUD* ndo2=ndontri->get_noeud2();
3436  MG_NOEUD* ndo3=ndontri->get_noeud3();
3437  int onvert1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET1);
3438  int onvert2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET2);
3439  int onvert3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET3);
3440  int onedge1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE1);
3441  int onedge2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE2);
3442  int onedge3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE3);
3443  if (onvert1==1 || onvert2==1 || onvert3==1)
3444  {
3445  //cout<<"ON vertex ON vertex *********************the insertion point is on the verteces of triangleee"<<endl;
3446  MG_NOEUD* ond;
3447  if(onvert1==1)ond=ndo1;
3448  if(onvert2==1)ond=ndo2;
3449  if(onvert3==1)ond=ndo3;
3450  for(int iind=0;iind<ond->get_lien_triangle()->get_nb();iind++)
3451  {
3452  MG_TRIANGLE* trlie=ond->get_lien_triangle()->get(iind);
3453  MG_SEGMENT* trlieseg1=trlie->get_segment1();
3454  MG_SEGMENT* trlieseg2=trlie->get_segment2();
3455  MG_SEGMENT* trlieseg3=trlie->get_segment3();
3456  MG_SEGMENT* segchkk;
3457  if (trlieseg1->get_noeud1()!=ond && trlieseg1->get_noeud2()!=ond) segchkk=trlieseg1;
3458  else if (trlieseg2->get_noeud1()!=ond && trlieseg2->get_noeud2()!=ond) segchkk=trlieseg2;
3459  else if (trlieseg3->get_noeud1()!=ond && trlieseg3->get_noeud2()!=ond) segchkk=trlieseg3;
3460 
3461  if(segchkk->get_lien_triangle()->get_nb()>1)
3462  {
3463  MG_TRIANGLE* trioth;
3464  if(segchkk->get_lien_triangle()->get(0)!=trlie) trioth=segchkk->get_lien_triangle()->get(0);
3465  else if(segchkk->get_lien_triangle()->get(1)!=trlie) trioth=segchkk->get_lien_triangle()->get(1);
3466 
3467  double pinsphnb=inshper_point(p,trioth);
3468  if (pinsphnb<=0.)
3469  {
3470  MG_NOEUD* othnd;
3471  if (trioth->get_noeud1()!=segchkk->get_noeud1() && trioth->get_noeud1()!=segchkk->get_noeud2()) othnd=trioth->get_noeud1();
3472  else if (trioth->get_noeud2()!=segchkk->get_noeud1() && trioth->get_noeud2()!=segchkk->get_noeud2()) othnd=trioth->get_noeud2();
3473  else if (trioth->get_noeud3()!=segchkk->get_noeud1() && trioth->get_noeud3()!=segchkk->get_noeud2()) othnd=trioth->get_noeud3();
3474  double qual1=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud1()->get_coord(),othnd->get_coord());
3475  double qual2=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud2()->get_coord(),othnd->get_coord());
3476  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,trlie));
3477  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,trlie));
3478  }
3479  else
3480  {
3481  double qual1=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud1()->get_coord(),segchkk->get_noeud2()->get_coord());
3482  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,trlie));
3483  }
3484 
3485  }
3486  else if(segchkk->get_lien_triangle()->get_nb()==1)
3487  {
3488  double qual1=tq.qualite_triangle(p->get_coord(),segchkk->get_noeud1()->get_coord(),segchkk->get_noeud2()->get_coord());
3489  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,trlie));
3490  }
3491 
3492  }
3493  }
3494 
3495  else if(onedge1==1 || onedge2==1 || onedge3==1)
3496  {
3497  //cout<<"before delaunayEDGE EDGE*********************the insertion point is on the edge of triangleee"<<endl;
3498  MG_TRIANGLE* ndontri=insphertri;
3499  MG_SEGMENT* onseg;
3500  if (onedge1==1) onseg=ndontri->get_segment1();//cout<<"onseg=ndontri->get_segment1()"<<endl;}
3501  if (onedge2==1) onseg=ndontri->get_segment2();//cout<<"onseg=ndontri->get_segment2()"<<endl;}
3502  if (onedge3==1) onseg=ndontri->get_segment3();//cout<<"onseg=ndontri->get_segment3()"<<endl;}
3503  TPL_MAP_ENTITE<MG_SEGMENT*> freesegs;
3504  //cout<<"onseg->get_lien_triangle()->get_nb()= "<<onseg->get_lien_triangle()->get_nb()<<endl;
3505  for(int ifr=0;ifr<onseg->get_lien_triangle()->get_nb();ifr++)
3506  {
3507  MG_TRIANGLE* trfr=onseg->get_lien_triangle()->get(ifr);
3508  if (trfr->get_segment1()!=onseg) freesegs.ajouter(trfr->get_segment1());
3509  if (trfr->get_segment2()!=onseg) freesegs.ajouter(trfr->get_segment2());
3510  if (trfr->get_segment3()!=onseg) freesegs.ajouter(trfr->get_segment3());
3511  }
3512  TPL_MAP_ENTITE<MG_SEGMENT*>::ITERATEUR itfr;
3513  for (MG_SEGMENT* segfre=freesegs.get_premier(itfr);segfre!=NULL;segfre=freesegs.get_suivant(itfr))
3514  {
3515  if(segfre->get_lien_triangle()->get_nb()>1)
3516  {
3517  MG_TRIANGLE* trioth;
3518  if(segfre->get_lien_triangle()->get(0)==onseg->get_lien_triangle()->get(0) || segfre->get_lien_triangle()->get(0)==onseg->get_lien_triangle()->get(1))
3519  trioth=segfre->get_lien_triangle()->get(1);
3520  else if(segfre->get_lien_triangle()->get(1)==onseg->get_lien_triangle()->get(0) || segfre->get_lien_triangle()->get(1)==onseg->get_lien_triangle()->get(1))
3521  trioth=segfre->get_lien_triangle()->get(0);
3522  double pinsphnb=inshper_point(p,trioth);
3523  if (pinsphnb<=0. && segfre->get_lien_topologie()->get_dimension()>1)
3524  {
3525  MG_NOEUD* othnd;
3526  if (trioth->get_noeud1()!=segfre->get_noeud1() && trioth->get_noeud1()!=segfre->get_noeud2()) othnd=trioth->get_noeud1();
3527  else if (trioth->get_noeud2()!=segfre->get_noeud1() && trioth->get_noeud2()!=segfre->get_noeud2()) othnd=trioth->get_noeud2();
3528  else if (trioth->get_noeud3()!=segfre->get_noeud1() && trioth->get_noeud3()!=segfre->get_noeud2()) othnd=trioth->get_noeud3();
3529  double qual1=tq.qualite_triangle(p->get_coord(),segfre->get_noeud1()->get_coord(),othnd->get_coord());
3530  double qual2=tq.qualite_triangle(p->get_coord(),segfre->get_noeud2()->get_coord(),othnd->get_coord());
3531  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
3532  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual2,ndontri));
3533  }
3534  else
3535  {
3536  double qual1=tq.qualite_triangle(p->get_coord(),segfre->get_noeud1()->get_coord(),segfre->get_noeud2()->get_coord());
3537  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
3538  }
3539  }
3540  else
3541  {
3542  double qual1=tq.qualite_triangle(p->get_coord(),segfre->get_noeud1()->get_coord(),segfre->get_noeud2()->get_coord());
3543  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
3544  }
3545 
3546  }
3547 
3548  }
3549 
3550  else if (onvert1==1 ||onvert2==1 || onvert3==1)
3551  {
3552  double qual1=0.;
3553  delinsqualtri.insert(pair<double,MG_TRIANGLE*>(qual1,ndontri));
3554  }
3555 }
3556 }
3557 }
3558 std::multimap<double,MG_TRIANGLE*,std::less<double> > :: iterator itdelinsqualtri=delinsqualtri.begin();
3559 double delaunyinsqual=(*itdelinsqualtri).first;
3561 if (lstqualprxndfinal.size()>0 && proximityqual>delaunyinsqual)
3562 {
3563  cout<<"stlproxnd_stlndinsert((*itlstqualprxndfinal).second,p,mai,octree,lstedges);"<<endl;
3564  //class MG_SOMMET_NOEUD* somno=geo->ajouter_mg_sommet_noeud(p);
3565  //cout<<"p->get_x()= "<<p->get_x()<<"p->get_y()= "<<p->get_y()<<"p->get_z()= "<<p->get_z()<<endl;
3566  //cout<<"((*itpins).second)[0]= "<<((*itpins).second)[0]<<endl;
3567  //somno->ajouter_ccf((char*)"Dx",((*itpins).second)[0]);
3568  //somno->ajouter_ccf((char*)"Dy",((*itpins).second)[1]);
3569  //somno->ajouter_ccf((char*)"Dz",((*itpins).second)[2]);
3570  std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
3571  stlproxnd_stlndinsert((*itlstqualprxndfinal).second,p,mai,octree,lstedges);
3572 }
3573 else if (delaunyinsqual>0.2)
3574 {
3575 
3576 }
3577 else
3578  mai->supprimer_mg_noeudid(p->get_id());
3579 
3580  }
3581 }
3582 */
3583 /*
3584 LISTE_MG_TRIANGLE::iterator itoctrins1;
3585 MG_MAILLAGE* stlmai=mai->dupliquer(&gest);
3586 for (MG_TRIANGLE* stloctrins=stlmai->get_premier_triangle(itoctrins1);stloctrins!=NULL;stloctrins=stlmai->get_suivant_triangle(itoctrins1))
3587  stloctree.inserer(stloctrins);
3588 stl_smoothing(mai,lstedges,octree,stloctree,search_radius);
3589 */
3591 }
3593 {
3594  //MG_MAILLAGE_OUTILS tq;
3595  //MG_ELEMENT_TOPOLOGIQUE *top1=newtri->get_lien_topologie();
3596  MG_SEGMENT* segchk;
3597  MG_SEGMENT* segad1=newtri->get_segment1();
3598  MG_SEGMENT* segad2=newtri->get_segment2();
3599  MG_SEGMENT* segad3=newtri->get_segment3();
3600  if (segad1->get_noeud1()!=ndins && segad1->get_noeud2()!=ndins) segchk=segad1;
3601  else if (segad2->get_noeud1()!=ndins && segad2->get_noeud2()!=ndins) segchk=segad2;
3602  else if (segad3->get_noeud1()!=ndins && segad3->get_noeud2()!=ndins) segchk=segad3;
3603 
3604  // int segtopdim=1; //it should be modified !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
3605 int edgechk=0;
3606  LISTE_MG_SEGMENT::iterator ited;
3607 for (MG_SEGMENT* segedg=mai->get_premier_segment(ited);segedg!=NULL;segedg=mai->get_suivant_segment(ited))
3608 { if (segedg==segchk) edgechk++;
3609 }
3610 if (edgechk==0)
3611 {
3612  MG_TRIANGLE* trichk;
3613  for (int isct=0;isct<segchk->get_lien_triangle()->get_nb();isct++)
3614  {
3615  MG_TRIANGLE* trick=segchk->get_lien_triangle()->get(isct);
3616  if (trick!=newtri) trichk=trick;
3617  }
3618 
3619  MG_NOEUD* othertrianglenode;
3620  if(trichk->get_noeud1()!=segchk->get_noeud1() && trichk->get_noeud1()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud1();
3621  else if(trichk->get_noeud2()!=segchk->get_noeud1() && trichk->get_noeud2()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud2();
3622  else if(trichk->get_noeud3()!=segchk->get_noeud1() && trichk->get_noeud3()!=segchk->get_noeud2()) othertrianglenode=trichk->get_noeud3();
3623 TPL_MAP_ENTITE<MG_SEGMENT*> relatedseg;
3624 for(int irelatedseg1=0;irelatedseg1<ndins->get_lien_triangle()->get_nb();irelatedseg1++)
3625 {
3626  MG_TRIANGLE* trirel1=ndins->get_lien_triangle()->get(irelatedseg1);
3627  relatedseg.ajouter(trirel1->get_segment1());
3628  relatedseg.ajouter(trirel1->get_segment2());
3629  relatedseg.ajouter(trirel1->get_segment3());
3630 }
3631 for(int irelatedseg2=0;irelatedseg2<othertrianglenode->get_lien_triangle()->get_nb();irelatedseg2++)
3632 {
3633  MG_TRIANGLE* trirel2=othertrianglenode->get_lien_triangle()->get(irelatedseg2);
3634  relatedseg.ajouter(trirel2->get_segment1());
3635  relatedseg.ajouter(trirel2->get_segment2());
3636  relatedseg.ajouter(trirel2->get_segment3());
3637 }
3638 int checkifswpdigisexist=0;
3640 for(MG_SEGMENT* segtest=relatedseg.get_premier(itrelatedseg);segtest!=NULL;segtest=relatedseg.get_suivant(itrelatedseg))
3641 {
3642  if(segtest->get_noeud1()==ndins && segtest->get_noeud2()==othertrianglenode) checkifswpdigisexist++;
3643  if(segtest->get_noeud2()==ndins && segtest->get_noeud1()==othertrianglenode) checkifswpdigisexist++;
3644 }
3645 if(checkifswpdigisexist==0)
3646 {
3647  double pinsphnbnewtri=inshper_point(othertrianglenode,newtri);
3648  double pinsphnbothertri=inshper_point(ndins,trichk);
3649 int qualchk=0;
3650 std::map<double,MG_NOEUD*,std::less<double> > beforeswap;
3651 std::map<double,MG_NOEUD*,std::less<double> > afterswap;
3652 MG_MAILLAGE_OUTILS triquality;
3653 double triqualnew=triquality.qualite_triangle(newtri->get_noeud1()->get_coord(),newtri->get_noeud2()->get_coord(),newtri->get_noeud3()->get_coord());
3654 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualnew,newtri->get_noeud1()));
3655 double triqualchek=triquality.qualite_triangle(trichk->get_noeud1()->get_coord(),trichk->get_noeud2()->get_coord(),trichk->get_noeud3()->get_coord());
3656 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualchek,newtri->get_noeud2()));
3657 double afterswap1=triquality.qualite_triangle(ndins->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud1()->get_coord());
3658 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap1,ndins));
3659 double afterswap2=triquality.qualite_triangle(ndins->get_coord(),othertrianglenode->get_coord(),segchk->get_noeud2()->get_coord());
3660 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap2,othertrianglenode));
3661 std::map<double,MG_NOEUD*,std::less<double> >::iterator itbeforeswap=beforeswap.begin();
3662 std::map<double,MG_NOEUD*,std::less<double> >::iterator itafterswap=afterswap.begin();
3663 
3664 if (qualswap>0 && (*itafterswap).first>(*itbeforeswap).first) qualchk=qualchk+1;
3665 if (pinsphnbnewtri<=0.|| pinsphnbothertri<=0. || qualchk>0)//inside sphere
3666 {
3667  MG_NOEUD* segchknd1=segchk->get_noeud1();
3668  MG_NOEUD* segchknd2=segchk->get_noeud2();
3669  MG_NOEUD* trichknd;
3670  MG_NOEUD* trichknd1=trichk->get_noeud1();
3671  MG_NOEUD* trichknd2=trichk->get_noeud2();
3672  MG_NOEUD* trichknd3=trichk->get_noeud3();
3673  if (trichknd1!=segchknd1 && trichknd1!=segchknd2) trichknd=trichknd1;
3674  if (trichknd2!=segchknd1 && trichknd2!=segchknd2) trichknd=trichknd2;
3675  if (trichknd3!=segchknd1 && trichknd3!=segchknd2) trichknd=trichknd3;
3676  MG_TRIANGLE* triad1;
3677  MG_TRIANGLE* triad2;
3678  if (segchknd1==newtri->get_noeud1() && segchknd2==newtri->get_noeud2())
3679  {
3680  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd1,trichknd,MAGIC::ORIGINE::IMPOSE);
3681  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd2,MAGIC::ORIGINE::IMPOSE);
3682  }
3683  else if (segchknd1==newtri->get_noeud2() && segchknd2==newtri->get_noeud3())
3684  {
3685  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd1,trichknd,MAGIC::ORIGINE::IMPOSE);
3686  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd2,MAGIC::ORIGINE::IMPOSE);
3687  }
3688  else if (segchknd1==newtri->get_noeud3() && segchknd2==newtri->get_noeud1())
3689  {
3690  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd1,trichknd,MAGIC::ORIGINE::IMPOSE);
3691  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd2,MAGIC::ORIGINE::IMPOSE);
3692  }
3693  else if (segchknd1==newtri->get_noeud2() && segchknd2==newtri->get_noeud1())
3694  {
3695  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd2,trichknd,MAGIC::ORIGINE::IMPOSE);
3696  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd1,MAGIC::ORIGINE::IMPOSE);
3697  }
3698  else if (segchknd1==newtri->get_noeud3() && segchknd2==newtri->get_noeud2())
3699  {
3700  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd2,trichknd,MAGIC::ORIGINE::IMPOSE);
3701  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd1,MAGIC::ORIGINE::IMPOSE);
3702  }
3703  else if (segchknd1==newtri->get_noeud1() && segchknd2==newtri->get_noeud3())
3704  {
3705  triad1=mai->ajouter_mg_triangle(NULL,ndins,segchknd2,trichknd,MAGIC::ORIGINE::IMPOSE);
3706  triad2=mai->ajouter_mg_triangle(NULL,ndins,trichknd,segchknd1,MAGIC::ORIGINE::IMPOSE);
3707  }
3708  //double qual1=tq.qualite_triangle(triad1->get_noeud1()->get_coord(),triad1->get_noeud2()->get_coord(),triad1->get_noeud3()->get_coord());
3709  //double qual2=tq.qualite_triangle(triad2->get_noeud1()->get_coord(),triad2->get_noeud2()->get_coord(),triad2->get_noeud3()->get_coord());
3710  //cout<<" qual1 after swap= "<<qual1<<" qual2 after swap= "<<qual2<<endl;
3711  octree.inserer(triad1);
3712  octree.inserer(triad2);
3713  octree.supprimer(newtri);
3714  octree.supprimer(trichk);
3715  mai->supprimer_mg_triangleid(newtri->get_id());
3716  mai->supprimer_mg_triangleid(trichk->get_id());
3717  }
3718 }
3719  }
3720 
3721 }
3724 {
3725  MG_MAILLAGE_OUTILS tq;
3726 /*double normale[3];
3727 int facenb=geo->get_nb_mg_face();
3728  LISTE_MG_FACE::iterator itf;
3729  for(MG_FACE* fac=geo->get_premier_face(itf);fac!=NULL;fac=geo->get_suivant_face(itf))
3730  {
3731  double uv[2];
3732  double xyz[3];
3733  xyz[0]=dpins->get_x();
3734  xyz[1]=dpins->get_y();
3735  xyz[2]=dpins->get_z();
3736  double dis;
3737  MG_GEOMETRIE_OUTILS f1;
3738  int ch=f1.calcule_distance_contour_face_xyz(xyz,fac,&dis);
3739  //std::cout<<"iside the face (ch)= "<<ch<<endl;
3740  //cout<<"dis= "<<dis<<endl;
3741  if (ch==1 && dis>=0.)
3742  {
3743  fac->inverser(uv,xyz);
3744  fac->calcul_normale_unitaire(uv,normale);
3745  //cout<<"uv[0]= "<<uv[0]<<" uv[1]= "<<uv[1]<<" normale= "<<normale<<endl;
3746  MG_COFACE *coface=fac->get_mg_coface(0);
3747  double signe=coface->get_orientation();
3748  }
3749  }
3750  */
3752 int neitrinb=lstneitri.get_nb();
3753 while(neitrinb==0)
3754 {
3755  octree.rechercher(dpins->get_x(),dpins->get_y(),dpins->get_z(),search_radius,lstneitri);
3756  neitrinb=lstneitri.get_nb();
3757  search_radius=search_radius+0.01*search_radius;
3758 }
3760 TPL_MAP_ENTITE<MG_NOEUD*> lstneighbornds;
3762 for (MG_TRIANGLE* tri1=lstneitri.get_premier(it1);tri1!=NULL;tri1=lstneitri.get_suivant(it1))
3763  {
3764  lstneighbornds.ajouter(tri1->get_noeud1());
3765  lstneighbornds.ajouter(tri1->get_noeud2());
3766  lstneighbornds.ajouter(tri1->get_noeud3());
3767  double insphchk=inshper_point(dpins,tri1);
3768  if (insphchk<=0.)
3769  insphtri.ajouter(tri1);
3770  }
3771 OT_VECTEUR_3D normale(0.,0.,0.);
3773 for (MG_NOEUD* nornd=lstneighbornds.get_premier(it02);nornd!=NULL;nornd=lstneighbornds.get_suivant(it02))
3774  {
3775  OT_VECTEUR_3D lngpnornd(dpins->get_coord(),nornd->get_coord());double lengpnornd=lngpnornd.get_longueur();
3776  OT_VECTEUR_3D norm=discrete_norm(nornd);
3777  norm=lengpnornd*norm;
3778  normale=normale+norm;
3779  }
3780 
3783 double pproj[3];
3784 std::map<MG_TRIANGLE*,int> ininsphertrilist;
3785 MG_MAILLAGE_OUTILS tribas;
3786 for (int i=0;i<insphtri.get_nb();i++)
3787 {
3788 
3789 MG_NOEUD* nd1=insphtri.get(i)->get_noeud1();
3790 MG_NOEUD* nd2=insphtri.get(i)->get_noeud2();
3791 MG_NOEUD* nd3=insphtri.get(i)->get_noeud3();
3792 OT_VECTEUR_3D norm=normale;
3793 /*
3794 double a1=nd1->get_x()-dpins->get_x();double a2=nd1->get_x()-nd2->get_x();double a3=nd1->get_x()-nd3->get_x();
3795 OT_VECTEUR_3D r1(a1,a2,a3);
3796 double a11=nd1->get_y()-dpins->get_y();double a12=nd1->get_y()-nd2->get_y();double a13=nd1->get_y()-nd3->get_y();
3797 OT_VECTEUR_3D r2(a11,a12,a13);
3798 double a21=nd1->get_z()-dpins->get_z();double a22=nd1->get_z()-nd2->get_z();double a23=nd1->get_z()-nd3->get_z();
3799 OT_VECTEUR_3D r3(a21,a22,a23);
3800 double a31=norm.get_x();double a32=nd1->get_x()-nd2->get_x();double a33=nd1->get_x()-nd3->get_x();
3801 OT_VECTEUR_3D d1(a31,a32,a33);
3802 OT_VECTEUR_3D d2((norm.get_y()),(nd1->get_y()-nd2->get_y()),(nd1->get_y()-nd3->get_y()));
3803 OT_VECTEUR_3D d3((norm.get_z()),(nd1->get_z()-nd2->get_z()),(nd1->get_z()-nd3->get_z()));
3804 */
3805 OT_VECTEUR_3D r1((-dpins->get_x()),(nd2->get_x()-nd1->get_x()),(nd3->get_x()-nd1->get_x()));
3806 OT_VECTEUR_3D r2((-dpins->get_y()),(nd2->get_y()-nd1->get_y()),(nd3->get_y()-nd1->get_y()));
3807 OT_VECTEUR_3D r3((-dpins->get_z()),(nd2->get_z()-nd1->get_z()),(nd3->get_z()-nd1->get_z()));
3808 OT_VECTEUR_3D d1((norm.get_x()),(nd2->get_x()-nd1->get_x()),(nd3->get_x()-nd1->get_x()));
3809 OT_VECTEUR_3D d2((norm.get_y()),(nd2->get_y()-nd1->get_y()),(nd3->get_y()-nd1->get_y()));
3810 OT_VECTEUR_3D d3((norm.get_z()),(nd2->get_z()-nd1->get_z()),(nd3->get_z()-nd1->get_z()));
3811 OT_MATRICE_3D tr(r1,r2,r3);
3812 OT_MATRICE_3D td(d1,d2,d3);
3813 double detd=td.get_determinant();
3814 double detr=tr.get_determinant();
3815  //cout<<" in the delauny isret ster : wrong ins point projection on the mesh"<<endl;
3816 if (detd!=0.)
3817 {
3818  double t=detr/detd;
3819 pproj[0]=dpins->get_x()+t*norm.get_x();
3820 pproj[1]=dpins->get_y()+t*norm.get_y();
3821 pproj[2]=dpins->get_z()+t*norm.get_z();
3822 
3823 
3824 int tribasval=tribas.estdansletriangle(insphtri.get(i),pproj[0],pproj[1],pproj[2]);
3825 int intri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::INTERIEUR);
3826 if (intri==1) ininsphertrilist.insert(std::pair<MG_TRIANGLE*,double>(insphtri.get(i),tribasval));
3827 }
3828 }
3829 
3830 std::map<MG_TRIANGLE*,int>::iterator itininsphertrilist;
3831 for(itininsphertrilist=ininsphertrilist.begin();itininsphertrilist!=ininsphertrilist.end();itininsphertrilist++)
3832 {
3833 int tribasval=(*itininsphertrilist).second;
3834 int insidtri=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::STRICTINTERIEUR);
3835 int onedge=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SUR_ARETE);
3836 
3837 if (insidtri==1) //connect p to 3nds of tri
3838 {
3839  std::cout<<"INSIDE INSIDE *********************the insertion point is inside triangleee"<<std::endl;
3840  MG_TRIANGLE* ndintri=(*itininsphertrilist).first;
3841  MG_SEGMENT* seg1=ndintri->get_segment1();
3842  MG_SEGMENT* seg2=ndintri->get_segment2();
3843  MG_SEGMENT* seg3=ndintri->get_segment3();
3844  //MG_ELEMENT_TOPOLOGIQUE* top1=ndintri->get_lien_topologie();
3845  //cout<<"mai->get_nb_mg_triangle()** before"<<mai->get_nb_mg_triangle()<<endl;
3846  MG_NOEUD* sg1nd1=seg1->get_noeud1();
3847  MG_NOEUD* sg1nd2=seg1->get_noeud2();
3848  MG_TRIANGLE* triad1;
3849  if (sg1nd1==ndintri->get_noeud1() && sg1nd2==ndintri->get_noeud2()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd1,sg1nd2,MAGIC::ORIGINE::IMPOSE);
3850  else if (sg1nd1==ndintri->get_noeud2() && sg1nd2==ndintri->get_noeud1()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd2,sg1nd1,MAGIC::ORIGINE::IMPOSE);
3851  if (sg1nd1==ndintri->get_noeud2() && sg1nd2==ndintri->get_noeud3()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd1,sg1nd2,MAGIC::ORIGINE::IMPOSE);
3852  else if (sg1nd1==ndintri->get_noeud3() && sg1nd2==ndintri->get_noeud2()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd2,sg1nd1,MAGIC::ORIGINE::IMPOSE);
3853  if (sg1nd1==ndintri->get_noeud3() && sg1nd2==ndintri->get_noeud1()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd1,sg1nd2,MAGIC::ORIGINE::IMPOSE);
3854  else if (sg1nd1==ndintri->get_noeud1() && sg1nd2==ndintri->get_noeud3()) triad1=mai->ajouter_mg_triangle(NULL,dpins,sg1nd2,sg1nd1,MAGIC::ORIGINE::IMPOSE);
3855  //cout<<"mai->get_nb_mg_triangle()** after"<<mai->get_nb_mg_triangle()<<endl;
3856  MG_NOEUD* sg2nd1=seg2->get_noeud1();
3857  MG_NOEUD* sg2nd2=seg2->get_noeud2();
3858  MG_TRIANGLE* triad2;
3859  if (sg2nd1==ndintri->get_noeud1() && sg2nd2==ndintri->get_noeud2()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd1,sg2nd2,MAGIC::ORIGINE::IMPOSE);
3860  else if (sg2nd1==ndintri->get_noeud2() && sg2nd2==ndintri->get_noeud1()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd2,sg2nd1,MAGIC::ORIGINE::IMPOSE);
3861  if (sg2nd1==ndintri->get_noeud2() && sg2nd2==ndintri->get_noeud3()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd1,sg2nd2,MAGIC::ORIGINE::IMPOSE);
3862  else if (sg2nd1==ndintri->get_noeud3() && sg2nd2==ndintri->get_noeud2()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd2,sg2nd1,MAGIC::ORIGINE::IMPOSE);
3863  if (sg2nd1==ndintri->get_noeud3() && sg2nd2==ndintri->get_noeud1()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd1,sg2nd2,MAGIC::ORIGINE::IMPOSE);
3864  else if (sg2nd1==ndintri->get_noeud1() && sg2nd2==ndintri->get_noeud3()) triad2=mai->ajouter_mg_triangle(NULL,dpins,sg2nd2,sg2nd1,MAGIC::ORIGINE::IMPOSE);
3865  MG_NOEUD* sg3nd1=seg3->get_noeud1();
3866  MG_NOEUD* sg3nd2=seg3->get_noeud2();
3867  MG_TRIANGLE* triad3;
3868  if (sg3nd1==ndintri->get_noeud1() && sg3nd2==ndintri->get_noeud2()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd1,sg3nd2,MAGIC::ORIGINE::IMPOSE);
3869  else if (sg3nd1==ndintri->get_noeud2() && sg3nd2==ndintri->get_noeud1()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd2,sg3nd1,MAGIC::ORIGINE::IMPOSE);
3870  if (sg3nd1==ndintri->get_noeud2() && sg3nd2==ndintri->get_noeud3()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd1,sg3nd2,MAGIC::ORIGINE::IMPOSE);
3871  else if (sg3nd1==ndintri->get_noeud3() && sg3nd2==ndintri->get_noeud2()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd2,sg3nd1,MAGIC::ORIGINE::IMPOSE);
3872  if (sg3nd1==ndintri->get_noeud3() && sg3nd2==ndintri->get_noeud1()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd1,sg3nd2,MAGIC::ORIGINE::IMPOSE);
3873  else if (sg3nd1==ndintri->get_noeud1() && sg3nd2==ndintri->get_noeud3()) triad3=mai->ajouter_mg_triangle(NULL,dpins,sg3nd2,sg3nd1,MAGIC::ORIGINE::IMPOSE);
3874  octree.inserer(triad1);
3875  octree.inserer(triad2);
3876  octree.inserer(triad3);
3877  octree.supprimer(ndintri);
3878  mai->supprimer_mg_triangleid(ndintri->get_id());
3879  int delswap1=0;
3880  int delswap2=0;
3881  int delswap3=0;
3882  double tqual1=tq.qualite_triangle(triad1->get_noeud1()->get_coord(),triad1->get_noeud2()->get_coord(),triad1->get_noeud3()->get_coord());
3883  double tqual2=tq.qualite_triangle(triad2->get_noeud1()->get_coord(),triad2->get_noeud2()->get_coord(),triad2->get_noeud3()->get_coord());
3884  double tqual3=tq.qualite_triangle(triad3->get_noeud1()->get_coord(),triad3->get_noeud2()->get_coord(),triad3->get_noeud3()->get_coord());
3885  std::cout<<" tqual1= "<<tqual1<<" tqual2= "<<tqual2<<" tqual3= "<<tqual3<<std::endl;
3886  delswap_stlndinsert(dpins,triad1,mai,octree,lstedges);
3887  delswap_stlndinsert(dpins,triad2,mai,octree,lstedges);
3888  delswap_stlndinsert(dpins,triad3,mai,octree,lstedges);
3889  break ;
3890 }
3891 
3892 if (onedge==1) //if on segment: connect p to 6nds of 2 adjacent tries, if on tri vertex: connect to
3893 {
3894 
3895  MG_TRIANGLE* ndontri=(*itininsphertrilist).first;
3896  MG_NOEUD* ndo1=ndontri->get_noeud1();
3897  MG_NOEUD* ndo2=ndontri->get_noeud2();
3898  MG_NOEUD* ndo3=ndontri->get_noeud3();
3899  int onvert1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET1);
3900  int onvert2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET2);
3901  int onvert3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::SOMMET3);
3902  int onedge1=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE1);
3903  int onedge2=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE2);
3904  int onedge3=tribas.compare_etat_triangle(tribasval,MG_MAILLAGE_OUTILS::ARETE3);
3905 
3906  if (onvert1==1 || onvert2==1 || onvert3==1)
3907  {std::cout<<"ON vertex ON vertex *********************the insertion point is on the verteces of triangleee"<<std::endl;
3908 
3909  MG_NOEUD* ond;
3910  if(onvert1==1)ond=ndo1;
3911  if(onvert2==1)ond=ndo2;
3912  if(onvert3==1)ond=ndo3;
3913  std::cout<<" ond->get_x() "<<ond->get_x()<<" ond->get_y() "<<ond->get_y()<<" ond->get_z() "<<ond->get_z()<<std::endl;
3914  std::cout<<" dpins->get_x() "<<dpins->get_x()<<" dpins->get_y() "<<dpins->get_y()<<" dpins->get_z() "<<dpins->get_z()<<std::endl;
3917  std::map<MG_TRIANGLE*,MG_SEGMENT*>addseglst;
3919  for (int ili=0;ili<ond->get_lien_triangle()->get_nb();ili++)
3920  {
3921  MG_TRIANGLE* deltri=ond->get_lien_triangle()->get(ili);
3922  deltrilst.ajouter(deltri);
3923  }
3924  for (int isegadlst=0;isegadlst<deltrilst.get_nb();isegadlst++)
3925  {
3926  MG_TRIANGLE* trid=deltrilst.get(isegadlst);
3927  MG_SEGMENT* seg1=trid->get_segment1();
3928  MG_SEGMENT* seg2=trid->get_segment2();
3929  MG_SEGMENT* seg3=trid->get_segment3();
3930  if (ond!=seg1->get_noeud1() && ond!=seg1->get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg1));
3931  else if (ond!=seg2->get_noeud1() && ond!=seg2->get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg2));
3932  else if (ond!=seg3->get_noeud1() && ond!=seg3->get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg3));
3933  }
3934  std::map<MG_TRIANGLE*,MG_SEGMENT*>::iterator itaddseglst;
3935  for (itaddseglst=addseglst.begin();itaddseglst!=addseglst.end();itaddseglst++)
3936  {
3937  MG_SEGMENT* segtrans=(*itaddseglst).second;
3938  MG_TRIANGLE* triold=(*itaddseglst).first;
3939  MG_ELEMENT_TOPOLOGIQUE* toptriloc=triold->get_lien_topologie();
3940  MG_NOEUD* sgnd1=segtrans->get_noeud1();
3941  MG_NOEUD* sgnd2=segtrans->get_noeud2();
3942  MG_TRIANGLE* triad;
3943  if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(toptriloc,sgnd1,sgnd2,dpins,MAGIC::ORIGINE::IMPOSE);
3944  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(toptriloc,sgnd2,sgnd1,dpins,MAGIC::ORIGINE::IMPOSE);
3945  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(toptriloc,dpins,sgnd1,sgnd2,MAGIC::ORIGINE::IMPOSE);
3946  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(toptriloc,dpins,sgnd2,sgnd1,MAGIC::ORIGINE::IMPOSE);
3947  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(toptriloc,sgnd2,dpins,sgnd1,MAGIC::ORIGINE::IMPOSE);
3948  else if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(toptriloc,sgnd1,dpins,sgnd2,MAGIC::ORIGINE::IMPOSE);
3950 triadsegs.ajouter(triad->get_segment1());
3951 triadsegs.ajouter(triad->get_segment2());
3952 triadsegs.ajouter(triad->get_segment3());
3954 trioldsegs.ajouter(triold->get_segment1());
3955 trioldsegs.ajouter(triold->get_segment2());
3956 trioldsegs.ajouter(triold->get_segment3());
3957 for(int itriadsegs=0;itriadsegs<triadsegs.get_nb();itriadsegs++)
3958 {
3959  MG_SEGMENT* triadseg=triadsegs.get(itriadsegs);
3960  if(triadseg!=segtrans)
3961  {
3962  for(int itrioldsegs=0;itrioldsegs<trioldsegs.get_nb();itrioldsegs++)
3963  {
3964  MG_SEGMENT* trioldseg=trioldsegs.get(itrioldsegs);
3965  if(trioldseg!=segtrans)
3966  {
3967  if(trioldseg->get_noeud1()==sgnd1 || trioldseg->get_noeud2()==sgnd1)
3968  {
3969  if(triadseg->get_noeud1()==sgnd1 || triadseg->get_noeud2()==sgnd1) triadseg->change_lien_topologie(trioldseg->get_lien_topologie());
3970  }
3971  else if(trioldseg->get_noeud1()==sgnd2 || trioldseg->get_noeud2()==sgnd2)
3972  {
3973  if(triadseg->get_noeud1()==sgnd2 || triadseg->get_noeud2()==sgnd2) triadseg->change_lien_topologie(trioldseg->get_lien_topologie());
3974  }
3975  }
3976  }
3977  }
3978 }
3979 octree.inserer(triad);
3980 lstadtris.ajouter(triad);
3981  }
3982 
3983  for (int ideletriangle=0;ideletriangle<deltrilst.get_nb();ideletriangle++)
3984  {
3985  MG_TRIANGLE* deletingtri=deltrilst.get(ideletriangle);
3986  octree.supprimer(deletingtri);
3987  mai->supprimer_mg_triangleid(deletingtri->get_id());
3988  }
3989  for (int iadtris=0;iadtris<lstadtris.get_nb();iadtris++)
3990  {
3991  MG_TRIANGLE* swchktr=lstadtris.get(iadtris);
3992  delswap_stlndinsert(dpins,swchktr,mai,octree,lstedges);
3993  }
3994 
3995  break;
3996  }
3997 
3998 
3999  else if(onedge1==1 || onedge2==1 || onedge3==1)
4000  {
4001  std::cout<<"ON EDGE EDGE *********************the insertion point is on the verteces of triangleee"<<std::endl;
4002  MG_SEGMENT* onseg;
4003  if (onedge1==1) onseg=ndontri->get_segment1();
4004  else if (onedge2==1) onseg=ndontri->get_segment2();
4005  else if (onedge3==1) onseg=ndontri->get_segment3();
4006  dpins->change_lien_topologie(onseg->get_lien_topologie());
4007  std::map<MG_SEGMENT*,MG_TRIANGLE*>lstonedtriseg;
4008  TPL_LISTE_ENTITE<MG_TRIANGLE*> triswilldelete;
4009  if(onseg->get_lien_triangle()->get_nb()==2)
4010 {
4011  MG_TRIANGLE* onedtri1=onseg->get_lien_triangle()->get(0);
4012  MG_TRIANGLE* onedtri2=onseg->get_lien_triangle()->get(1);
4013  MG_SEGMENT* onedtri1seg1=onedtri1->get_segment1();
4014  if (onedtri1seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
4015  MG_SEGMENT* onedtri1seg2=onedtri1->get_segment2();
4016  if (onedtri1seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
4017  MG_SEGMENT* onedtri1seg3=onedtri1->get_segment3();
4018  if (onedtri1seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
4019  MG_SEGMENT* onedtri2seg1=onedtri2->get_segment1();
4020  if (onedtri2seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg1,onedtri2));
4021  MG_SEGMENT* onedtri2seg2=onedtri2->get_segment2();
4022  if (onedtri2seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg2,onedtri2));
4023  MG_SEGMENT* onedtri2seg3=onedtri2->get_segment3();
4024  if (onedtri2seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg3,onedtri2));
4025  octree.supprimer(onedtri1);
4026  octree.supprimer(onedtri2);
4027  triswilldelete.ajouter(onedtri1);
4028  triswilldelete.ajouter(onedtri2);
4029 }
4030 else if(onseg->get_lien_triangle()->get_nb()==1)
4031 {
4032  MG_TRIANGLE* onedtri1=onseg->get_lien_triangle()->get(0);
4033  MG_SEGMENT* onedtri1seg1=onedtri1->get_segment1();
4034  if (onedtri1seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
4035  MG_SEGMENT* onedtri1seg2=onedtri1->get_segment2();
4036  if (onedtri1seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
4037  MG_SEGMENT* onedtri1seg3=onedtri1->get_segment3();
4038  if (onedtri1seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
4039  octree.supprimer(onedtri1);
4040  triswilldelete.ajouter(onedtri1);
4041 }
4042 
4044  std::map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstonedtriseg;
4045  for (itlstonedtriseg=lstonedtriseg.begin();itlstonedtriseg!=lstonedtriseg.end();itlstonedtriseg++)
4046  {
4047  MG_SEGMENT* segcommon=(*itlstonedtriseg).first;
4048  MG_TRIANGLE* triold=(*itlstonedtriseg).second;
4049  MG_ELEMENT_TOPOLOGIQUE* toponseg=triold->get_lien_topologie();
4050  MG_NOEUD* sgnd1=segcommon->get_noeud1();
4051  MG_NOEUD* sgnd2=segcommon->get_noeud2();
4052  MG_TRIANGLE* triad;
4053  if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(toponseg,sgnd1,sgnd2,dpins,MAGIC::ORIGINE::IMPOSE);
4054  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(toponseg,sgnd2,sgnd1,dpins,MAGIC::ORIGINE::IMPOSE);
4055  else if (sgnd1==triold->get_noeud2() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(toponseg,dpins,sgnd1,sgnd2,MAGIC::ORIGINE::IMPOSE);
4056  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(toponseg,dpins,sgnd2,sgnd1,MAGIC::ORIGINE::IMPOSE);
4057  else if (sgnd1==triold->get_noeud3() && sgnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(toponseg,sgnd2,dpins,sgnd1,MAGIC::ORIGINE::IMPOSE);
4058  else if (sgnd1==triold->get_noeud1() && sgnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(toponseg,sgnd1,dpins,sgnd2,MAGIC::ORIGINE::IMPOSE);
4059  // unify the topology of the segments, keep the edges
4061 triadsegs.ajouter(triad->get_segment1());
4062 triadsegs.ajouter(triad->get_segment2());
4063 triadsegs.ajouter(triad->get_segment3());
4064 for(int itriadsegs=0;itriadsegs<triadsegs.get_nb();itriadsegs++)
4065 {
4066  MG_SEGMENT* triadseg=triadsegs.get(itriadsegs);
4067  if(triadseg!=segcommon)
4068  {
4069  if(triadseg->get_noeud1()==onseg->get_noeud1() || triadseg->get_noeud2()==onseg->get_noeud2()
4070  || triadseg->get_noeud2()==onseg->get_noeud1() || triadseg->get_noeud1()==onseg->get_noeud2())
4071  {
4072  triadseg->change_lien_topologie(onseg->get_lien_topologie());
4073  }
4074 
4075  }
4076 }
4077  octree.inserer(triad);
4078  lstadtris.ajouter(triad);
4079  }
4080  for (int itriswilldelete=0;itriswilldelete<triswilldelete.get_nb();itriswilldelete++)
4081  {
4082  mai->supprimer_mg_triangleid(triswilldelete.get(itriswilldelete)->get_id());
4083  }
4084 
4085  for (int iadtris=0;iadtris<lstadtris.get_nb();iadtris++)
4086  {
4087  MG_TRIANGLE* swchktr=lstadtris.get(iadtris);
4088  delswap_stlndinsert(dpins,swchktr,mai,octree,lstedges);
4089  }
4090 
4091  break;
4092  }
4093 }
4094 
4095 
4096 }
4097 }
4099 {
4100 
4101  //pinrt->change_lien_topologie(prxnd->get_lien_topologie());
4102  /*
4103  TPL_LISTE_ENTITE<MG_TRIANGLE*> deltrilst;
4104  std::map<MG_TRIANGLE*,MG_SEGMENT*>addseglst;
4105  TPL_LISTE_ENTITE<MG_TRIANGLE*> lstadtris;
4106 
4107  for (int isegadlst=0;isegadlst<deltrilst.get_nb();isegadlst++)
4108  {
4109  MG_TRIANGLE* trid=deltrilst.get(isegadlst);
4110  MG_SEGMENT* seg1=trid->get_segment1();
4111  MG_SEGMENT* seg2=trid->get_segment2();
4112  MG_SEGMENT* seg3=trid->get_segment3();
4113  if (prxnd!=seg1->get_noeud1() && prxnd!=seg1->get_noeud2()) addseglst.insert(pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg1));
4114  else if (prxnd!=seg2->get_noeud1() && prxnd!=seg2->get_noeud2()) addseglst.insert(pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg2));
4115  else if (prxnd!=seg3->get_noeud1() && prxnd!=seg3->get_noeud2()) addseglst.insert(pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg3));
4116  }
4117  std::map<MG_TRIANGLE*,MG_SEGMENT*>::iterator itaddseglst;
4118  for (itaddseglst=addseglst.begin();itaddseglst!=addseglst.end();itaddseglst++)
4119  {
4120  MG_SEGMENT* segcomm=(*itaddseglst).second;
4121  MG_TRIANGLE* triold=(*itaddseglst).first;
4122  //MG_ELEMENT_TOPOLOGIQUE* toptriloc=triold->get_lien_topologie();
4123  MG_NOEUD* sgcommnd1=segcomm->get_noeud1();
4124  MG_NOEUD* sgcommnd2=segcomm->get_noeud2();
4125  MG_TRIANGLE* triad;
4126  if (sgcommnd1==triold->get_noeud1() && sgcommnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(NULL,sgcommnd1,sgcommnd2,pinrt,IMPOSE);
4127  else if (sgcommnd1==triold->get_noeud2() && sgcommnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(NULL,sgcommnd2,sgcommnd1,pinrt,IMPOSE);
4128  else if (sgcommnd1==triold->get_noeud2() && sgcommnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(NULL,pinrt,sgcommnd1,sgcommnd2,IMPOSE);
4129  else if (sgcommnd1==triold->get_noeud3() && sgcommnd2==triold->get_noeud2()) triad=mai->ajouter_mg_triangle(NULL,pinrt,sgcommnd2,sgcommnd1,IMPOSE);
4130  else if (sgcommnd1==triold->get_noeud3() && sgcommnd2==triold->get_noeud1()) triad=mai->ajouter_mg_triangle(NULL,sgcommnd2,pinrt,sgcommnd1,IMPOSE);
4131  else if (sgcommnd1==triold->get_noeud1() && sgcommnd2==triold->get_noeud3()) triad=mai->ajouter_mg_triangle(NULL,sgcommnd1,pinrt,sgcommnd2,IMPOSE);
4132  TPL_LISTE_ENTITE<MG_SEGMENT*> triadsegs;
4133 triadsegs.ajouter(triad->get_segment1());
4134 triadsegs.ajouter(triad->get_segment2());
4135 triadsegs.ajouter(triad->get_segment3());
4136 TPL_LISTE_ENTITE<MG_SEGMENT*> trioldsegs;
4137 trioldsegs.ajouter(triold->get_segment1());
4138 trioldsegs.ajouter(triold->get_segment2());
4139 trioldsegs.ajouter(triold->get_segment3());
4140 for(int itriadsegs=0;itriadsegs<triadsegs.get_nb();itriadsegs++)
4141 {
4142  MG_SEGMENT* triadseg=triadsegs.get(itriadsegs);
4143  if(triadseg!=segcomm)
4144  {
4145  for(int itrioldsegs=0;itrioldsegs<trioldsegs.get_nb();itrioldsegs++)
4146  {
4147  MG_SEGMENT* trioldseg=trioldsegs.get(itrioldsegs);
4148  if(trioldseg!=segcomm)
4149  {
4150  if(trioldseg->get_noeud1()==sgcommnd1 || trioldseg->get_noeud2()==sgcommnd1)
4151  {
4152  if(triadseg->get_noeud1()==sgcommnd1 || triadseg->get_noeud2()==sgcommnd1) triadseg->change_lien_topologie(trioldseg->get_lien_topologie());
4153  }
4154  else if(trioldseg->get_noeud1()==sgcommnd2 || trioldseg->get_noeud2()==sgcommnd2)
4155  {
4156  if(triadseg->get_noeud1()==sgcommnd2 || triadseg->get_noeud2()==sgcommnd2) triadseg->change_lien_topologie(trioldseg->get_lien_topologie());
4157  }
4158  }
4159  }
4160  }
4161 }
4162 */
4163  // why not just only change the coordinate of prxnd with pinrt !!!!!!!!!!!
4165  for (int ili=0;ili<prxnd->get_lien_triangle()->get_nb();ili++)
4166  {
4167  MG_TRIANGLE* deltri=prxnd->get_lien_triangle()->get(ili);
4168  //change the AUTOMAIILAGE to IMPOSE ??????????????????????????????????????????????
4169  //proxlien_trilst.ajouter(deltri);
4170  octree.supprimer(deltri);
4172  }
4173 prxnd->change_coord(pinrt->get_coord());
4174 mai->supprimer_mg_noeudid(pinrt->get_id());
4175 for (int ili=0;ili<prxnd->get_lien_triangle()->get_nb();ili++)
4176  {
4177  MG_TRIANGLE* deltri=prxnd->get_lien_triangle()->get(ili);
4178  octree.inserer(deltri);
4179  lstadtris.ajouter(deltri);
4180  }
4181  //can octree automativcally understand the prxnd coordnite change? to allocate proper celles to the proxnd and its linked triangles?? or I need to remove prxnd and its linked triangles before change coordinate and add after change coordinate
4182 
4183  for (int iadtris=0;iadtris<lstadtris.get_nb();iadtris++)
4184  {
4185  MG_TRIANGLE* swchktr=lstadtris.get(iadtris);
4186  delswap_stlndinsert(pinrt,swchktr,mai,octree,lstedges);
4187  }
4188 }
TPL_MAP_ENTITE::supprimer
virtual void supprimer(X x)
Definition: tpl_map_entite.h:69
MAILLEUR2D_STL_REFINE_INS_NOEUD::projecton_stlorig
OT_VECTEUR_3D projecton_stlorig(double midndx, double midndy, double midndz, double stl_rad_search, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1462
MG_GESTIONNAIRE::enregistrer
virtual void enregistrer(std::ostream &o, double version=MAGIC_VERSION_FICHIER_DOUBLE)
Definition: mg_gestionnaire.cpp:1070
fct_generateur_3d.h
TPL_MAP_ENTITE::get_premier
virtual X get_premier(ITERATEUR &it)
Definition: tpl_map_entite.h:112
MG_TRIANGLE::get_segment1
virtual MG_SEGMENT * get_segment1(void)
Definition: mg_triangle.cpp:142
MG_SEGMENT
Definition: mg_segment.h:38
OT_MATRICE_3D::get_determinant
double get_determinant()
Definition: ot_mathematique.cpp:735
MAILLEUR2D_STL_REFINE_INS_NOEUD::stlins_point_withbc
void stlins_point_withbc()
Definition: mailleur2d_stl_refine_ins_noeud.cpp:2921
MAILLEUR2D_STL_REFINE_INS_NOEUD::stlproxnd_stlndinsert
void stlproxnd_stlndinsert(MG_NOEUD *prxnd, MG_NOEUD *pinrt, MG_MAILLAGE *mai, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:4098
MG_ELEMENT_TOPOLOGIQUE::ajouter_ccf
virtual void ajouter_ccf(char *nom, double val, std::string suiv="NS")
Definition: mg_element_topologique.cpp:159
tpl_fonctions_generiques.h
MG_MAILLAGE::get_premier_noeud
MG_NOEUD * get_premier_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:548
gestionversion.h
MAILLEUR2D_STL_REFINE_INS_NOEUD::calcul_distance_metrique
double calcul_distance_metrique(double *xyz1, double *xyz2, int pas, FCT_TAILLE *metrique)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:196
MAILLEUR2D_STL_REFINE_INS_NOEUD::metrique
FCT_TAILLE * metrique
Definition: mailleur2d_stl_refine_ins_noeud.h:82
MG_GEOMETRIE::ajouter_mg_sommet_noeud
virtual class MG_SOMMET_NOEUD * ajouter_mg_sommet_noeud(MG_NOEUD *noeud)
Definition: mg_geometrie.cpp:481
TPL_MAP_ENTITE< MG_NOEUD * >
FCT_TAILLE_FEM_SOLUTION
Definition: fct_taille_fem_solution.h:37
mg_gestionnaire.h
robustpredicates.hxx
MG_SEGMENT::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_segment.cpp:113
MAILLEUR2D_STL_REFINE_INS_NOEUD::STLSORTMMAP
std::multimap< double, MG_TRIANGLE *, std::greater< double > > STLSORTMMAP
Definition: mailleur2d_stl_refine_ins_noeud.h:56
MG_NOEUD::get_z
virtual double get_z(void)
Definition: mg_noeud.cpp:87
MG_NOEUD::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_noeud.cpp:153
MAILLEUR2D_STL_REFINE_INS_NOEUD::inshper_point
double inshper_point(MG_NOEUD *insphp, MG_TRIANGLE *insphtri)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1771
MG_IDENTIFICATEUR::get_id
unsigned long get_id()
Definition: mg_identificateur.cpp:53
robustPredicates::epsilon
static REAL epsilon
Definition: robustpredicates.cc:371
MAILLEUR2D_STL_REFINE_INS_NOEUD::qualswap
int qualswap
Definition: mailleur2d_stl_refine_ins_noeud.h:88
MAILLEUR2D_STL_REFINE_INS_NOEUD::delaunay_stlndinsert
void delaunay_stlndinsert(MG_NOEUD *dpins, MG_MAILLAGE *mai, double search_radius, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:3723
MAILLEUR2D_STL_REFINE_INS_NOEUD::lstedges
TPL_MAP_ENTITE< MG_SEGMENT * > lstedges
Definition: mailleur2d_stl_refine_ins_noeud.h:89
MG_TRIANGLE::get_segment2
virtual MG_SEGMENT * get_segment2(void)
Definition: mg_triangle.cpp:147
MAILLEUR2D_STL_REFINE_INS_NOEUD::bisection_operator_refstl
void bisection_operator_refstl(MG_MAILLAGE *mai, MG_SEGMENT *lastlsseg, STLSORTMMAP &stltrisorting, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree, double geo_angle_threshold, MG_TRIANGLE *lscktriold)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:898
MAILLEUR2D_STL_REFINE_INS_NOEUD::stl_refining
void stl_refining(void)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:711
mg_file.h
TPL_OCTREE::supprimer
virtual void supprimer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:918
OPERATEUR::ARETE2
@ ARETE2
Definition: ot_mathematique.h:435
MAGIC_AFFICHE::affiche
virtual void affiche(char *mess)
Definition: magic_affiche.cpp:43
MG_ELEMENT_MAILLAGE::change_lien_topologie
void change_lien_topologie(MG_ELEMENT_TOPOLOGIQUE *topo)
Definition: mg_element_maillage.cpp:56
MG_TRIANGLE
Definition: mg_triangle.h:38
OPERATEUR::ARETE1
@ ARETE1
Definition: ot_mathematique.h:435
MAILLEUR2D_STL_REFINE_INS_NOEUD::gest
MG_GESTIONNAIRE * gest
Definition: mailleur2d_stl_refine_ins_noeud.h:78
MG_MAILLAGE_OUTILS::get_angle
double get_angle(class MG_TRIANGLE *ele1, class MG_TRIANGLE *ele2)
Definition: mg_maillage_outils.cpp:93
FCT_TAILLE
Definition: fct_taille.h:30
OT_VECTEUR_3D::get_x
virtual double get_x(void) const
Definition: ot_mathematique.cpp:417
MG_TRIANGLE::get_segment3
virtual MG_SEGMENT * get_segment3(void)
Definition: mg_triangle.cpp:152
MG_MAILLAGE::get_premier_segment
MG_SEGMENT * get_premier_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:630
MAILLEUR::pas
int pas
Definition: mailleur.h:56
OPERATEUR::STRICTINTERIEUR
@ STRICTINTERIEUR
Definition: ot_mathematique.h:435
MG_MAILLAGE_OUTILS
Definition: mg_maillage_outils.h:47
MG_ELEMENT_TOPOLOGIQUE
Definition: mg_element_topologique.h:51
TPL_OCTREE::inserer
virtual void inserer(BOITE_3D &boite, A a, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:897
MAILLEUR2D_STL_REFINE_INS_NOEUD::~MAILLEUR2D_STL_REFINE_INS_NOEUD
virtual ~MAILLEUR2D_STL_REFINE_INS_NOEUD()
Definition: mailleur2d_stl_refine_ins_noeud.cpp:57
mg_maillage_outils.h
MAILLEUR2D_STL_REFINE_INS_NOEUD::swap_diag_delaunay_sizemapref
void swap_diag_delaunay_sizemapref(MG_NOEUD *insertnod, MG_SEGMENT *segchk, SIZMAPSORT &sizemapsorting, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, MG_MAILLAGE *mai, double geo_angle_threshold, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree, FCT_TAILLE *metrique)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:442
MAILLEUR2D_STL_REFINE_INS_NOEUD::bisection_operator_sizemapref
void bisection_operator_sizemapref(MG_MAILLAGE *mai, MG_SEGMENT *segbgsz, SIZMAPSORT &sizemapsorting, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree, double geo_angle_threshold, FCT_TAILLE *metrique)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:229
MAILLEUR2D_STL_REFINE_INS_NOEUD::stl_optimize_nd
void stl_optimize_nd(MG_TRIANGLE *tripri, MG_NOEUD *qualnd, double movstp, double stl_rad_search, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1322
MAILLEUR2D_STL_REFINE_INS_NOEUD::stlins_points
void stlins_points()
Definition: mailleur2d_stl_refine_ins_noeud.cpp:2375
MAILLEUR2D_STL_REFINE_INS_NOEUD::fichiercarte
char * fichiercarte
Definition: mailleur2d_stl_refine_ins_noeud.h:85
MG_MAILLAGE::get_premier_triangle
MG_TRIANGLE * get_premier_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:912
MAILLEUR2D_STL_REFINE_INS_NOEUD::SIZMAPSORT
std::multimap< double, MG_SEGMENT *, std::greater< double > > SIZMAPSORT
Definition: mailleur2d_stl_refine_ins_noeud.h:55
MG_GESTIONNAIRE::ajouter_mg_geometrie
int ajouter_mg_geometrie(MG_GEOMETRIE *mggeo)
Definition: mg_gestionnaire.cpp:306
MG_MAILLAGE::ajouter_mg_triangle
MG_TRIANGLE * ajouter_mg_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:731
MG_SEGMENT::get_lien_triangle
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
Definition: mg_segment.cpp:243
MG_SEGMENT::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_segment.cpp:108
mailleur2d_stl_refine_ins_noeud.h
MAILLEUR2D_STL_REFINE_INS_NOEUD::mai
MG_MAILLAGE * mai
Definition: mailleur2d_stl_refine_ins_noeud.h:76
MG_NOEUD::get_lien_segment
TPL_LISTE_ENTITE< class MG_SEGMENT * > * get_lien_segment(void)
Definition: mg_noeud.cpp:141
MG_MAILLAGE::supprimer_mg_triangleid
int supprimer_mg_triangleid(unsigned long num)
Definition: mg_maillage.cpp:820
TPL_MAP_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_map_entite.h:83
MG_NOEUD
Definition: mg_noeud.h:41
MAILLEUR2D_STL_REFINE_INS_NOEUD::insertnod
MG_NOEUD * insertnod
Definition: mailleur2d_stl_refine_ins_noeud.h:80
OT_MATRICE_3D
Definition: ot_mathematique.h:160
MAILLEUR2D_STL_REFINE_INS_NOEUD::targetsize_criteria
double targetsize_criteria(MG_TRIANGLE *tri)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1854
MAILLEUR2D_STL_REFINE_INS_NOEUD::discrete_norm
OT_VECTEUR_3D discrete_norm(MG_NOEUD *ndnrm)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1738
robustPredicates::insphere
REAL insphere(REAL *pa, REAL *pb, REAL *pc, REAL *pd, REAL *pe)
Definition: robustpredicates.cc:4167
MAGIC::ORIGINE::IMPOSE
@ IMPOSE
Definition: mg_definition.h:79
MG_MAILLAGE::get_suivant_segment
MG_SEGMENT * get_suivant_segment(LISTE_MG_SEGMENT::iterator &)
Definition: mg_maillage.cpp:638
TPL_OCTREE::rechercher
virtual void rechercher(BOITE_3D &boite, TPL_MAP_ENTITE< A > &liste_entite_trouve, TPL_CELLULE_OCTREE< A, CONDITION > *cellule)
Definition: tpl_octree.h:606
TPL_LISTE_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_liste_entite.h:38
MG_NOEUD::get_coord
virtual double * get_coord(void)
Definition: mg_noeud.cpp:92
TPL_MAP_ENTITE::ITERATEUR
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
Definition: tpl_map_entite.h:38
MG_ELEMENT_MAILLAGE::change_origine
virtual void change_origine(int)
Definition: mg_element_maillage.cpp:86
MAILLEUR2D_STL_REFINE_INS_NOEUD
Definition: mailleur2d_stl_refine_ins_noeud.h:36
MG_GESTIONNAIRE::get_mg_maillage
MG_MAILLAGE * get_mg_maillage(unsigned int num)
Definition: mg_gestionnaire.cpp:550
mg_sommet_noeud.h
TPL_LISTE_ENTITE::get_nb
virtual int get_nb(void)
Definition: tpl_liste_entite.h:67
OT_VECTEUR_3D::norme
virtual void norme(void)
Definition: ot_mathematique.cpp:494
MG_TRIANGLE::get_noeud2
virtual MG_NOEUD * get_noeud2(void)
Definition: mg_triangle.cpp:131
MG_FILE
Definition: mg_file.h:31
TPL_LISTE_ENTITE::get
virtual X get(int num)
Definition: tpl_liste_entite.h:72
OT_VECTEUR_3D::get_y
virtual double get_y(void) const
Definition: ot_mathematique.cpp:423
MAILLEUR2D_STL_REFINE_INS_NOEUD::fichierinspoint
char * fichierinspoint
Definition: mailleur2d_stl_refine_ins_noeud.h:86
OPERATEUR::SUR_ARETE
@ SUR_ARETE
Definition: ot_mathematique.h:435
OPERATEUR::SOMMET1
@ SOMMET1
Definition: ot_mathematique.h:435
MG_NOEUD::get_x
virtual double get_x(void)
Definition: mg_noeud.cpp:77
OPERATEUR::INTERIEUR
@ INTERIEUR
Definition: ot_mathematique.h:435
OT_VECTEUR_3D
Definition: ot_mathematique.h:94
MAILLEUR2D_STL_REFINE_INS_NOEUD::MAILLEUR2D_STL_REFINE_INS_NOEUD
MAILLEUR2D_STL_REFINE_INS_NOEUD(char *fichierstlmagic, char *fichierout, int nummai)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:41
MAILLEUR2D_STL_REFINE_INS_NOEUD::sizemapsorting
SIZMAPSORT sizemapsorting
Definition: mailleur2d_stl_refine_ins_noeud.h:79
TPL_MAP_ENTITE::ajouter
virtual void ajouter(X x)
Definition: tpl_map_entite.h:55
MAILLEUR2D_STL_REFINE_INS_NOEUD::fichierstlmagic
char * fichierstlmagic
Definition: mailleur2d_stl_refine_ins_noeud.h:84
OPERATEUR::SOMMET2
@ SOMMET2
Definition: ot_mathematique.h:435
MG_TRIANGLE::get_noeud1
virtual MG_NOEUD * get_noeud1(void)
Definition: mg_triangle.cpp:126
sqrt
double2 sqrt(double2 &val)
Definition: ot_doubleprecision.cpp:345
MG_MAILLAGE::supprimer_mg_noeudid
int supprimer_mg_noeudid(unsigned long num)
Definition: mg_maillage.cpp:482
OPERATEUR::SOMMET3
@ SOMMET3
Definition: ot_mathematique.h:435
MG_GESTIONNAIRE::get_mg_maillageid
MG_MAILLAGE * get_mg_maillageid(unsigned long num)
Definition: mg_gestionnaire.cpp:538
fct_taille_fem_solution.h
MG_ELEMENT_MAILLAGE::get_lien_topologie
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
Definition: mg_element_maillage.cpp:51
TPL_MAP_ENTITE::get
virtual X get(int num)
Definition: tpl_map_entite.h:89
OPERATEUR::qualite_triangle
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
Definition: ot_mathematique.cpp:1647
MG_TRIANGLE::get_noeud3
virtual MG_NOEUD * get_noeud3(void)
Definition: mg_triangle.cpp:137
MAILLEUR
Definition: mailleur.h:33
OT_VECTEUR_3D::get_z
virtual double get_z(void) const
Definition: ot_mathematique.cpp:429
MAILLEUR2D_STL_REFINE_INS_NOEUD::useboundrytreatment
int useboundrytreatment
Definition: mailleur2d_stl_refine_ins_noeud.h:75
MG_GEOMETRIE
Definition: mg_geometrie.h:84
MG_MAILLAGE::get_suivant_triangle
MG_TRIANGLE * get_suivant_triangle(LISTE_MG_TRIANGLE::iterator &it)
Definition: mg_maillage.cpp:920
MG_NOEUD::change_coord
virtual void change_coord(double *coo)
Definition: mg_noeud.cpp:133
OT_VECTEUR_3D::get_longueur
virtual double get_longueur(void) const
Definition: ot_mathematique.cpp:483
MG_MAILLAGE
Definition: mg_maillage.h:62
TPL_LISTE_ENTITE< MG_TRIANGLE * >
MG_SEGMENT::get_longueur
virtual double get_longueur(void)
Definition: mg_segment.cpp:125
OPERATEUR::ARETE3
@ ARETE3
Definition: ot_mathematique.h:435
res
#define res(i, j)
MAILLEUR2D_STL_REFINE_INS_NOEUD::swap_diag_delaunay_refstl
void swap_diag_delaunay_refstl(MG_NOEUD *insertnod, MG_SEGMENT *dchktri, STLSORTMMAP &stlsortings, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, MG_MAILLAGE *mai, double geo_angle_threshold, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1948
MAILLEUR2D_STL_REFINE_INS_NOEUD::fichierout
char * fichierout
Definition: mailleur2d_stl_refine_ins_noeud.h:83
TPL_MAP_ENTITE::get_suivant
virtual X get_suivant(ITERATEUR &it)
Definition: tpl_map_entite.h:120
MG_MAILLAGE::dupliquer
MG_MAILLAGE * dupliquer(MG_GESTIONNAIRE *gest)
Definition: mg_maillage.cpp:262
MAILLEUR2D_STL_REFINE_INS_NOEUD::smooth_nd
OT_VECTEUR_3D smooth_nd(MG_NOEUD *nod)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1437
MG_SOMMET_NOEUD
Definition: mg_sommet_noeud.h:33
MAGIC::ORIGINE::MAILLEUR_AUTO
@ MAILLEUR_AUTO
Definition: mg_definition.h:79
MAILLEUR2D_STL_REFINE_INS_NOEUD::stl_sizmpref
void stl_sizmpref(void)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:60
tpl_liste_entite.h
TPL_OCTREE::initialiser
virtual void initialiser(TPL_LISTE_ENTITE< CONDITION > *lst_entite, int nombre, double xmin, double ymin, double zmin, double xmax, double ymax, double zmax)
Definition: tpl_octree.h:366
TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * >
MG_MAILLAGE::get_suivant_noeud
MG_NOEUD * get_suivant_noeud(LISTE_MG_NOEUD::iterator &it)
Definition: mg_maillage.cpp:556
MG_MAILLAGE_OUTILS::compare_etat_triangle
int compare_etat_triangle(int etat, int valeur)
Definition: mg_maillage_outils.cpp:87
FCT_TAILLE::evaluer
virtual void evaluer(double *param, double *resultat)=0
MAILLEUR::compteur
OT_CPU * compteur
Definition: mailleur.h:52
MAILLEUR2D_STL_REFINE_INS_NOEUD::nummai
int nummai
Definition: mailleur2d_stl_refine_ins_noeud.h:87
MAILLEUR2D_STL_REFINE_INS_NOEUD::stlmai
MG_MAILLAGE * stlmai
Definition: mailleur2d_stl_refine_ins_noeud.h:77
MG_MAILLAGE_OUTILS::estdansletriangle
int estdansletriangle(MG_TRIANGLE *tri, double x, double y, double z)
Definition: mg_maillage_outils.cpp:53
MG_NOEUD::get_y
virtual double get_y(void)
Definition: mg_noeud.cpp:82
MG_MAILLAGE::ajouter_mg_noeud
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
Definition: mg_maillage.cpp:421
MAILLEUR2D_STL_REFINE_INS_NOEUD::stl_smoothing
void stl_smoothing(MG_MAILLAGE *mai, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &stloctree, double search_radius)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:1862
MAILLEUR2D_STL_REFINE_INS_NOEUD::delswap_stlndinsert
void delswap_stlndinsert(MG_NOEUD *ndins, MG_TRIANGLE *newtri, MG_MAILLAGE *mai, TPL_OCTREE< MG_TRIANGLE *, MG_NOEUD * > &octree, TPL_MAP_ENTITE< MG_SEGMENT * > &lstedges)
Definition: mailleur2d_stl_refine_ins_noeud.cpp:3592