61 std::map<MG_ELEMENT_TOPOLOGIQUE*,MG_ELEMENT_TOPOLOGIQUE*>::iterator it;
65 ele->get_topologie_sousjacente(&lst);
69 for (
int i=0;i<nb_arete;i++)
73 if (lst.
existe(mgarete)==0)
continue;
91 std::vector<integrale> tab_integrale;
93 double longueur_metrique=0.;
99 double coefficient_metrique_ti[9];
100 double coefficient_metrique_tii[9];
101 double coefficient_metrique_derive_ti[9];
106 #define ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
107 #ifndef ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
121 if (creation_metrique)
133 double facteur1=dxyz[0]*dxyz[0]*coefficient_metrique_ti[0]+dxyz[0]*dxyz[1]*coefficient_metrique_ti[3]+dxyz[0]*dxyz[2]*coefficient_metrique_ti[6]+dxyz[1]*dxyz[0]*coefficient_metrique_ti[1]+dxyz[1]*dxyz[1]*coefficient_metrique_ti[4]+dxyz[1]*dxyz[2]*coefficient_metrique_ti[7]+dxyz[2]*dxyz[0]*coefficient_metrique_ti[2]+dxyz[2]*dxyz[1]*coefficient_metrique_ti[4]+dxyz[2]*dxyz[2]*coefficient_metrique_ti[8];
134 double facteur2=ddxyz[0]*dxyz[0]*coefficient_metrique_ti[0]+dxyz[0]*ddxyz[0]*coefficient_metrique_ti[0]+dxyz[0]*dxyz[0]*coefficient_metrique_derive_ti[0]+
135 ddxyz[0]*dxyz[1]*coefficient_metrique_ti[3]+dxyz[0]*ddxyz[1]*coefficient_metrique_ti[3]+dxyz[0]*dxyz[1]*coefficient_metrique_derive_ti[3]+
136 ddxyz[0]*dxyz[2]*coefficient_metrique_ti[6]+dxyz[0]*ddxyz[2]*coefficient_metrique_ti[6]+dxyz[0]*dxyz[2]*coefficient_metrique_derive_ti[6]+
137 ddxyz[1]*dxyz[0]*coefficient_metrique_ti[1]+dxyz[1]*ddxyz[0]*coefficient_metrique_ti[1]+dxyz[1]*dxyz[0]*coefficient_metrique_derive_ti[1]+
138 ddxyz[1]*dxyz[1]*coefficient_metrique_ti[4]+dxyz[1]*ddxyz[1]*coefficient_metrique_ti[4]+dxyz[1]*dxyz[1]*coefficient_metrique_derive_ti[4]+
139 ddxyz[1]*dxyz[2]*coefficient_metrique_ti[7]+dxyz[1]*ddxyz[2]*coefficient_metrique_ti[7]+dxyz[1]*dxyz[2]*coefficient_metrique_derive_ti[7]+
140 ddxyz[2]*dxyz[0]*coefficient_metrique_ti[2]+dxyz[2]*ddxyz[0]*coefficient_metrique_ti[2]+dxyz[2]*dxyz[0]*coefficient_metrique_derive_ti[2]+
141 ddxyz[2]*dxyz[1]*coefficient_metrique_ti[4]+dxyz[2]*ddxyz[1]*coefficient_metrique_ti[4]+dxyz[2]*dxyz[1]*coefficient_metrique_derive_ti[4]+
142 ddxyz[2]*dxyz[2]*coefficient_metrique_ti[8]+dxyz[2]*ddxyz[2]*coefficient_metrique_ti[8]+dxyz[2]*dxyz[2]*coefficient_metrique_derive_ti[8];
143 double facteur3=dxyzii[0]*dxyzii[0]*coefficient_metrique_tii[0]+dxyzii[0]*dxyzii[1]*coefficient_metrique_tii[3]+dxyzii[0]*dxyzii[2]*coefficient_metrique_tii[6]+dxyzii[1]*dxyzii[0]*coefficient_metrique_tii[1]+dxyzii[1]*dxyzii[1]*coefficient_metrique_tii[4]+dxyzii[1]*dxyzii[2]*coefficient_metrique_tii[7]+dxyzii[2]*dxyzii[0]*coefficient_metrique_tii[2]+dxyzii[2]*dxyzii[1]*coefficient_metrique_tii[4]+dxyzii[2]*dxyzii[2]*coefficient_metrique_tii[8];
144 double residu=fabs(
sqrt(facteur3)-
sqrt(facteur1)-1./2./
sqrt(facteur1)*facteur2*(tii-ti));
152 #endif // ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
154 t=0.7886751345*ti+0.2113248654*tii;
156 double coefficient_metrique[9];
161 double facteur1=coord[0]*coord[0]*coefficient_metrique[0]+coord[0]*coord[1]*coefficient_metrique[3]+coord[0]*coord[2]*coefficient_metrique[6]+coord[1]*coord[0]*coefficient_metrique[1]+coord[1]*coord[1]*coefficient_metrique[4]+coord[1]*coord[2]*coefficient_metrique[7]+coord[2]*coord[0]*coefficient_metrique[2]+coord[2]*coord[1]*coefficient_metrique[4]+coord[2]*coord[2]*coefficient_metrique[8];
162 longueur_metrique=longueur_metrique+0.5*(tii-ti)*
sqrt(facteur1);
163 t=0.7886751345*tii+0.2113248654*ti;
168 facteur1=coord[0]*coord[0]*coefficient_metrique[0]+coord[0]*coord[1]*coefficient_metrique[3]+coord[0]*coord[2]*coefficient_metrique[6]+coord[1]*coord[0]*coefficient_metrique[1]+coord[1]*coord[1]*coefficient_metrique[4]+coord[1]*coord[2]*coefficient_metrique[7]+coord[2]*coord[0]*coefficient_metrique[2]+coord[2]*coord[1]*coefficient_metrique[4]+coord[2]*coord[2]*coefficient_metrique[8];
169 longueur_metrique=longueur_metrique+0.5*(tii-ti)*
sqrt(facteur1);
172 pas.li=longueur_metrique;
173 tab_integrale.insert(tab_integrale.end(),
pas);
176 int nombre_de_segment=(int)floor(longueur_metrique);
177 if (longueur_metrique-floor(longueur_metrique)>0.5) nombre_de_segment++;
178 if (nombre_de_segment<1) nombre_de_segment=1;
182 double valeur_cible=longueur_metrique/nombre_de_segment;
184 if (noeud_depart==NULL) bon_noeud=0;
191 if (noeudtemp==NULL) numnoeud++;
194 if (noeud_arrivee==NULL) bon_noeud=0;
201 if (noeudtemp==NULL) numnoeud++;
207 MG_NOEUD* noeud_precedent=noeud_depart;
209 int nb_segment_cree=0;
210 int nb_pas_integrale=tab_integrale.size();
211 for (
int i=0;i<nb_pas_integrale;i++)
213 while ((tab_integrale[i].li>(nb_segment_cree+1)*valeur_cible) && (nb_segment_cree<nombre_de_segment-1))
216 double ti=tab_integrale[i].ti;
219 if (i!=0) li=tab_integrale[i-1].li;
220 double lii=tab_integrale[i].li;
221 if (i!=nb_pas_integrale-1) tii=tab_integrale[i+1].ti;
222 t=ti+(tii-ti)/(lii-li)*((nb_segment_cree+1)*valeur_cible-li);
227 noeud_precedent=nouveau_noeud;
249 for (
int i=0;i<nb;i++)
253 for (
int i=0;i<nb;i++)
259 std::map<double,MG_NOEUD*,std::less<double> > debut;
260 std::map<double,MG_NOEUD*,std::less<double> > fin;
261 std::pair<double,MG_NOEUD*> tmp(tfin,noeud_arr);
263 std::pair<double,MG_NOEUD*> tmp2(tdeb,noeud_dep);
265 for (
int i=0;i<nb_segment;i++)
272 if (noeud1==noeud_dep) t1=tdeb;
273 else if (noeud1==noeud_arr) t1=tfin;
279 if (noeud2==noeud_dep) t2=tdeb;
280 else if (noeud2==noeud_arr) t2=tfin;
291 std::pair<double,MG_NOEUD*> tmp(t1,noeud1);
292 std::pair<double,MG_NOEUD*> tmp2(t2,noeud2);
296 std::map<double,MG_NOEUD*,std::less<double> > :: iterator itdebut;
297 std::map<double,MG_NOEUD*,std::less<double> > :: iterator itfin;
298 itdebut=debut.begin();
302 if ((itdebut->second!=itfin->second) || (nb_segment==0) )
maille(
mg_arete,(*itfin).first,(*itfin).second,(*itdebut).first,(*itdebut).second);
306 while (itdebut!=debut.end());