58 double sqAbsoluteTolerance = __relativeTolerance*__polycurve->
get_longueur();
59 sqAbsoluteTolerance *= sqAbsoluteTolerance;
62 for (i=0;i<nbRefV;i++)
69 if (sqdistNodeToVertex < sqAbsoluteTolerance)
82 int creation_metrique=0;
85 printf(
"Erreur : metrique = NULL\n");
96 std::vector<double> tab_integrale_ti, tab_integrale_li;
98 double longueur_metrique=0.;
103 double coefficient_metrique_ti[9];
104 double coefficient_metrique_tii[9];
105 double coefficient_metrique_derive_ti[9];
110 #define ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
111 #ifndef ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
125 if (creation_metrique)
137 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];
138 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]+
139 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]+
140 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]+
141 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]+
142 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]+
143 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]+
144 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]+
145 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]+
146 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];
149 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];
150 double residu=fabs(
sqrt(facteur3)-
sqrt(facteur1)-1./2./
sqrt(facteur1)*facteur2*(tii-ti));
158 #endif // ON_A_ABANDONNE_ET_ON_PREND_DT_EGALE_T2_MOINS_T1_DIVISE_PAR_1000
160 t=0.7886751345*ti+0.2113248654*tii;
162 double coefficient_metrique[9];
172 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];
173 longueur_metrique=longueur_metrique+0.5*(tii-ti)*
sqrt(facteur1);
174 t=0.7886751345*tii+0.2113248654*ti;
184 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];
186 longueur_metrique=longueur_metrique+0.5*(tii-ti)*
sqrt(facteur1);
188 tab_integrale_ti.push_back(ti);
189 tab_integrale_li.push_back(longueur_metrique);
192 int nombre_de_segment=(int)floor(longueur_metrique);
193 if (longueur_metrique-floor(longueur_metrique)>0.5) nombre_de_segment++;
194 if (nombre_de_segment<1) nombre_de_segment=1;
198 double valeur_cible=longueur_metrique/nombre_de_segment;
206 if (mg_noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
215 if (mg_noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
220 MCNode* noeud_precedent=noeud_depart;
222 int nb_segment_cree=0;
223 int nb_pas_integrale=tab_integrale_ti.size();
224 for (
int i=0;i<nb_pas_integrale;i++)
226 while ((tab_integrale_li[i]>(nb_segment_cree+1)*valeur_cible) && (nb_segment_cree<nombre_de_segment-1))
228 double ti=tab_integrale_ti[i];
231 if (i!=0) li=tab_integrale_li[i-1];
232 double lii=tab_integrale_li[i];
233 if (i!=nb_pas_integrale-1) tii=tab_integrale_ti[i+1];
234 t=ti+(tii-ti)/(lii-li)*((nb_segment_cree+1)*valeur_cible-li);
238 MG_ARETE * nouveau_noeud_refEdge = NULL;
240 double nouveau_noeud_refEdgeT = 0, Parameter_SToRefEdgeDerT;
243 MCNode * nouveau_noeud = NULL;
245 if (refVertex == NULL)
247 nouveau_noeud =
new MCNode(
mcEdge,nouveau_noeud_refEdge,nouveau_noeud_refEdgeT,coo);
251 nouveau_noeud =
new MCNode(
mcEdge,refVertex,coo[0],coo[1],coo[2]);
258 noeud_precedent=nouveau_noeud;
269 char fichierProgression1D [1024];
270 sprintf(fichierProgression1D,
"%s%s",
"c:\\temp\\void",
"_1D.mai");
271 ofstream o3(fichierProgression1D,ios::out|ios::trunc);
273 o3.setf(ios::showpoint);
277 if (creation_metrique==1)
295 std::set <double> tab_t;
296 std::set <double>::iterator tab_t_it1, tab_t_it2, tab_t_it;
301 for (
int i=0; i<__points.size(); i++)
307 double distance = (xyz-__points[i]).get_longueur();
308 tab_t_it1 = tab_t.lower_bound(t);
309 tab_t_it2 = tab_t.upper_bound(t);
310 double t_dist = 1E99;
311 for (tab_t_it = tab_t_it1; tab_t_it != tab_t.end(); tab_t_it++)
313 t_dist = std::min(t_dist, fabs(t-*tab_t_it));
314 if (tab_t_it == tab_t_it2)
break;
318 printf(
"node #%d/%lu is too far from edge %lu\n", i, __points.size(),
mcEdge->
get_id());
321 if (t_dist < 0.001 * t2-t1)
323 printf(
"node #%d/%lu already exists in edge %lu\n", i, __points.size(),
mcEdge->
get_id());
338 if (mg_noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
347 if (mg_noeudtemp==NULL) numnoeud++;
else bon_noeud=1;
352 MCNode* noeud_precedent=noeud_depart;
354 int nb_segment_cree=0;
355 tab_t_it2 = tab_t.begin();
356 for (tab_t_it1 = tab_t.begin(); nb_segment_cree+2 < tab_t.size(); tab_t_it1++)
359 if (tab_t_it2 == tab_t.end())
break;
361 double ti=*tab_t_it1;
362 double tii=*tab_t_it2;
364 MG_ARETE * nouveau_noeud_refEdge = NULL;
366 double nouveau_noeud_refEdgeT = 0, Parameter_SToRefEdgeDerT;
369 MCNode * nouveau_noeud = NULL;
372 if (refVertex == NULL)
374 nouveau_noeud =
new MCNode(
mcEdge,nouveau_noeud_refEdge,nouveau_noeud_refEdgeT,coo);
378 nouveau_noeud =
new MCNode(
mcEdge,refVertex,coo[0],coo[1],coo[2]);
385 noeud_precedent=nouveau_noeud;
395 char fichierProgression1D [1024];
396 sprintf(fichierProgression1D,
"%s%s",
"c:\\temp\\void",
"_1D.mai");
397 ofstream o3(fichierProgression1D,ios::out|ios::trunc);
399 o3.setf(ios::showpoint);