48 :
MAILLEUR(false),magicfilename(magicfilenametmp),meshno(meshnotmp),inspointfilename(inspointfilenametmp),outputfilename(outputfilenametmp),nivopt(nivopttmp),qualswap(qualswaptmp),proxval(proxvaltmp),proxedgeval(proxedgevaltmp)
52 :
MAILLEUR(mdd),magicfilename(mdd.magicfilename),meshno(mdd.meshno),inspointfilename(mdd.inspointfilename),outputfilename(mdd.outputfilename),nivopt(mdd.nivopt),qualswap(mdd.qualswap),proxval(mdd.proxval),proxedgeval(mdd.proxedgeval)
66 if (in==NULL)
affiche((
char*)
"file is not available");
70 char*
res=fgets(chaine,500,in);
74 int nb=sscanf(chaine,
"%le %le %le",&x,&y,&z);
75 if (nb!=-1 && nb!=3)
affiche((
char*)
"Wrong file format");
76 else if (nb!=-1 && nb==3)
84 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
86 LISTE_MG_NOEUD::iterator it;
89 if (no->get_x()<xmin) xmin=no->get_x();
90 if (no->get_y()<ymin) ymin=no->get_y();
91 if (no->get_z()<zmin) zmin=no->get_z();
92 if (no->get_x()>xmax) xmax=no->get_x();
93 if (no->get_y()>ymax) ymax=no->get_y();
94 if (no->get_z()>zmax) zmax=no->get_z();
105 double length=
sqrt(lengthvec*lengthvec);
107 xmin=average.
get_x()-(length*bxr);ymin=average.
get_y()-(length*bxr);zmin=average.
get_z()-(length*bxr);
108 xmax=average.
get_x()+(length*bxr);ymax=average.
get_y()+(length*bxr);zmax=average.
get_z()+(length*bxr);
110 octree.
initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
111 LISTE_MG_TRIANGLE::iterator it9;
115 octreends.
initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
119 for (
int ipins=0;ipins<pins.
get_nb();ipins++)
122 int sameinsnd_meshnd=0;
123 double proximityqual;
124 double delaunyinsqual;
125 std::multimap<double,MG_NOEUD*,std::greater<double> > lstqualprxndfinal;
130 int neitrinb1=lstneitri1.
get_nb();
134 neitrinb1=lstneitri1.
get_nb();
135 search_radius=search_radius+0.1*search_radius;
143 top=tri01->get_lien_topologie();
144 MG_NOEUD* dpnd1=tri01->get_noeud1();
145 MG_NOEUD* dpnd2=tri01->get_noeud2();
146 MG_NOEUD* dpnd3=tri01->get_noeud3();
151 std::multimap< double, MG_NOEUD* , std::less<double> > lstdisproxnde;
155 if (prnde->get_x()==
p->
get_x() && prnde->get_y()==
p->
get_y() && prnde->get_z()==
p->
get_z())
157 top=prnde->get_lien_topologie();
159 sameinsnd_meshnd=sameinsnd_meshnd+1;
165 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));
166 lstdisproxnde.insert(std::pair<double, MG_NOEUD*> (dp,prnde));
169 if( sameinsnd_meshnd==0)
171 std::multimap< double, MG_NOEUD* , std::less<double> >::iterator itlstdprnd=lstdisproxnde.begin();
172 double mindis=(*itlstdprnd).first;
174 double distelorance=1.1;
176 for (itlstdprnd=lstdisproxnde.begin();itlstdprnd!=lstdisproxnde.end();itlstdprnd++)
178 if ((*itlstdprnd).first<(distelorance*mindis)) lstprnds.
ajouter((*itlstdprnd).second);
181 std::multimap<double,MG_NOEUD*,std::less<double> > lstqualtri;
182 for(
int ilpn=0;ilpn<lstprnds.
get_nb();ilpn++)
187 int checkisinspoint=0;
188 for(
int ipins1=0;ipins1<pins.
get_nb();ipins1++ )
191 if (checknotinspoint==proxnd) checkisinspoint=checkisinspoint+1;
193 if (checkisinspoint==0)
208 if(proxnd!=prliseg1nd1 && proxnd!=prliseg1nd2) sgchk=prliseg1;
209 if(proxnd!=prliseg2nd1 && proxnd!=prliseg2nd2) sgchk=prliseg2;
210 if(proxnd!=prliseg3nd1 && proxnd!=prliseg3nd2) sgchk=prliseg3;
222 if(insph_swap_chk<=0)
226 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
227 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
232 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
236 else if(prlind2==proxnd)
238 if(insph_swap_chk<=0)
242 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
243 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
248 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
251 else if(prlind3==proxnd)
253 if(insph_swap_chk<=0)
257 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
258 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
263 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
268 std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itlstqualtri=lstqualtri.begin();
269 lstqualprxndfinal.insert(std::pair<double,MG_NOEUD*>((*itlstqualtri).first,(*itlstqualtri).second));
274 if (lstqualprxndfinal.size()==0) proximityqual=0.;
277 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
278 proximityqual=(*itlstqualprxndfinal).first;
281 std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
284 LISTE_MG_FACE::iterator itf;
295 if (ch==1 && dis>=0.)
297 fac->inverser(uv,xyz);
298 fac->calcul_normale_unitaire(uv,normale);
304 int neitrinb=lstneitri.
get_nb();
308 neitrinb=lstneitri.
get_nb();
309 search_radius=search_radius+0.01*search_radius;
315 top=tri1->get_lien_topologie();
317 if (insphchk<=0.) insphtri.
ajouter(tri1);
326 MG_NOEUD* inspnd1=insphertri->get_noeud1();
327 MG_NOEUD* inspnd2=insphertri->get_noeud2();
328 MG_NOEUD* inspnd3=insphertri->get_noeud3();
346 if (detd==0. || detr==0.)
affiche((
char*)
"wrong ins point projection on the mesh");
382 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
383 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
388 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
403 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
404 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
409 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
424 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
425 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
430 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
447 if (onvert1==1 || onvert2==1 || onvert3==1)
450 if(onvert1==1)ond=ndo1;
451 if(onvert2==1)ond=ndo2;
452 if(onvert3==1)ond=ndo3;
476 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,trlie));
477 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,trlie));
482 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,trlie));
487 else if(onedge1==1 || onedge2==1 || onedge3==1)
507 trioth=segfre->get_lien_triangle()->get(1);
509 trioth=segfre->get_lien_triangle()->get(0);
519 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndontri));
520 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndontri));
525 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndontri));
535 std::multimap<double,MG_TRIANGLE*,std::less<double> > :: iterator itdelinsqualtri=delinsqualtri.begin();
536 delaunyinsqual=(*itdelinsqualtri).first;
538 if (lstqualprxndfinal.size()>0 && proximityqual>delaunyinsqual)
540 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
541 prox_nd((*itlstqualprxndfinal).second,
p,
mai,octreends,octree);
569 std::vector<double*> lstgnifread;
570 std::vector<double*> lstgnifwrite;
574 int removednodiadd=0;
580 double xmin=1e308,ymin=1e308,zmin=1e308,xmax=-1e308,ymax=-1e308,zmax=-1e308;
582 LISTE_MG_NOEUD::iterator it;
585 if (no->get_x()<xmin) xmin=no->get_x();
586 if (no->get_y()<ymin) ymin=no->get_y();
587 if (no->get_z()<zmin) zmin=no->get_z();
588 if (no->get_x()>xmax) xmax=no->get_x();
589 if (no->get_y()>ymax) ymax=no->get_y();
590 if (no->get_z()>zmax) zmax=no->get_z();
601 double length=
sqrt(lengthvec*lengthvec);
603 xmin=average.
get_x()-(length*bxr);ymin=average.
get_y()-(length*bxr);zmin=average.
get_z()-(length*bxr);
604 xmax=average.
get_x()+(length*bxr);ymax=average.
get_y()+(length*bxr);zmax=average.
get_z()+(length*bxr);
606 octree.
initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
607 LISTE_MG_TRIANGLE::iterator it9;
611 octreends.
initialiser(&lstnoeud,1,xmin,ymin,zmin,xmax,ymax,zmax);
615 std::map<MG_NOEUD*,double*> pins;
617 if (in==NULL)
affiche((
char*)
"file is not available");
621 char*
res=fgets(chaine,500,in);
627 double* pcoordbc=
new double[6];
631 int nb=sscanf(chaine,
"%le %le %le %le %le %le",&x,&y,&z,&q1,&q2,&q3);
635 if (nb!=-1 && nb!=6)
affiche((
char*)
"Wrong file format");
639 pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
640 lstgnifread.push_back(pcoordbc);
645 int nb=sscanf(chaine,
"%le %le %le %le %le %le %le",&ins_rem_type,&x,&y,&z,&q1,&q2,&q3);
649 if (nb!=-1 && nb!=7)
affiche((
char*)
"Wrong file format");
652 pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
653 lstgnifread.push_back(pcoordbc);
659 int tstpexistnb=lstneinds_tstpexist.
get_nb();
660 double search_radius1=search_radius;
661 while(tstpexistnb==0)
663 octreends.
rechercher(x,y,z,search_radius1,lstneinds_tstpexist);
664 tstpexistnb=lstneinds_tstpexist.
get_nb();
665 search_radius1=search_radius1+0.1*search_radius1;
668 std::map<double,MG_NOEUD*,std::less<double> > lstneinodins;
669 std::map<double,MG_NOEUD*,std::less<double> > lstneinodinsedge;
671 for (
MG_NOEUD* nds_tstpexist=lstneinds_tstpexist.
get_premier(itst_pexist);nds_tstpexist!=NULL;nds_tstpexist=lstneinds_tstpexist.
get_suivant(itst_pexist))
673 double dis1=
sqrt(pow((nds_tstpexist->get_x()-x),2.)+pow((nds_tstpexist->get_y()-y),2.)+pow((nds_tstpexist->get_z()-z),2.));
674 lstneinodins.insert(std::pair<double,MG_NOEUD*>(dis1,nds_tstpexist));
675 if(nds_tstpexist->get_lien_topologie()->get_dimension()<2)
677 lstneinodinsedge.insert(std::pair<double,MG_NOEUD*>(dis1,nds_tstpexist));
680 std::map<double,MG_NOEUD*,std::less<double> >::iterator itlstneinodins;
681 if(lstneinodins.size()>0)
683 itlstneinodins=lstneinodins.begin();
684 MG_NOEUD* ndaround=(*itlstneinodins).second;
692 if(sgtls->get_lien_topologie()->get_dimension()<3)
704 q1=(0.001*(x-ndaround->
get_x()))+q1;
705 q2=(0.001*(y-ndaround->
get_y()))+q2;
706 q3=(0.001*(z-ndaround->
get_z()))+q3;
711 double* pcoordbc=
new double[6];
712 pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
713 lstgnifwrite.push_back(pcoordbc);
719 else if(ins_rem_type>0)
723 if(lstneinodinsedge.size()>0 )
725 for(std::map<
double,
MG_NOEUD*,std::less<double> >::iterator itlstneinodinsedgechk=lstneinodinsedge.begin();itlstneinodinsedgechk!=lstneinodinsedge.end();itlstneinodinsedgechk++)
727 if (ndaround==(*itlstneinodinsedgechk).second)
728 lstneinodinsedge.erase(itlstneinodinsedgechk);
732 std::cout<<
"VERY VERY VERY CLOSE"<<std::endl;
735 std::map<double,MG_NOEUD*,std::less<double> >::iterator itlstneinodinsedge;
738 itlstneinodinsedge=lstneinodinsedge.begin();
739 MG_NOEUD* ndaround=(*itlstneinodinsedge).second;
740 double distp=(*itlstneinodinsedge).first;
745 q1=(0.001*(x-ndaround->
get_x()))+q1;
746 q2=(0.001*(y-ndaround->
get_y()))+q2;
747 q3=(0.001*(z-ndaround->
get_z()))+q3;
752 double* pcoordbc=
new double[6];
753 pcoordbc[0]=x; pcoordbc[1]=y; pcoordbc[2]=z; pcoordbc[3]=q1; pcoordbc[4]=q2; pcoordbc[5]=q3;
754 lstgnifwrite.push_back(pcoordbc);
760 else if(ins_rem_type>0)
764 std::cout<<
"VERY CLOSE to edges"<<std::endl;
768 lstneinodinsedge.clear();;
769 lstneinodins.clear();;
773 double* bc=
new double[4];
774 bc[0]=q1; bc[1]=q2; bc[2]=q3; bc[3]=ins_rem_type;
775 pins.insert(std::pair<MG_NOEUD*,double*> (
p,bc));
780 double tri_return_angl=3.1415/3.;
781 std::map<MG_NOEUD*,double*> pins_prox_Delaunay;
783 for(std::map<MG_NOEUD*,double*>::iterator itpins=pins.begin();itpins!=pins.end();itpins++)
787 int sameinsnd_meshnd=0;
788 double proximityqual=-1.;
789 double delaunyinsqual=-1;
790 std::multimap<double,MG_NOEUD*,std::greater<double> > lstqualprxndfinal;
795 int neindsnb=proxtrind.
get_nb();
799 neindsnb=proxtrind.
get_nb();
800 search_radius=search_radius+0.1*search_radius;
802 std::multimap< double, MG_NOEUD* , std::less<double> > lstdisproxnde;
806 if (prnde->get_x()==
p->
get_x() && prnde->get_y()==
p->
get_y() && prnde->get_z()==
p->
get_z())
808 sameinsnd_meshnd=sameinsnd_meshnd+1;
809 std::cout<<
"the same node as insertion"<<std::endl;
814 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));
815 lstdisproxnde.insert(std::pair<double, MG_NOEUD*> (dp,prnde));
818 if( sameinsnd_meshnd==0)
820 std::multimap< double, MG_NOEUD* , std::less<double> >::iterator itlstdprnd=lstdisproxnde.begin();
821 double mindis=(*itlstdprnd).first;
823 double distelorance=1.1;
824 for (itlstdprnd=lstdisproxnde.begin();itlstdprnd!=lstdisproxnde.end();itlstdprnd++)
826 if ((*itlstdprnd).first<=(distelorance*mindis) && (*itlstdprnd).first<0.8*
mesh_size )
827 lstprnds.
ajouter((*itlstdprnd).second);
829 for(
int ilpn=0;ilpn<lstprnds.
get_nb();ilpn++)
833 std::cout<<
"proxinod is the same as insertion node"<<std::endl;
838 std::multimap<double,MG_NOEUD*,std::less<double> > lstqualtri;
871 double insph_swap_chk2=1.;
872 int insph_swap_chk=0;
873 if (insph_swap_chk1<=0. ||insph_swap_chk2<=0.)
886 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
891 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
895 if(tqual1<tqualvpt || tqual1<tqualvpto)
898 else if (tqual2<tqual1)
900 if(tqual2<tqualvpt || tqual2<tqualvpto)
903 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
904 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
912 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
914 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
926 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
931 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
935 if(tqual1<tqualvpt || tqual1<tqualvpto)
938 else if (tqual2<tqual1)
940 if(tqual2<tqualvpt || tqual2<tqualvpto)
943 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
944 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
952 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
954 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
966 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
971 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
975 if(tqual1<tqualvpt || tqual1<tqualvpto)
978 else if (tqual2<tqual1)
980 if(tqual2<tqualvpt || tqual2<tqualvpto)
983 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
984 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
992 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
994 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1006 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
1011 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
1015 if(tqual1<tqualvpt || tqual1<tqualvpto)
1018 else if (tqual2<tqual1)
1020 if(tqual2<tqualvpt || tqual2<tqualvpto)
1023 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
1024 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
1032 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
1034 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1046 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
1051 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
1055 if(tqual1<tqualvpt || tqual1<tqualvpto)
1058 else if (tqual2<tqual1)
1060 if(tqual2<tqualvpt || tqual2<tqualvpto)
1063 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
1064 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
1072 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
1074 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1086 if(normvpr1*normvpt<
cos(tri_return_angl) || normvpr1*normvpto<
cos(tri_return_angl))
1091 if(normvpr2*normvpt<
cos(tri_return_angl)|| normvpr2*normvpto<
cos(tri_return_angl))
1095 if(tqual1<tqualvpt || tqual1<tqualvpto)
1098 else if (tqual2<tqual1)
1100 if(tqual2<tqualvpt || tqual2<tqualvpto)
1103 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual1,proxnd));
1104 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual2,proxnd));
1112 if(normvpr*normvpt<
cos(tri_return_angl) || normvpr*normvpto<
cos(tri_return_angl))
1114 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1126 if(normvpr*normvpt<
cos(tri_return_angl))
1128 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1136 if(normvpr*normvpt<
cos(tri_return_angl))
1138 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1146 if(normvpr*normvpt<
cos(tri_return_angl))
1148 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1156 if(normvpr*normvpt<
cos(tri_return_angl))
1158 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1166 if(normvpr*normvpt<
cos(tri_return_angl))
1168 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1176 if(normvpr*normvpt<
cos(tri_return_angl))
1178 lstqualtri.insert(std::pair<double,MG_NOEUD*>(tqual,proxnd));
1184 std::multimap<double,MG_NOEUD*,std::less<double> >::iterator itlstqualtri=lstqualtri.begin();
1185 lstqualprxndfinal.insert(std::pair<double,MG_NOEUD*>((*itlstqualtri).first,(*itlstqualtri).second));
1190 if (lstqualprxndfinal.size()>0)
1192 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
1193 proximityqual=(*itlstqualprxndfinal).first;
1195 std::multimap<double,MG_TRIANGLE*,std::less<double> > delinsqualtri;
1198 std::multimap<double,MG_FACE*,std::less<double> > lstfacepointdist;
1200 LISTE_MG_FACE::iterator itf;
1208 fac->inverser(uv,xyz);
1210 fac->evaluer(uv,xyz2);
1212 lstfacepointdist.insert(std::pair<double,MG_FACE*> (vechk.
get_longueur(),fac));
1221 std::multimap<double,MG_FACE*,std::less<double> >::iterator itlstfacepointdist=lstfacepointdist.begin();
1222 if (lstfacepointdist.size()>0)
1225 MG_FACE* face=(*itlstfacepointdist).second;
1233 int neitrinb=lstneitri.
get_nb();
1237 neitrinb=lstneitri.
get_nb();
1238 search_radius=search_radius+0.01*search_radius;
1244 OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
1245 OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
1247 normale_discrete=normtst+normale_discrete;
1249 normale_discrete.
norme();
1250 double n_ps=normale_discrete*normale;
1252 if (n_ps>1.) n_ps=1.;
1253 if (n_ps<-1.) n_ps=-1.;
1254 double n_angle=
acos(n_ps);
1255 if(n_angle<(0.5*3.14159265358979323846) || n_angle>-(0.5*3.14159265358979323846))
1261 int neitrinb=lstneitri.
get_nb();
1265 neitrinb=lstneitri.
get_nb();
1266 search_radius=search_radius+0.01*search_radius;
1283 MG_NOEUD* inspnd1=insphertri->get_noeud1();
1284 MG_NOEUD* inspnd2=insphertri->get_noeud2();
1285 MG_NOEUD* inspnd3=insphertri->get_noeud3();
1291 double parallel=norm*tnorm;
1308 if (parallel>0.7 || parallel<-0.7)
1312 double t= (tnorm*vvec)/parallel;
1343 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1344 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
1349 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1355 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1372 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1373 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
1378 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1384 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1401 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1402 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndintri));
1407 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1413 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndintri));
1429 if (onvert1==1 || onvert2==1 || onvert3==1)
1432 if(onvert1==1)ond=ndo1;
1433 if(onvert2==1)ond=ndo2;
1434 if(onvert3==1)ond=ndo3;
1453 if (pinsphnb<=0. && qualswap>0)
1461 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,trlie));
1462 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,trlie));
1467 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,trlie));
1474 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,trlie));
1481 else if(onedge1==1 || onedge2==1 || onedge3==1)
1499 if(segfre->get_lien_triangle()->get_nb()>1)
1503 trioth=segfre->get_lien_triangle()->get(1);
1505 trioth=segfre->get_lien_triangle()->get(0);
1515 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndontri));
1516 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual2,ndontri));
1521 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndontri));
1527 delinsqualtri.insert(std::pair<double,MG_TRIANGLE*>(qual1,ndontri));
1539 if(delinsqualtri.size()>0)
1541 std::multimap<double,MG_TRIANGLE*,std::less<double> > :: iterator itdelinsqualtri=delinsqualtri.begin();
1542 delaunyinsqual=(*itdelinsqualtri).first;
1546 if (lstqualprxndfinal.size()>0 && proximityqual>delaunyinsqual && proximityqual>
gentriqual)
1549 somno->
ajouter_ccf((
char*)
"Dx",((*itpins).second)[0]);
1550 somno->
ajouter_ccf((
char*)
"Dy",((*itpins).second)[1]);
1551 somno->
ajouter_ccf((
char*)
"Dz",((*itpins).second)[2]);
1552 std::multimap<double,MG_NOEUD*,std::greater<double> >::iterator itlstqualprxndfinal=lstqualprxndfinal.begin();
1553 prox_nd((*itlstqualprxndfinal).second,
p,
mai,octreends,octree);
1554 double* pcoordbc=
new double[6];
1555 pcoordbc[0]=
p->
get_x(); pcoordbc[1]=
p->
get_y(); pcoordbc[2]=
p->
get_z(); pcoordbc[3]=((*itpins).second)[0]; pcoordbc[4]=((*itpins).second)[1]; pcoordbc[5]=((*itpins).second)[2];
1556 lstgnifwrite.push_back(pcoordbc);
1557 pins_prox_Delaunay.insert(std::pair<MG_NOEUD*,double*> ((*itpins).first,(*itpins).second));
1561 else if (delaunyinsqual>
gentriqual && delinsqualtri.size()>0)
1564 somno->
ajouter_ccf((
char*)
"Dx",((*itpins).second)[0]);
1565 somno->
ajouter_ccf((
char*)
"Dy",((*itpins).second)[1]);
1566 somno->
ajouter_ccf((
char*)
"Dz",((*itpins).second)[2]);
1569 double* pcoordbc=
new double[6];
1570 pcoordbc[0]=
p->
get_x(); pcoordbc[1]=
p->
get_y(); pcoordbc[2]=
p->
get_z(); pcoordbc[3]=((*itpins).second)[0]; pcoordbc[4]=((*itpins).second)[1]; pcoordbc[5]=((*itpins).second)[2];
1571 lstgnifwrite.push_back(pcoordbc);
1572 pins_prox_Delaunay.insert(std::pair<MG_NOEUD*,double*> ((*itpins).first,(*itpins).second));
1578 std::cout<<
"DELITED POINT: p->get_x()= "<<
p->
get_x()<<
"p->get_y()"<<
p->
get_y()<<std::endl;
1585 std::cout<<
"nds ins by proximity= "<<proxndiiadd<<
" nds ins by delaunay= "<<delonnodiiadd<<
" nds removed= "<<removednodiadd<<
" verycloseee= "<<verycloseee<<std::endl;
1600 std::cout<<
"mgcouqenb= "<<mgcouqenb<<std::endl;
1602 for(
int couqenb=0;couqenb<mgcouqenb;couqenb++)
1610 for(std::map<MG_NOEUD*,double*>::iterator itpins_prox_Delaunay=pins_prox_Delaunay.begin();itpins_prox_Delaunay!=pins_prox_Delaunay.end();itpins_prox_Delaunay++)
1613 if((*itpins_prox_Delaunay).second[3]<1)
1615 for(
int ippd=0; ippd<((*itpins_prox_Delaunay).first)->get_lien_triangle()->get_nb();ippd++)
1617 MG_TRIANGLE* tricha=((*itpins_prox_Delaunay).first)->get_lien_triangle()->get(ippd);
1627 std::ostringstream oss;
1628 oss <<
"GNIFout" <<gnifoutputfilename ;
1629 std::string namefic = oss.str();
1630 std::string namefic1=namefic +
"_insremovtypsort.txt";
1631 std::cout<<
"namefic1= "<<namefic1<<std::endl;
1632 FILE* in1=fopen(namefic1.c_str(),
"wt");
1633 for(std::vector<double*>::iterator itlstpinsert=lstgnifread.begin();itlstpinsert!=lstgnifread.end();itlstpinsert++)
1637 xyzpins1=(*itlstpinsert);
1638 for(std::vector<double*>::iterator itlstpinserted=lstgnifwrite.begin();itlstpinserted!=lstgnifwrite.end();itlstpinserted++)
1641 xyzpins2=(*itlstpinserted);
1642 if(xyzpins1[0]==xyzpins2[0] && xyzpins1[1]==xyzpins2[1] && xyzpins1[2]==xyzpins2[2] && xyzpins1[3]==xyzpins2[3] && xyzpins1[4]==xyzpins2[4] && xyzpins1[5]==xyzpins2[5])
1644 fprintf(in1,
"1 %le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1650 fprintf(in1,
"0 %le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1653 std::string namefic2=namefic +
"_insertedpoints.txt";
1654 std::cout<<
"namefic2= "<<namefic2<<std::endl;
1655 FILE* in2=fopen(namefic2.c_str(),
"wt");
1656 for(std::vector<double*>::iterator itlstpinsert=lstgnifwrite.begin();itlstpinsert!=lstgnifwrite.end();itlstpinsert++)
1659 xyzpins1=(*itlstpinsert);
1660 fprintf(in2,
"%le %le %le %le %le %le\n",xyzpins1[0],xyzpins1[1],xyzpins1[2],xyzpins1[3]*1000.,xyzpins1[4]*1000.,xyzpins1[5]*1000.);
1671 std::map<MG_TRIANGLE*,MG_SEGMENT*>addseglst;
1678 for (
int isegadlst=0;isegadlst<deltrilst.
get_nb();isegadlst++)
1684 if (prxnd!=seg1->
get_noeud1() && prxnd!=seg1->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg1));
1685 else if (prxnd!=seg2->
get_noeud1() && prxnd!=seg2->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg2));
1686 else if (prxnd!=seg3->
get_noeud1() && prxnd!=seg3->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg3));
1688 std::map<MG_TRIANGLE*,MG_SEGMENT*>::iterator itaddseglst;
1689 for (itaddseglst=addseglst.begin();itaddseglst!=addseglst.end();itaddseglst++)
1711 for(
int itriadsegs=0;itriadsegs<triadsegs.
get_nb();itriadsegs++)
1714 if(triadseg==segcomm)
1718 if(triadseg!=segcomm)
1720 for(
int itrioldsegs=0;itrioldsegs<trioldsegs.
get_nb();itrioldsegs++)
1723 if(trioldseg!=segcomm)
1744 for (
int ideletriangle=0;ideletriangle<deltrilst.
get_nb();ideletriangle++)
1751 for (
int iadtris=0;iadtris<lstadtris.
get_nb();iadtris++)
1766 std::multimap<double,MG_FACE*,std::less<double> > lstfacepointdist;
1768 LISTE_MG_FACE::iterator itf;
1770 xyz[0]=dpins->
get_x();
1771 xyz[1]=dpins->
get_y();
1772 xyz[2]=dpins->
get_z();
1776 fac->inverser(uv,xyz);
1778 fac->evaluer(uv,xyz2);
1780 lstfacepointdist.insert(std::pair<double,MG_FACE*> (vechk.
get_longueur(),fac));
1789 std::multimap<double,MG_FACE*,std::less<double> >::iterator itlstfacepointdist=lstfacepointdist.begin();
1790 if (lstfacepointdist.size()>0)
1793 MG_FACE* face=(*itlstfacepointdist).second;
1801 int neitrinb=lstneitri.
get_nb();
1805 neitrinb=lstneitri.
get_nb();
1806 search_radius=search_radius+0.01*search_radius;
1812 OT_VECTEUR_3D vec1(tri1->get_noeud1()->get_coord(),tri1->get_noeud2()->get_coord());
1813 OT_VECTEUR_3D vec2(tri1->get_noeud1()->get_coord(),tri1->get_noeud3()->get_coord());
1815 normale_discrete=normtst+normale_discrete;
1817 normale_discrete.
norme();
1818 double n_ps=normale_discrete*normale;
1820 if (n_ps>1.) n_ps=1.;
1821 if (n_ps<-1.) n_ps=-1.;
1822 double n_angle=
acos(n_ps);
1823 if(n_angle<(0.5*3.14159265358979323846) || n_angle>-(0.5*3.14159265358979323846))
1829 int neitrinb=lstneitri.
get_nb();
1833 neitrinb=lstneitri.
get_nb();
1834 search_radius=search_radius+0.01*search_radius;
1851 MG_NOEUD* inspnd1=insphertri->get_noeud1();
1852 MG_NOEUD* inspnd2=insphertri->get_noeud2();
1853 MG_NOEUD* inspnd3=insphertri->get_noeud3();
1858 double parallel=norm*tnorm;
1859 if (parallel<0.7 && parallel>-0.7) std::cout<<
"the line and plane are parallel inside DELAUNAY"<<std::endl;
1861 if (parallel>0.7 || parallel<-0.7)
1864 double t= (tnorm*vvec)/parallel;
1941 if (onvert1==1 || onvert2==1 || onvert3==1)
1944 if(onvert1==1)ond=ndo1;
1945 if(onvert2==1)ond=ndo2;
1946 if(onvert3==1)ond=ndo3;
1949 std::map<MG_TRIANGLE*,MG_SEGMENT*>addseglst;
1956 for (
int isegadlst=0;isegadlst<deltrilst.
get_nb();isegadlst++)
1962 if (ond!=seg1->
get_noeud1() && ond!=seg1->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg1));
1963 else if (ond!=seg2->
get_noeud1() && ond!=seg2->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg2));
1964 else if (ond!=seg3->
get_noeud1() && ond!=seg3->
get_noeud2()) addseglst.insert(std::pair<MG_TRIANGLE*,MG_SEGMENT*>(trid,seg3));
1966 std::map<MG_TRIANGLE*,MG_SEGMENT*>::iterator itaddseglst;
1967 for (itaddseglst=addseglst.begin();itaddseglst!=addseglst.end();itaddseglst++)
1990 for(
int itriadsegs=0;itriadsegs<triadsegs.
get_nb();itriadsegs++)
1993 if(triadseg!=segtrans)
1995 for(
int itrioldsegs=0;itrioldsegs<trioldsegs.
get_nb();itrioldsegs++)
1998 if(trioldseg!=segtrans)
2016 for (
int ideletriangle=0;ideletriangle<deltrilst.
get_nb();ideletriangle++)
2022 for (
int iadtris=0;iadtris<lstadtris.
get_nb();iadtris++)
2031 else if(onedge1==1 || onedge2==1 || onedge3==1)
2038 std::map<MG_SEGMENT*,MG_TRIANGLE*>lstonedtriseg;
2045 if (onedtri1seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
2047 if (onedtri1seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
2049 if (onedtri1seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
2051 if (onedtri2seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg1,onedtri2));
2053 if (onedtri2seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg2,onedtri2));
2055 if (onedtri2seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri2seg3,onedtri2));
2058 triswilldelete.
ajouter(onedtri1);
2059 triswilldelete.
ajouter(onedtri2);
2065 if (onedtri1seg1!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg1,onedtri1));
2067 if (onedtri1seg2!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg2,onedtri1));
2069 if (onedtri1seg3!=onseg) lstonedtriseg.insert(std::pair<MG_SEGMENT*,MG_TRIANGLE*>(onedtri1seg3,onedtri1));
2071 triswilldelete.
ajouter(onedtri1);
2075 std::map<MG_SEGMENT*,MG_TRIANGLE*>::iterator itlstonedtriseg;
2076 for (itlstonedtriseg=lstonedtriseg.begin();itlstonedtriseg!=lstonedtriseg.end();itlstonedtriseg++)
2078 MG_SEGMENT* segcommon=(*itlstonedtriseg).first;
2097 for(
int itriadsegs=0;itriadsegs<triadsegs.
get_nb();itriadsegs++)
2100 if(triadseg!=segcommon)
2114 for (
int itriswilldelete=0;itriswilldelete<triswilldelete.
get_nb();itriswilldelete++)
2119 for (
int iadtris=0;iadtris<lstadtris.
get_nb();iadtris++)
2153 if (trick!=newtri) trichk=trick;
2161 for(
int irelatedseg1=0;irelatedseg1<ndins->
get_lien_triangle()->get_nb();irelatedseg1++)
2168 for(
int irelatedseg2=0;irelatedseg2<othertrianglenode->
get_lien_triangle()->get_nb();irelatedseg2++)
2175 int checkifswpdigisexist=0;
2179 if(segtest->get_noeud1()==ndins && segtest->get_noeud2()==othertrianglenode) checkifswpdigisexist++;
2180 if(segtest->get_noeud2()==ndins && segtest->get_noeud1()==othertrianglenode) checkifswpdigisexist++;
2182 if(checkifswpdigisexist==0)
2184 double pinsphnbnewtri=1.;
2187 std::map<double,MG_NOEUD*,std::less<double> > beforeswap;
2188 std::map<double,MG_NOEUD*,std::less<double> > afterswap;
2191 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualnew,newtri->
get_noeud1()));
2193 beforeswap.insert(std::pair<double,MG_NOEUD*> (triqualchek,newtri->
get_noeud2()));
2195 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap1,ndins));
2197 afterswap.insert(std::pair<double,MG_NOEUD*>(afterswap2,othertrianglenode));
2198 std::map<double,MG_NOEUD*,std::less<double> >::iterator itbeforeswap=beforeswap.begin();
2199 std::map<double,MG_NOEUD*,std::less<double> >::iterator itafterswap=afterswap.begin();
2201 if (
qualswap>0 && (*itafterswap).first>(*itbeforeswap).first) qualchk=qualchk+1;
2202 if (pinsphnbnewtri<=0.|| pinsphnbothertri<=0.)
2211 if (trichknd1!=segchknd1 && trichknd1!=segchknd2) trichknd=trichknd1;
2212 if (trichknd2!=segchknd1 && trichknd2!=segchknd2) trichknd=trichknd2;
2213 if (trichknd3!=segchknd1 && trichknd3!=segchknd2) trichknd=trichknd3;
2279 bisectp1[0]=(node1->
get_x()+node2->
get_x())/2.;
2280 bisectp1[1]=(node1->
get_y()+node2->
get_y())/2.;
2281 bisectp1[2]=(node1->
get_z()+node2->
get_z())/2.;
2282 bisectp2[0]=(node1->
get_x()+node3->
get_x())/2.;
2283 bisectp2[1]=(node1->
get_y()+node3->
get_y())/2.;
2284 bisectp2[2]=(node1->
get_z()+node3->
get_z())/2.;
2301 s=(bivec1.
get_x()*(bisectp2[1]-bisectp1[1])+bivec1.
get_y()*(bisectp1[0]-bisectp2[0]))/determinan1;
2302 t=(bivec2.
get_x()*(bisectp2[1]-bisectp1[1])+bivec2.
get_y()*(bisectp1[0]-bisectp2[0]))/determinan1;
2304 else if(determinan2!=0.)
2306 s=(bivec1.
get_x()*(bisectp2[2]-bisectp1[2])+bivec1.
get_z()*(bisectp1[0]-bisectp2[0]))/determinan2;
2307 t=(bivec2.
get_x()*(bisectp2[2]-bisectp1[2])+bivec2.
get_z()*(bisectp1[0]-bisectp2[0]))/determinan2;
2309 else if(determinan3!=0.)
2311 s=(bivec1.
get_y()*(bisectp2[2]-bisectp1[2])+bivec1.
get_z()*(bisectp1[1]-bisectp2[1]))/determinan3;
2312 t=(bivec2.
get_y()*(bisectp2[2]-bisectp1[2])+bivec2.
get_z()*(bisectp1[1]-bisectp2[1]))/determinan3;
2315 double bisetlinz1=bisectp1[2]+t*bivec1.
get_z();
2316 double bisetlinz2=bisectp2[2]+s*bivec2.
get_z();
2318 double cx=bisectp2[0]+s*bivec2.
get_x();
2319 double cy=bisectp2[1]+s*bivec2.
get_y();
2320 double cz=bisectp2[2]+s*bivec2.
get_z();
2321 double r=
sqrt(pow((cx-node1->
get_x()),2)+pow((cy-node1->
get_y()),2)+pow((cz-node1->
get_z()),2));
2323 pcircum[0]=(cx+r*norunivec.
get_x());
2324 pcircum[1]=(cy+r*norunivec.
get_y());
2325 pcircum[2]=(cz+r*norunivec.
get_z());
2328 pa[0]=node1->
get_x();
2329 pa[1]=node1->
get_y();
2330 pa[2]=node1->
get_z();
2332 pb[0]=node2->
get_x();
2333 pb[1]=node2->
get_y();
2334 pb[2]=node2->
get_z();
2336 pc[0]=node3->
get_x();
2337 pc[1]=node3->
get_y();
2338 pc[2]=node3->
get_z();
2340 pe[0]=insphp->
get_x();
2341 pe[1]=insphp->
get_y();
2342 pe[2]=insphp->
get_z();