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)