97 int res_projectionNoeudTriangle = 0;
98 double pt_projectionNoeudTriangle[3];
99 double signedDist_projectionNoeudTriangle;
102 if (res_projectionNoeudTriangle == 0
109 double x = (TV0TV1&TV1TV2).get_longueur();
112 if (fabs(signedDist_projectionNoeudTriangle) > x)
122 OT_VECTEUR_3D milieu_segment_xyz = .5*noeud1_xyz + .5*noeud2_xyz;
123 double longueur = (noeud2_xyz - noeud1_xyz).get_longueur();
143 grille_de_segment->rechercher(milieu_segment_xyz(0),milieu_segment_xyz(1),milieu_segment_xyz(2),longueur,liste_trouvee);
146 if ( ((noeud1==segment_trouve->get_noeud1()) && (noeud2==segment_trouve->get_noeud2())) || ((noeud1==segment_trouve->get_noeud2()) && (noeud2==segment_trouve->get_noeud1())))
148 delete segment_candidat;
152 if ( (noeud1==segment_trouve->get_noeud1()&&noeud2!=segment_trouve->get_noeud2())
153 || (noeud1==segment_trouve->get_noeud2()&&noeud2!=segment_trouve->get_noeud1())
154 || (noeud2==segment_trouve->get_noeud2()&&noeud1!=segment_trouve->get_noeud1())
155 || (noeud2==segment_trouve->get_noeud1()&&noeud1!=segment_trouve->get_noeud2()) )
162 double uvIntersectionFace[2];
168 delete segment_candidat;
178 grille_de_front->rechercher(milieu_segment_xyz(0),milieu_segment_xyz(1),milieu_segment_xyz(2),longueur,liste_trouvee);
181 MCSegment* segment_trouve=ft->get_segment();
184 delete segment_candidat;
198 double uvIntersectionFace[2];
203 delete segment_candidat;
210 mg_maillage->ajouter_mg_segment(segment_candidat);
211 grille_de_segment->inserer(segment_candidat);
212 *nv_segment=segment_candidat;
219 grille_de_segment->supprimer(__segment);
220 mg_maillage->supprimer_mg_segmentid(__segment->
get_id());
225 MCNode * iiNode = __interiorIsolatedNode;
227 double angle = M_PI * 44/180;
231 OT_MATRICE_3D planeFrame = GeometricTools::GetPlaneFrame(normale_face);
233 OT_VECTEUR_3D normale_plan_directeur = direction_placement & normale_face;
236 double density_tensor[9];
237 metrique->evaluer(iiNode->
get_coord(), density_tensor);
238 taille = pow(density_tensor[0],-0.5);
239 double longueur_desiree=0.8660254037844386*taille;
242 ot_trajectoire_placement.
MakeOffset(iiNode, direction_placement, longueur_desiree);
247 double longueur_recherche=1.1547*longueur_desiree;
250 grille_de_front->rechercher(xdecale.
get_x(),xdecale.
get_y(),xdecale.
get_z(),longueur_recherche,liste_trouvee);
253 std::multimap <double, MCNode *> map_noeud_trouve;
254 std::map <MCNode *, MG_FRONT_2D*> map_front_trouve;
257 front_courant=liste_trouvee.
get_suivant(it_liste_trouvee)
261 MCNode* noeud_front1=(
MCNode*)front_courant->get_noeud1();
262 MCNode* noeud_front2=front_courant->get_noeud2();
268 if ( distanceEuclidPcPf <= 1.1547*longueur_desiree && distanceEuclidMPf <= 1.5*longueur_desiree)
269 if (map_front_trouve.find(noeud_front1) == map_front_trouve.end())
272 map_noeud_trouve.insert(std::make_pair(distanceEuclidPcPf,noeud_front1));
273 map_front_trouve[noeud_front1]=front_courant;
277 int nb_front_essaye=0;
278 for (std::multimap<double,MCNode*>::iterator itMCNode = map_noeud_trouve.begin();
279 itMCNode != map_noeud_trouve.end();
282 double distance_reference = itMCNode->first;
283 MCNode * noeud = itMCNode->second;
284 MG_FRONT_2D * front_reference = map_front_trouve[noeud];
286 if (distance_reference > longueur_desiree*1.1547)
break;
292 if ( distanceEuclidPcPf > 1.1547*longueur_desiree || distanceEuclidMPf > 1.5*longueur_desiree)
296 double distanceMPf = operateur_dist_MPf.
Find();
297 if ( distanceMPf > 1.5*longueur_desiree )
301 double distancePcPf = operateur_dist_PcPf.
Find();
302 if ( distancePcPf > 1.1547*longueur_desiree )
305 (*front_rencontre)=front_reference;
306 (*noeud_solution)=noeud;
310 std::ostringstream out;
311 out <<
"genere_noeud: found front segment " << front_reference->
get_segment()->
get_id() <<
" and connected isolated interior node " << __interiorIsolatedNode->
get_id() <<
" to node " << noeud->
get_id();
318 mg_maillage->ajouter_mg_noeud(noeud_decale);
321 std::ostringstream out;
322 out <<
"genere_noeud: Node " << noeud_decale->
get_id() <<
" created from interior isolated node " << __interiorIsolatedNode->
get_id();
326 noeud_decale->
Creator = MCNode::mailleur_2d;
327 (*noeud_solution)=noeud_decale;
328 (*front_rencontre)=NULL;
381 OT_VECTEUR_3D direction_placement=normale_face&normale_plan_directeur;
385 double density_tensor[9];
386 metrique->evaluer(milieu_front->
get_coord(), density_tensor);
387 taille = pow(density_tensor[0],-0.5);
389 longueur_desiree = longueur_desiree/front->
get_ifail();
392 ot_trajectoire_placement.
MakeOffset(milieu_front, direction_placement, longueur_desiree);
397 double longueur_recherche=1.1547*longueur_desiree;
401 grille_de_front->rechercher(xdecale.
get_x(),xdecale.
get_y(),xdecale.
get_z(),longueur_recherche,liste_trouvee);
404 std::multimap <double, MCNode *> map_noeud_trouve;
405 std::map <MCNode *, MG_FRONT_2D*> map_front_trouve;
406 std::map <MCNode *, double> map_angle_front_trouve;
409 front_courant=liste_trouvee.
get_suivant(it_liste_trouvee)
413 MCNode* noeud_front1=(
MCNode*)front_courant->get_noeud1();
414 MCNode* noeud_front2=front_courant->get_noeud2();
420 if ( distanceEuclidPcPf <= 1.1547*longueur_desiree && distanceEuclidMPf <= 1.5*longueur_desiree)
424 if (map_front_trouve.find(noeud_front1) != map_front_trouve.end())
429 noeud_front1->
NormalMCFace(__mcFace,normale_face_front);
435 OT_VECTEUR_3D vecteur_basev = normale_face_front & vecteur_baseu;
436 vecteur_baseu.
norme();
437 vecteur_basev.
norme();
438 vecteur_front.
norme();
439 double cosangle=vecteur_baseu*vecteur_front;
440 double sinangle=vecteur_basev*vecteur_front;
442 if (cosangle>1.) cosangle=1.;
443 if (cosangle<-1.) cosangle=(-1.);
444 double angle=
acos(cosangle);
445 if (sinangle<(-0.0001)) angle=(-angle);
446 if (angle<0.) angle=angle+2.*M_PI;
447 if (angle<map_angle_front_trouve[noeud_front1])
449 map_angle_front_trouve[noeud_front1]=angle;
450 map_front_trouve[noeud_front1]=front_courant;
458 noeud_front1->
NormalMCFace(__mcFace,normale_face_front);
464 OT_VECTEUR_3D vecteur_basev = normale_face_front & vecteur_baseu;
465 vecteur_baseu.
norme();
466 vecteur_basev.
norme();
467 vecteur_front.
norme();
468 double cosangle=vecteur_baseu*vecteur_front;
469 double sinangle=vecteur_basev*vecteur_front;
471 if (cosangle>1.) cosangle=1.;
472 if (cosangle<-1.) cosangle=(-1.);
473 double angle=
acos(cosangle);
474 if (sinangle<(-0.0001)) angle=(-angle);
475 if (angle<0.) angle=angle+2.*M_PI;
476 map_noeud_trouve.insert(std::make_pair(distanceEuclidMPf,noeud_front1));
477 map_front_trouve[noeud_front1]=front_courant;
478 map_angle_front_trouve[noeud_front1]=angle;
485 int nb_front_essaye=0;
486 for (std::multimap<double,MCNode*>::iterator itMCNode = map_noeud_trouve.begin();
487 itMCNode != map_noeud_trouve.end();
490 double distance_reference = itMCNode->first;
491 MCNode * noeud = itMCNode->second;
492 MG_FRONT_2D * front_reference = map_front_trouve[noeud];
494 if (distance_reference > 1.1547*longueur_desiree)
break;
500 if ( distanceEuclidPcPf > 1.1547*longueur_desiree || distanceEuclidMPf > 1.5*longueur_desiree)
503 std::vector< MCNode * > shortestPathNodes;
504 std::vector< MG_ELEMENT_TOPOLOGIQUE * > shortestPathTopo;
507 double distanceMPf = operateur_dist_MPf.
Find(&shortestPathNodes, &shortestPathTopo);
508 if ( distanceMPf > 2 * distanceEuclidMPf )
512 bool test_operateur_dist_MPf_Intersect_MCEdge =
false;
514 for (
int k=1; k+1<shortestPathNodes.size(); k++)
516 MCNode * mcNode_tmp = shortestPathNodes[k];
519 test_operateur_dist_MPf_Intersect_MCEdge =
true;
524 if (test_operateur_dist_MPf_Intersect_MCEdge)
528 double distancePcPf = operateur_dist_PcPf.
Find();
529 if ( distancePcPf > 1.1547*longueur_desiree )
532 if ( triangles_sont_dans_meme_sens( __mcFace, noeud1, noeud, noeud_decale, noeud2 ) == 0)
544 (*front_rencontre)=front_reference;
545 (*noeud_rencontre)=noeud;
548 std::ostringstream out;
554 mg_maillage->ajouter_mg_noeud(noeud_decale);
556 noeud_decale->
Creator = MCNode::mailleur_2d;
559 std::ostringstream out;
563 (*noeud_rencontre)=noeud_decale;
564 (*front_rencontre)=NULL;
584 double MAILLEUR2D::calcule_distance_metrique(
MG_FACE* mgface,
double u1,
double v1,
double u2,
double v2,
double du,
double dv)
586 double longueur_calculee=0.;
587 double param_debut[2]={u1-du,v1-dv};
589 mgface->
get_EFG(param_debut,E,F,G);
601 double t=0.7886751345*ti+0.2113248654*tii;
602 double u=u1+t*(u2-u1);
603 double v=v1+t*(v2-v1);
606 double param_integration1[2]={u-du,v-dv};
607 double tenseur_metrique[9];
610 if (creation_metrique) metrique->evaluer(param_integration1,tenseur_metrique);
614 mgface->
evaluer(param_integration1,xyz);
615 metrique->evaluer(xyz,tenseur_metrique);
617 mgface->
deriver(param_integration1,xyzdu,xyzdv);
618 double t3 = xyzdu[0]*ut+xyzdv[0]*vt;
619 double t7 = xyzdu[1]*ut+xyzdv[1]*vt;
620 double t11 = xyzdu[2]*ut+xyzdv[2]*vt;
621 double t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
622 double t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
623 double t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
624 double facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
625 longueur_calculee=longueur_calculee+0.5*(tii-ti)*
sqrt(facteur);
626 t=0.7886751345*tii+0.2113248654*ti;
629 double param_integration2[2]={u-du,v-dv};
630 if (creation_metrique) metrique->evaluer(param_integration2,tenseur_metrique);
634 mgface->
evaluer(param_integration2,xyz);
635 metrique->evaluer(xyz,tenseur_metrique);
637 mgface->
deriver(param_integration2,xyzdu,xyzdv);
638 t3 = xyzdu[0]*ut+xyzdv[0]*vt;
639 t7 = xyzdu[1]*ut+xyzdv[1]*vt;
640 t11 = xyzdu[2]*ut+xyzdv[2]*vt;
641 t13 = t3*tenseur_metrique[0]+t7*tenseur_metrique[3]+t11*tenseur_metrique[6];
642 t18 = t3*tenseur_metrique[1]+t7*tenseur_metrique[4]+t11*tenseur_metrique[7];
643 t23 = t3*tenseur_metrique[2]+t7*tenseur_metrique[5]+t11*tenseur_metrique[8];
644 facteur = (t13*xyzdu[0]+t18*xyzdu[1]+t23*xyzdu[2])*ut+(t13*xyzdv[0]+t18*xyzdv[1]+t23*xyzdv[2])*vt;
645 longueur_calculee=longueur_calculee+0.5*(tii-ti)*
sqrt(facteur);
647 return longueur_calculee;
655 MCNode *mgnoeud[3]={mgnoeud1,mgnoeud2,mgnoeud3};
658 mgsegment[i]=(
MCSegment*)mg_maillage->get_mg_segment(mgnoeud[i]->
get_id(),mgnoeud[(i+1)%3]->get_id());
659 if (mgsegment[i]==NULL)
661 printf(
"Pb : le segment n'existe pas pour inserer le triangle!!!\n");
662 mgsegment[i] =
new MCSegment(topo,mgnoeud[i],mgnoeud[(i+1)%3]);
663 mg_maillage->ajouter_mg_segment(mgsegment[i]);
667 mg_maillage->ajouter_mg_triangle(mtriangle);
668 _nbTriangles[topo]++;
671 std::pair<const double,M3D_MCTriangle*> tmp(mtriangle->
get_qualite(),mtriangle);
672 lst_tri_qual.insert(tmp);
690 if (normal1 * normal1bis < 0)
return 0;
707 if (nmat*n1n2<0)
return 0;
713 if (mg_noeud->
Creator != MCNode::mailleur_2d)
722 for (
int i=0;i<nb_tri;i++)
735 else if (no2==mg_noeud)
740 else if (no3==mg_noeud)
747 xyzopt += noeud1_xyz;
748 xyzopt += noeud2_xyz;
760 double ddeb=(xyzopt-xyz1).get_longueur();
763 double qual=qual_dep;
764 double testu[8]={1.,-1.,0.,0.,0.707106781,-0.707106781,-0.707106781,0.707106781};
765 double testv[8]={0.,0.,1.,-1.,0.707106781,0.707106781,-0.707106781,-0.707106781};
776 OT_MATRICE_3D planeFrame=GeometricTools::GetPlaneFrame(xyznormal);
777 for (
int nb_essai=0;nb_essai<8;nb_essai++)
785 uv[0]=testu[nb_essai];
786 uv[1]=testv[nb_essai];
792 OT_VECTEUR_3D normale_plan_directeur=direction_placement&xyznormal;
793 double longueur_desiree=d;
795 ot_trajectoire_placement.
MakeOffset(xi, direction_placement, longueur_desiree);
800 for (
int i=0;i<nb_tri;i++)
809 if (no1==mg_noeud) xyz1=xyz;
810 if (no2==mg_noeud) xyz2=xyz;
811 if (no3==mg_noeud) xyz3=xyz;
821 if (normal*n1n2<0.0001) qualtmp=0.;
822 if (qualtmp<qual1) qual1=qualtmp;
840 if (qualcoq<qual+0.0001)
848 if (xi && xi != mg_noeud && xi->
get_nb_reference() == 0 ) {
delete xi; xi=0;}
867 x->
Creator = MCNode::mailleur_2d_bouge_point;
886 _mcFace->calcul_normale_unitaire(milieu_front->
GetRefFaceMapping(), normale_face, &nbRefFaces);
887 OT_VECTEUR_3D direction_placement=normale_face&normale_plan_directeur;
892 double density_tensor[9];
893 metrique->evaluer(milieu_front->
get_coord(), density_tensor);
894 taille = pow(density_tensor[0],-0.5);
896 longueur_desiree = longueur_desiree/front->
get_ifail();
898 MCSegment * segment_M_N3 =
new MCSegment(0, _mcFace, milieu_front, noeud3, 2 * longueur_desiree);
901 std::vector <MG_ELEMENT_TOPOLOGIQUE*> topos = segment_M_N3->
GetPolylineTopos();
902 std::vector <MG_ELEMENT_TOPOLOGIQUE*>::iterator topos_it;
904 for ( topos_it = topos.begin(); topos_it != topos.end(); topos_it ++)
924 if (is_interior == 1)
int TestInteriorDirection(double __direction[3])
MCNodePolyline * MakeOffset(MCNode *__startNode, OT_VECTEUR_3D __direction, double __offsetLength)
virtual void change_qualite(double val)
virtual double get_qualite(void)
void calcul_normale_unitaire(double *uv, double *xyz)
enum CAD4FE::MCNode::CreatorType Creator
FMap & GetRefFaceMapping()
void NormalMCFace(MCFace *__mcFace, double *__normal)
std::vector< MG_ELEMENT_TOPOLOGIQUE * > GetPolylineTopos()
MCNode * get_noeud1(void)
MCNode * get_noeud2(void)
MCSegment * get_segment(void)
double Find(std::vector< MCNode * > *__shortestPathNodes=0, std::vector< MG_ELEMENT_TOPOLOGIQUE * > *__shortestPathTopo=0)
void supprime_segment(MG_SEGMENT *mgsegment)
int genere_noeud(MG_FACE *mgface, MG_FRONT_2D *front, MG_FRONT_2D **front_rencontre, MG_NOEUD **noeud)
int noeud_est_dans_triangle(MG_NOEUD *noeud, MG_TRIANGLE *triangle)
int insere_segment(MG_FACE *mgface, MG_SEGMENT **nv_segment, MG_NOEUD *noeud1, MG_NOEUD *noeud2, int type_verication)
int triangle_est_dans_bon_sens(MG_FACE *face, MG_NOEUD *noeud1, MG_NOEUD *noeud2, MG_NOEUD *noeud3)
MG_TRIANGLE * insere_triangle(MG_ELEMENT_TOPOLOGIQUE *topo, class MG_NOEUD *mgnoeud1, class MG_NOEUD *mgnoeud2, class MG_NOEUD *mgnoeud3)
MG_ELEMENT_TOPOLOGIQUE * get_lien_topologie(void)
virtual int get_dimension(void)=0
virtual void evaluer(double *uv, double *xyz)
virtual void get_EFG(double *uv, double &E, double &F, double &G)
virtual void deriver(double *uv, double *xyzdu, double *xyzdv)
virtual double * get_coord(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud1(void)
virtual double get_longueur(void)
TPL_LISTE_ENTITE< class MG_TRIANGLE * > * get_lien_triangle(void)
virtual MG_NOEUD * get_noeud2(void)
virtual MG_NOEUD * get_noeud3(void)
virtual MG_NOEUD * get_noeud1(void)
virtual MG_NOEUD * get_noeud2(void)
static double qualite_triangle(double *noeud1, double *noeud2, double *noeud3)
static int project_PointTriangle(double P0[3], double TV0[3], double TV1[3], double TV2[3], double I[3], double *IT=0)
static double VEC3_DISTANCE_VEC3(double a[3], double b[3])
OT_VECTEUR_3D & get_vecteur2(void)
OT_VECTEUR_3D & get_vecteur1(void)
int get_nb_reference(void)
virtual double get_z(void) const
virtual double get_longueur(void) const
virtual double get_y(void) const
virtual double get_x(void) const
virtual X get_premier(ITERATEUR &it)
virtual X get_suivant(ITERATEUR &it)
std::map< unsigned long, X, std::less< unsigned long > >::iterator ITERATEUR
MCNode * MCSegment_Middle(MCSegment *__seg)
bool Intersection_MCSegment_MCSegment_tolerance(MCSegment *__seg1, MCSegment *__seg2, double __uv[2], MG_FACE **__face, double __tolerance)
double2 sin(double2 &val)
double2 sqrt(double2 &val)
double2 acos(double2 &val)
double2 cos(double2 &val)