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));
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);
void maille_points(std::vector< OT_VECTEUR_3D > &__points)
MAILLEUR1D(MG_MAILLAGE *mgmai, MG_GEOMETRIE *mggeo, CAD4FE::MCEdge *mgarete=NULL, FCT_TAILLE *fct_taille=NULL)
MG_SOMMET * IsPointInRefVertex(PolyCurve *__polycurve, double __nodeCoord[3], double __relativeTolerance)
MG_MAILLAGE * mg_maillage
PolyCurve * GetPolyCurve()
enum CAD4FE::MCNode::CreatorType Creator
void Parameter_SToRefEdgeT(double __s, unsigned *__iEdge, double *__t, double *__dt, bool __curvilinearLength)
MG_SOMMET * GetRefVertex(unsigned int)
double get_longueur(double __s_min=-1, double __s_max=-1, double precision=1E-6)
unsigned GetRefEdgeCount()
virtual void evaluer(double *param, double *resultat)=0
virtual void deriver(double *param, double *resultat, int num_param=0)=0
virtual void deriver_seconde(double t, double *ddxyz, double *dxyz=NULL, double *xyz=NULL)
virtual void deriver(double t, double *xyz)
virtual void evaluer(double t, double *xyz)
virtual class MG_COURBE * get_courbe(void)
virtual class MG_COSOMMET * get_cosommet2(void)
virtual class MG_COSOMMET * get_cosommet1(void)
virtual void inverser(double &t, double *xyz, double precision=1e-6)
virtual MG_SOMMET * get_sommet(void)
virtual int est_periodique(void)=0
virtual double get_periode(void)=0
virtual TPL_SET< MG_ELEMENT_MAILLAGE * > * get_lien_maillage(void)
MG_NOEUD * get_mg_noeudid(unsigned long num)
virtual void enregistrer_sous_mesh_1D(std::ostream &o)
MG_SEGMENT * ajouter_mg_segment(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, int origine, double longue=0.0, unsigned long num=0)
MG_NOEUD * ajouter_mg_noeud(MG_ELEMENT_TOPOLOGIQUE *topo, double xx, double yy, double zz, int origine, unsigned long num=0)
virtual void evaluer(double *xyz)=0
virtual MG_POINT * get_point(void)
virtual double get_longueur2(void) const
double2 sqrt(double2 &val)