45 double *xyz1,*xyz2,*xyz3,*xyz4;
55 double *xyz1,*xyz2,*xyz3;
64 double *xyz1,*xyz2,*xyz3;
74 double *xyz1,*xyz2,*xyz3;
101 return get_angle_par_noeud<MG_NOEUD*>(noeud1,noeud2,noeud3,noeud4,noeud5,noeud6);
112 std::set<MG_NOEUD*>setNodesTopoDimension0;
125 for (
int i=0; i<2; i++)
128 setNodesTopoDimension0.insert(nos[i]);
132 nNodesVertex = setNodesTopoDimension0.size();
179 unsigned nb_triangles;
187 for (i=0;i<2;i++) NTopo[i] = N[i]->get_lien_topologie();
191 printf(
"triangles->get_nb()=%d\n",triangles->
get_nb());
193 nb_triangles = triangles->
get_nb();
195 for (i = 0; i < nb_triangles; i++)
196 T[i] = triangles->
get(i);
198 for (i = 0; i < nb_triangles; i++)
202 bool triangle_already_processed =
false;
206 printf(
"triangle_already_processed ! Triangle %d == Triangle %d\n", j, i);
207 triangle_already_processed =
true;
210 if (triangle_already_processed)
214 MG_NOEUD *TN0[3], * Nop = NULL, *TN1[3], *TN2[3];
228 else if (TN0[j] == N[1])
269 N[i]->change_lien_topologie(NTopo[i]);
271 __segs[i]->change_lien_topologie(STopo);
273 if ( __deleteOriginalSeg )
304 std::vector<MG_NOEUD*>& __visitedNodes,
MG_NOEUD * & __nextNode,
MG_SEGMENT * & __nextSeg)
309 if (__visitedNodes.size() == 0)
313 MG_NOEUD * lastNode = __visitedNodes[__visitedNodes.size()-1];
317 for (
int it_seg = 0; it_seg < adjSegs->
get_nb(); it_seg++)
320 if ( __unvisitedSegs.find(adjSeg) != __unvisitedSegs.end() )
324 if (__nextNode == lastNode )
330 if (__nextSeg == NULL)
332 double minDist = 1E99;
335 for (std::set<MG_SEGMENT*>::iterator it_seg = __unvisitedSegs.begin();
336 it_seg != __unvisitedSegs.end();
341 if (distance < minDist)
348 if (closestSeg||minDist < 1E-6)
350 __nextSeg = closestSeg;
354 for (
int i=0;i<2;i++)
357 for (
int it_seg = 0; it_seg < adjSegs->
get_nb(); it_seg++)
360 if ( adjSeg != closestSeg && __unvisitedSegs.find(adjSeg) != __unvisitedSegs.end() )
363 __visitedNodes.push_back (n[i%2]);
372 if (__nextNode) __visitedNodes.push_back (__nextNode);
373 if (__nextSeg) __visitedSegs.push_back (__nextSeg);
374 if (__nextSeg) __unvisitedSegs.erase (__nextSeg);
384 for ( std::set<MG_SEGMENT*>::const_iterator it_seg = __unvisitedSegs.begin();
385 it_seg != __unvisitedSegs.end();
389 V[0] = (*it_seg)->get_noeud1();
390 V[1] = (*it_seg)->get_noeud2();
391 for (
int i=0; i<2; i++)
393 if (
V[i]->get_lien_topologie() &&
V[i]->get_lien_topologie()->get_dimension() == 0)
428 std::vector<MG_NOEUD*> & __visitedNodes )
433 if (lastNode == NULL && __unvisitedSegs.size() )
434 lastNode = (*__unvisitedSegs.begin())->get_noeud1();
436 if (lastNode == NULL)
439 __visitedNodes.push_back(lastNode);
448 #undef _IdentifyEdge_DEBUG
453 std::set<MG_ARETE*> commonEdges;
456 if (commonEdges.size() == 1)
458 __lst_edge.insert(*commonEdges.begin()) ;
462 #ifdef _IdentifyEdge_DEBUG
463 printf(
"_IdentifyEdge : There is several edges candidate for this topology\n");
464 for (std::set <MG_SOMMET *>::iterator it_vertex = __vertices.begin(); it_vertex != __vertices.end(); it_vertex++)
465 printf(
"V[%d] = %d\n", std::distance(__vertices.begin(), it_vertex), (*it_vertex)->get_id());
467 for ( std::set<MG_ARETE*>::const_iterator
468 it_edge = commonEdges.begin();
469 it_edge != commonEdges.end();
472 printf(
"Candidate : edge ID %d, v1_ID=%d, v2_ID=%d\n", (*it_edge)->get_id(), (*it_edge)->get_cosommet1()->get_sommet()->get_id(), (*it_edge)->get_cosommet2()->get_sommet()->get_id());
475 for ( std::set<MG_ARETE*>::const_iterator
476 it_edge = commonEdges.begin();
477 it_edge != commonEdges.end();
486 if (__vertices.find(
V[0]) != __vertices.end()&&__vertices.find(
V[1]) != __vertices.end())
488 __lst_edge.insert(common_edge);
489 #ifdef _IdentifyEdge_DEBUG
490 printf(
"Candidate edge %d has been choosen because: V1=%d V2=%d\n", common_edge->
get_id(),
V[0]->get_id(),
V[1]->get_id());
498 MG_MAILLAGE_OUTILS::IdentifyEdge2(std::set <MG_SOMMET *> __vertices, std::set<MG_FACE *> & __adjacentFaces, std::set<MG_ARETE *> & __lst_edge, std::vector<MG_NOEUD*> & __nodes)
501 std::set<MG_ARETE*> commonEdges;
504 if (commonEdges.size() == 1)
506 __lst_edge.insert(*commonEdges.begin()) ;
510 #ifdef _IdentifyEdge_DEBUG
511 printf(
"_IdentifyEdge : There is several edges candidate for this topology\n");
512 for (std::set <MG_SOMMET *>::iterator it_vertex = __vertices.begin(); it_vertex != __vertices.end(); it_vertex++)
513 printf(
"V[%d] = %d\n", std::distance(__vertices.begin(), it_vertex), (*it_vertex)->get_id());
515 for ( std::set<MG_ARETE*>::const_iterator
516 it_edge = commonEdges.begin();
517 it_edge != commonEdges.end();
520 printf(
"Candidate : edge ID %d, v1_ID=%d, v2_ID=%d\n", (*it_edge)->get_id(), (*it_edge)->get_cosommet1()->get_sommet()->get_id(), (*it_edge)->get_cosommet2()->get_sommet()->get_id());
523 for ( std::set<MG_ARETE*>::const_iterator
524 it_edge = commonEdges.begin();
525 it_edge != commonEdges.end();
534 if (__vertices.find(
V[0]) != __vertices.end()&&__vertices.find(
V[1]) != __vertices.end())
536 __lst_edge.insert(common_edge);
537 #ifdef _IdentifyEdge_DEBUG
538 printf(
"Candidate edge %d has been choosen because: V1=%d V2=%d\n", common_edge->
get_id(),
V[0]->get_id(),
V[1]->get_id());
543 if (__lst_edge.size() > 1)
550 std::set<MG_ARETE*> lst_candidate_edge;
552 for ( std::set<MG_ARETE*>::const_iterator
553 it_edge = __lst_edge.begin();
554 it_edge != __lst_edge.end();
557 MG_ARETE * candidate_edge = *it_edge;
563 if (__vertices.find(
V[0]) != __vertices.end()&&__vertices.find(
V[1]) != __vertices.end())
565 lst_candidate_edge.insert(candidate_edge);
569 if (lst_candidate_edge.size() > 1 && __nodes.size() > 2)
572 *__edge = *(lst_candidate_edge.begin());
577 const std::set<MG_ARETE *> & __lst_edge,
578 const std::vector<MG_NOEUD*> & __nodes,
579 const std::vector<MG_SEGMENT*> & __segs,
582 std::set<MG_ARETE*> lst_candidate_edge;
584 for ( std::set<MG_ARETE*>::const_iterator
585 it_edge = __lst_edge.begin();
586 it_edge != __lst_edge.end();
589 MG_ARETE * candidate_edge = *it_edge;
595 if (__vertices.find(
V[0]) != __vertices.end()&&__vertices.find(
V[1]) != __vertices.end())
597 lst_candidate_edge.insert(candidate_edge);
601 if (lst_candidate_edge.size() > 1 && __nodes.size() > 2)
603 if (lst_candidate_edge.size()==0)
606 *__edge = *(lst_candidate_edge.begin());
611 std::set < std::set < MG_FACE * > > neighbouringFaces;
612 std::map < MG_ARETE *, int > mapEdgeMatchCount;
614 for (std::set<MG_ARETE *>::iterator it2 = __lst_edge.begin();
615 it2 != __lst_edge.end(); it2++)
618 mapEdgeMatchCount [ edge ] = 0;
621 for (std::vector<MG_SEGMENT*>::iterator it = __segments.begin();
622 it != __segments.end();
626 std::set <MG_FACE *>
f;
628 for (
int j=0; j<nb_triangle; j++)
639 neighbouringFaces.insert(
f);
642 for (std::set < std::set < MG_FACE * > >::iterator it1 = neighbouringFaces.begin();
643 it1 != neighbouringFaces.end(); it1++)
645 std::set < MG_FACE * > adjacentFaces = *it1;
646 std::set<MG_ARETE*> commonEdges;
649 for (std::set<MG_ARETE *>::iterator it2 = __lst_edge.begin();
650 it2 != __lst_edge.end(); it2++)
654 if ( commonEdges.find (edge) != commonEdges.end() )
655 mapEdgeMatchCount [ edge ] ++;
659 for (std::map < MG_ARETE *, int >::iterator it2 = mapEdgeMatchCount.begin();
660 it2 != mapEdgeMatchCount.end(); it2++)
663 int score = it2->second;
667 __lst_edge.erase (edge);
675 std::set<MG_ARETE*> lst_candidate_edge;
677 for ( std::set<MG_ARETE*>::const_iterator
678 it_edge = __lst_edge.begin();
679 it_edge != __lst_edge.end();
682 MG_ARETE * candidate_edge = *it_edge;
688 if (__vertices.find(
V[0]) != __vertices.end()&&__vertices.find(
V[1]) != __vertices.end())
690 lst_candidate_edge.insert(candidate_edge);
696 if (lst_candidate_edge.size() == 0)
698 printf(
"Error IdentifyEdge3: _FilterSegmentsAndEdgeAdjacentToSameFaces discarded all candidate edges !\n");
702 if (lst_candidate_edge.size() > 1 && lst_candidate_edge.size())
706 *__edge = *(lst_candidate_edge.begin());
714 xyz_node[0] = test_node->
get_x();
715 xyz_node[1] = test_node->
get_y();
716 xyz_node[2] = test_node->
get_z();
724 double xyz_projection [3];
729 candidate_edge->
inverser(edge_param, xyz_node);
730 candidate_edge->
evaluer(edge_param, xyz_projection);
734 d[i] = xyz_projection[i] - xyz_node[i];
736 distance =
sqrt(d[0]*d[0]+d[1]*d[1]+d[2]*d[2]);
747 if (__nodes.size() < 3)
749 printf(
"Warning : can't perform geometric verification on a node because there is %d nodes only !\n",(
int)__nodes.size());
754 xyz[0] = .5*__nodes[0]->get_x()+.5*__nodes[1]->get_x();;
755 xyz[1] = .5*__nodes[0]->get_y()+.5*__nodes[1]->get_y();;
756 xyz[2] = .5*__nodes[0]->get_z()+.5*__nodes[1]->get_z();;
761 xyz[0] = __nodes[1]->get_x();
762 xyz[1] = __nodes[1]->get_y();
763 xyz[2] = __nodes[1]->get_z();
766 std::set<MG_ARETE*> new_lst_edge;
769 double minDist = 1E100;
771 for (std::set<MG_ARETE*>::iterator it_edge = __lst_edge.begin();
772 it_edge != __lst_edge.end();
775 MG_ARETE * candidate_edge = *it_edge;
778 if (minDist > distance)
781 closestEdge = candidate_edge;
788 new_lst_edge.insert (candidate_edge);
792 if (new_lst_edge.size() == 0)
793 new_lst_edge.insert(closestEdge);
795 __lst_edge = new_lst_edge;
800 double minDist=1E308;
801 double closestPointInAllSegs[3];
803 for (std::vector<MG_SEGMENT*>::const_iterator itSeg=__segs.begin();
804 itSeg != __segs.end();
809 double closestPointInSegment[3];
814 if ( dist < minDist )
829 std::set<MG_ARETE*> new_lst_edge;
831 double minDist = 1E100;
833 for (std::set<MG_ARETE*>::iterator it_edge = __lst_edge.begin();
834 it_edge != __lst_edge.end();
837 MG_ARETE * candidate_edge = *it_edge;
839 double t1=candidate_edge->
get_tmin();
840 double t2=candidate_edge->
get_tmax();
846 for (dt=.1*(t2-t1); fabs(dt) < .9*fabs(t2-t1); dt+=.1*(t2-t1))
851 candidate_edge->
evaluer(t, xyz);
857 if (distance < minDist)
860 closestEdge = candidate_edge;
864 if (new_lst_edge.size() == 0)
865 new_lst_edge.insert(closestEdge);
867 __lst_edge = new_lst_edge;
873 std::map < MG_FACE * , std::set <MG_ARETE *> > map_faceEdges;
874 for ( std::set< MG_FACE * >::const_iterator
875 it_face = __faces.begin();
876 it_face != __faces.end();
880 std::set < MG_ARETE * > lst_edges;
883 for (
unsigned it_loop = 0; it_loop < nb_loop; it_loop++)
888 for (
unsigned it_edge = 0; it_edge < nb_edge; it_edge++)
891 lst_edges.insert(edge);
894 map_faceEdges [ face ] = lst_edges;
897 std::set<MG_ARETE*> cEdges = (map_faceEdges.begin())->second;
898 std::map < MG_FACE * , std::set <MG_ARETE *> >::iterator start_faceEdges = map_faceEdges.begin();
899 std::advance(start_faceEdges, 1);
900 for ( std::set<MG_ARETE*>::const_iterator
901 it_edge = cEdges.begin();
902 it_edge != cEdges.end();
908 for (std::map <
MG_FACE * , std::set <MG_ARETE *> >::iterator
909 it_faceEdges = start_faceEdges;
910 it_faceEdges != map_faceEdges.end() && common_edge;
914 std::set <MG_ARETE *> & setEdges = it_faceEdges->second;
915 if ( setEdges.find(common_edge) == setEdges.end())
920 __commonEdges.insert( common_edge );
929 int nb = lien_maillage.
get_nb();
931 for (element = lien_maillage.
get_premier(it); i++ < nb && element ; element = lien_maillage.
get_suivant(it) )
935 element->change_lien_topologie(__new_topo);
937 if ( element->get_dimension() == 1 )
946 if ( element->get_dimension() == 2 )
956 if ( segment[j]->get_lien_topologie() == __old_topo )
957 segment[j]->change_lien_topologie(__new_topo);
967 if ( noeud[j]->get_lien_topologie() == __old_topo )
968 noeud[j]->change_lien_topologie(__new_topo);
978 double distance, minDist;
980 __splitEdges[0] = __arete_gauche;
981 __splitEdges[1] = __arete_droite;
995 printf(
"Can't insert vertex %ld in edge %ld\n", __splitVertex->
get_id(), __origEdge->
get_id());
996 printf(
"because edge has already a node on vertex !\n");
1003 double splitVertexCoord[3];
1010 LISTE_MG_NOEUD::iterator itNode;
1015 if (
node->get_lien_topologie() != __origEdge )
1019 xyz[0] =
node->get_x();
1020 xyz[1] =
node->get_y();
1021 xyz[2] =
node->get_z();
1025 if (distance / origEdgeLength < 1E-6)
1027 if (distance < minDist)
1030 coincidentNode =
node;
1038 int nbSegBeforeSplit;
1039 int nbOfNodesDim0 = 0;
1040 EdgeMeshStats(__mesh, __origEdge,nbSegBeforeSplit,nbOfNodesDim0);
1046 *__splitNode = NULL;
1049 __splitSegments[0] = __splitSegments[1] = *__origSegment = NULL;
1068 double xyzSeg[2][3];
1071 xyzSeg[i][0] = nos[i]->
get_x();
1072 xyzSeg[i][1] = nos[i]->
get_y();
1073 xyzSeg[i][2] = nos[i]->
get_z();
1077 if (distance < minDist)
1080 *__origSegment = seg;
1092 (*__splitNode)->change_lien_topologie(__splitVertex);
1094 int nbSegAfterSplit;
1095 EdgeMeshStats(__mesh, __origEdge,nbSegAfterSplit,nbOfNodesDim0);
1096 if ( nbSegAfterSplit-1 != nbSegBeforeSplit )
1098 printf(
"The edge %ld contains %d segments before split and %d after split \n", __origEdge->
get_id(),nbSegBeforeSplit, nbSegAfterSplit);
1102 printf(
"The edge %ld contains %d segments after split \n", __origEdge->
get_id(), nbSegAfterSplit);
1108 std::vector <MG_NOEUD*> sequence_of_nodes;
1109 std::vector <MG_SEGMENT*> sequence_of_segments;
1110 std::set<MG_SEGMENT*> set_of_segments_of_edge;
1115 set_of_segments_of_edge.insert( seg );
1117 printf(
"Edge %ld containing %d segments is split in mesh\n", __origEdge->
get_id(), (
int)set_of_segments_of_edge.size());
1120 std::set <MG_ARETE*> lst_edge;
1121 lst_edge.insert(__splitEdges[0]);
1122 lst_edge.insert(__splitEdges[1]);
1127 if (nbOfNodesDim0 != 3)
1128 printf(
"Problem : there is less than 3 nodes having a vertex attached!\n");
1130 while ( lst_edge.size() && set_of_segments_of_edge.size() )
1132 sequence_of_segments.clear();
1133 sequence_of_nodes.clear();
1136 if (sequence_of_nodes.size() == 0)
1138 printf(
"nodes = 0\n");
1143 std::set <MG_SOMMET *> vertices;
1144 vertices.insert((
MG_SOMMET*)sequence_of_nodes[0]->get_lien_topologie());
1145 vertices.insert((
MG_SOMMET*)sequence_of_nodes[sequence_of_nodes.size()-1]->get_lien_topologie());
1147 MG_ARETE * firstEdge = * lst_edge.begin();
1148 if (lst_edge.size() == 1)
1149 topoEdge = firstEdge;
1154 if (topoEdge == NULL)
1160 lst_edge.erase(topoEdge);
1162 std::vector <MG_SEGMENT*>::iterator itSegs;
1163 for (itSegs = sequence_of_segments.begin();itSegs != sequence_of_segments.end();itSegs++)
1174 if (topoEdge != NULL)
1175 printf(
"debug: %d segments classified on edge %lu\n", (
int)sequence_of_segments.size(), topoEdge->
get_id() );
1178 for (
int i=0;i<2;i++)
1180 EdgeMeshStats(__mesh, __splitEdges[i], nSegs, nbOfNodesDim0);
1181 if (nbOfNodesDim0 != 2)
1182 printf(
"Problem edge %ld : there is less than 2 nodes having a vertex attached!\n", __splitEdges[i]->get_id());
1185 while (set_of_segments_of_edge.size() != 0)
1187 printf(
"Warning : %d segments of split edges have not been classified !\n", (
int)set_of_segments_of_edge.size() );
1190 sequence_of_segments.clear();
1191 sequence_of_nodes.clear();
1193 std::set <MG_ARETE*> candidateEdges;
1194 candidateEdges.insert(__splitEdges[0]);
1195 candidateEdges.insert(__splitEdges[1]);
1198 if (candidateEdges.size())
1200 topoEdge = *(candidateEdges.begin());
1201 std::vector<MG_SEGMENT*>::iterator itSegs;
1202 for (itSegs = sequence_of_segments.begin();itSegs != sequence_of_segments.end();itSegs++)
1214 std::set <MG_SEGMENT * > free_segs;
1215 std::set <MG_NOEUD * > free_segs_nodes;
1216 std::set <MG_SEGMENT * >::iterator it_free_segs;
1217 std::set <MG_NOEUD * >::iterator it_free_segs_nodes;
1218 LISTE_MG_SEGMENT::iterator itSeg;
1222 if ( seg->get_lien_triangle()->get_nb() == 1 )
1224 free_segs.insert(seg);
1225 free_segs_nodes.insert (seg->get_noeud1());
1226 free_segs_nodes.insert (seg->get_noeud2());
1230 unsigned N = free_segs.size();
1231 for (
unsigned i=0; i<N; i++)
1237 double dist_closest_node=1E300;
1239 for (it_free_segs_nodes=free_segs_nodes.begin();it_free_segs_nodes!=free_segs_nodes.end();it_free_segs_nodes++)
1241 MG_NOEUD * no = *it_free_segs_nodes;
1244 if (distance < dist_closest_node)
1246 dist_closest_node = distance;
1252 if (closest_node != 0 && dist_closest_node < __tolerance)
1255 free_segs.erase(seg1);
1258 for (
int i=0; i<2; i++)
1260 if (new_segs[i]->get_lien_triangle()->get_nb() == 1 )
1262 free_segs.insert(new_segs[i]);
1263 free_segs_nodes.insert (new_segs[i]->get_noeud1());
1264 free_segs_nodes.insert (new_segs[i]->get_noeud2());
1298 std::map<std::string,double> liste_kmin;
1299 std::map<std::string,double> liste_kmax;
1315 printf(
"%d,%d,%d,%d,%d\n",nb1,nb2,nb3,nb4,nbface);
1316 for (
int i=0;i<nbface;i++)
1321 for(
int j=0;j<x;j++)
1330 double xyz1[3],dxyz1[3];
1331 double xyz2[3],dxyz2[3];
1332 double xyz3[3],dxyz3[3];
1334 xyz1[0]=no1->
get_x();
1335 xyz1[1]=no1->
get_y();
1336 xyz1[2]=no1->
get_z();
1337 xyz2[0]=no2->
get_x();
1338 xyz2[1]=no2->
get_y();
1339 xyz2[2]=no2->
get_z();
1340 xyz3[0]=no3->
get_x();
1341 xyz3[1]=no3->
get_y();
1342 xyz3[2]=no3->
get_z();
1347 double E1,F1,G1,L1,M1,N1;
1348 double E2,F2,G2,L2,M2,N2;
1349 double E3,F3,G3,L3,M3,N3;
1355 double L11=L1*o*(-1);
1356 double M11=M1*o*(-1);
1357 double N11=N1*o*(-1);
1358 double a1=E1*G1-F1*F1;
1359 double b1=E1*N11+G1*L11-2*F1*M11;
1360 double c1=L11*N11-M11*M11;
1363 double kma1=(H1+
sqrt((H1*H1)-K1));
1364 double kmi1=(H1-
sqrt((H1*H1)-K1));
1370 double L22=L2*o*(-1);
1371 double M22=M2*o*(-1);
1372 double N22=N2*o*(-1);
1373 double a2=E2*G2-F2*F2;
1374 double b2=E2*N22+G2*L22-2*F2*M22;
1375 double c2=L22*N22-M22*M22;
1378 double kma2=(H2+
sqrt((H2*H2)-K2));
1379 double kmi2=(H2-
sqrt((H2*H2)-K2));
1385 double L33=L3*o*(-1);
1386 double M33=M3*o*(-1);
1387 double N33=N3*o*(-1);
1388 double a3=E3*G3-F3*F3;
1389 double b3=E3*N33+G3*L33-2*F3*M33;
1390 double c3=L33*N33-M33*M33;
1393 double kma3=(H3+
sqrt((H3*H3)-K3));
1394 double kmi3=(H3-
sqrt((H3*H3)-K3));
1399 unsigned long idnoeud1=no1->
get_id();
1400 unsigned long idnoeud2=no2->
get_id();
1401 unsigned long idnoeud3=no3->
get_id();
1403 sprintf(mess,
"%lu_%lu",idnoeud1,idface);
1406 liste_kmax[mess]=kma1;
1407 liste_kmin[mess]=kmi1;
1408 sprintf(mess,
"%lu_%lu",idnoeud2,idface);
1411 liste_kmax[mess]=kma2;
1412 liste_kmin[mess]=kmi2;
1413 sprintf(mess,
"%lu_%lu",idnoeud3,idface);
1416 liste_kmax[mess]=kma3;
1417 liste_kmin[mess]=kmi3;
1426 LISTE_MG_TRIANGLE::iterator ittri;
1435 sprintf(mess,
"%lu_%lu",no1->
get_id(),tri->get_lien_topologie()->get_id());
1436 double valeur0=liste_kmin[mess];
1437 double valeur1=liste_kmax[mess];
1438 sol->
ecrire(valeur0,compte,0,0);
1439 sol->
ecrire(valeur1,compte,1,0);
1440 sprintf(mess,
"%lu_%lu",no2->
get_id(),tri->get_lien_topologie()->get_id());
1441 valeur0=liste_kmin[mess];
1442 valeur1=liste_kmax[mess];
1443 sol->
ecrire(valeur0,compte,0,1);
1444 sol->
ecrire(valeur1,compte,1,1);
1445 sprintf(mess,
"%lu_%lu",no3->
get_id(),tri->get_lien_topologie()->get_id());
1446 valeur0=liste_kmin[mess];
1447 valeur1=liste_kmax[mess];
1448 sol->
ecrire(valeur0,compte,0,2);
1449 sol->
ecrire(valeur1,compte,1,2);
1456 std::vector<std::string> tab;
1458 for (
int i=0;i<tab.size();i++)
1459 printf(
"%s\n",(
char*)tab[i].c_str());
1474 std::map<std::string,double> liste_kmin;
1475 std::map<std::string,double> liste_kmax;
1476 std::map<std::string,double> liste_gau;
1477 std::map<std::string,double> liste_courburemax1;
1478 std::map<std::string,double> liste_courburemax2;
1479 std::map<std::string,double> liste_courburemax3;
1480 std::map<std::string,double> liste_courburemax4;
1481 std::map<std::string,double> liste_courburemax5;
1482 LISTE_MG_NOEUD::iterator it;
1496 cou->
calcul_courbure_face_arete_sommet(noeud,kmin1,kmax1,kmin2,kmax2,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5,opensurafece);
1506 LISTE_MG_TRIANGLE::iterator ittri;
1514 sprintf(mess,
"%lu_%lu",no1->
get_id(),tri->get_lien_topologie()->get_id());
1515 double valeur0=liste_kmin[mess];
1516 double valeur1=liste_kmax[mess];
1517 double valeur2=liste_gau[mess];
1518 sol->
ecrire(valeur0,compte,0,0);
1519 sol->
ecrire(valeur1,compte,1,0);
1520 sol->
ecrire(valeur2,compte,2,0);
1521 sprintf(mess,
"%lu_%lu",no2->
get_id(),tri->get_lien_topologie()->get_id());
1522 valeur0=liste_kmin[mess];
1523 valeur1=liste_kmax[mess];
1524 valeur2=liste_gau[mess];
1525 sol->
ecrire(valeur0,compte,0,1);
1526 sol->
ecrire(valeur1,compte,1,1);
1527 sol->
ecrire(valeur2,compte,2,1);
1528 sprintf(mess,
"%lu_%lu",no3->
get_id(),tri->get_lien_topologie()->get_id());
1529 valeur0=liste_kmin[mess];
1530 valeur1=liste_kmax[mess];
1531 valeur2=liste_gau[mess];
1532 sol->
ecrire(valeur0,compte,0,2);
1533 sol->
ecrire(valeur1,compte,1,2);
1534 sol->
ecrire(valeur2,compte,2,2);
1541 std::ofstream fichier(
"fichierhistogram1.csv",std::ios_base::app );
1542 if( fichier.is_open() )
1549 sprintf(mess1,
"%lu",noeu->get_id());
1550 double valeur1=liste_courburemax1[mess1];
1551 double valeur2=liste_courburemax2[mess1];
1552 double valeur3=liste_courburemax3[mess1];
1553 double valeur4=liste_courburemax4[mess1];
1554 double valeur5=liste_courburemax5[mess1];
1559 fichier << u <<
'\t'<< std::setprecision(10) <<valeur1 <<
'\t'<<std::setprecision(10) <<valeur2<<
'\t'<<std::setprecision(10) <<valeur3<<
'\t'<<std::setprecision(10) <<valeur4<<
'\t'<<std::setprecision(10) <<valeur5<<std::endl;
1560 fichier << std::fixed;
1567 std::vector<std::string> tab;
1569 for (
int i=0;i<tab.size();i++)
1570 printf(
"%s\n",(
char*)tab[i].c_str());
1575 void MG_MAILLAGE_OUTILS::calcul_courbure_face_arete_sommet(
MG_NOEUD* noeud,
double& kmin1,
double& kmax1,
double& kmin2,
double& kmax2, std::map< std::string, double >& liste_kmin, std::map< std::string, double >& liste_kmax,std::map<std::string,double> &liste_gau, std::map< std::string, double >& liste_courburemax1, std::map< std::string, double >& liste_courburemax2, std::map< std::string, double >& liste_courburemax3, std::map< std::string, double >& liste_courburemax4, std::map< std::string, double >& liste_courburemax5,
int opensurafece)
1586 cou->
calcul_courbure_face(noeud,kmin,kmax,liste_kmin,liste_kmax,liste_gau,liste_courburemax1,liste_courburemax2,liste_courburemax3,liste_courburemax4,liste_courburemax5);
1631 printf(
"aret non virtuel\n");
1639 printf(
"kmax1 %lf kmin1 %lf \n",kmax1,kmin1);
1640 printf(
"kmax2 %lf kmin2 %lf \n",kmax2,kmin2);
1644 printf(
"aret virtuel \n");
1656 printf(
"kmax %lf kmin %lf \n",kmax,kmin);
1694 for(
int ggo=0;ggo<nbcosom;ggo++)
1748 for(
int gg=0;gg<nbcosom;gg++)
1760 for(
int ggg=0;ggg<nbcoaret;ggg++)
1796 for(
int o=0;o<aai;o++)
1802 for(
int op=0;op<aii;op++)
1928 double angletri1=0.;
1929 double angletri2=0.;
1940 double surface11=0.;
1941 double surface12=0.;
1956 K1= ((M_PI) - angletri1)/((1./3.)*surf11);
1966 K2= ((M_PI) - angletri2)/((1./3.)*surf12);
1973 H1= (3. / (4.*surf11))*H11;
1982 H2= (3. / (4.*surf12))*H22;
1986 const std::complex<double> result =
std::sqrt(std::complex<double>(H1*H1 - K1));
1989 kmin1=(H1-result.real());
1990 kmax1=(H1+result.real());
1992 const std::complex<double> result1 =
std::sqrt(std::complex<double>(H2*H2 - K2));
1995 kmin2=(H2-result1.real());
1996 kmax2=(H2+result1.real());
2001 for(
int yy=0;yy<nbtrxx;yy++)
2006 unsigned long idnoeud=noeud->
get_id();
2008 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2020 liste_kmax[mess]=kmax1;
2021 liste_kmin[mess]=kmin1;
2025 liste_kmax[mess]=kmax2;
2026 liste_kmin[mess]=kmin2;
2034 for(
int gg=0;gg<nbcosom;gg++)
2050 for(
int oip=0;oip<aaii;oip++)
2064 for(
int ooip=0;ooip<aiii;ooip++)
2082 double angletri1=0.;
2083 double angletri2=0.;
2094 double surface11=0.;
2095 double surface12=0.;
2110 K1= ((M_PI) - angletri1)/((1./3.)*surf11);
2111 printf(
"gauss1 %lf \n",K1);
2120 K2= ((M_PI) - angletri2)/((1./3.)*surf12);
2137 H1= (3. / (4.*surf11))*H11;
2154 H2= (3. / (4.*surf12))*H22;
2159 const std::complex<double> result =
std::sqrt(std::complex<double>(H1*H1 - K1));
2162 kmin1=(H1-result.real());
2163 kmax1=(H1+result.real());
2165 const std::complex<double> result1 =
std::sqrt(std::complex<double>(H2*H2 - K2));
2168 kmin2=(H2-result1.real());
2169 kmax2=(H2+result1.real());
2172 for(
int yy=0;yy<nbtrxx;yy++)
2176 unsigned long idnoeud=noeud->
get_id();
2178 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2181 liste_kmax[mess]=kmax1;
2182 liste_kmin[mess]=kmin1;
2186 liste_kmax[mess]=kmax2;
2187 liste_kmin[mess]=kmin2;
2200 for(
int gg=0;gg<nbcosom;gg++)
2216 for(
int oip=0;oip<aaii;oip++)
2230 for(
int ooip=0;ooip<aiii;ooip++)
2248 double angletri1=0.;
2249 double angletri2=0.;
2260 double surface11=0.;
2261 double surface12=0.;
2276 K1= ((M_PI) - angletri1)/((1./3.)*surf11);
2277 printf(
"gauss1 %lf \n",K1);
2286 K2= ((M_PI) - angletri2)/((1./3.)*surf12);
2303 H1= (3. / (4.*surf11))*H11;
2320 H2= (3. / (4.*surf12))*H22;
2325 const std::complex<double> result =
std::sqrt(std::complex<double>(H1*H1 - K1));
2328 kmin1=(H1-result.real());
2329 kmax1=(H1+result.real());
2331 const std::complex<double> result1 =
std::sqrt(std::complex<double>(H2*H2 - K2));
2334 kmin2=(H2-result1.real());
2335 kmax2=(H2+result1.real());
2338 for(
int yy=0;yy<nbtrxx;yy++)
2342 unsigned long idnoeud=noeud->
get_id();
2344 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2347 liste_kmax[mess]=kmax1;
2348 liste_kmin[mess]=kmin1;
2352 liste_kmax[mess]=kmax2;
2353 liste_kmin[mess]=kmin2;
2384 for(
int kk=0;kk<nbtri;kk++)
2406 for(
int jj=0;jj<nbseg;jj++)
2420 double angletri1=0.;
2421 double angletri2=0.;
2432 double surface11=0.;
2433 double surface12=0.;
2448 K1= ((M_PI) - angletri1)/((1./3.)*surf11);
2458 K2= ((M_PI) - angletri2)/((1./3.)*surf12);
2465 H1= (3. / (4.*surf11))*H11;
2474 H2= (3. / (4.*surf12))*H22;
2478 if(H1>=0 && H1<0.00009)
2486 const std::complex<double> result =
std::sqrt(std::complex<double>(H1*H1 - K1));
2487 kmin1=(H1-result.real());
2488 kmax1=(H1+result.real());
2491 if(H2>=0 && H2<0.00009)
2497 const std::complex<double> result1 =
std::sqrt(std::complex<double>(H2*H2 - K2));
2498 kmin2=(H2-result1.real());
2499 kmax2=(H2+result1.real());
2504 for(
int yy=0;yy<nbtrxx;yy++)
2508 unsigned long idnoeud=noeud->
get_id();
2510 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2513 liste_kmax[mess]=kmax1;
2514 liste_kmin[mess]=kmin1;
2518 liste_kmax[mess]=kmax2;
2519 liste_kmin[mess]=kmin2;
2532 for(
int uu=0;uu<nbtri2;uu++)
2540 for(
int zz=0;zz<nbseg2;zz++)
2547 double angletri1=0.;
2554 double surface11=0.;
2570 K1= ((2.*M_PI) - angletri1)/((1./3.)*surf11);
2576 H1= (3. / (4.*surf11))*H11;
2578 const std::complex<double> result =
std::sqrt(std::complex<double>(H1*H1 - K1));
2579 kmin=(H1-result.real());
2580 kmax=(H1+result.real());
2582 for(
int yy=0;yy<nbtrxx;yy++)
2586 unsigned long idnoeud=noeud->
get_id();
2588 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2589 liste_kmax[mess]=kmax;
2590 liste_kmin[mess]=kmin;
2594 void MG_MAILLAGE_OUTILS::calcul_courbure_face(
MG_NOEUD* noeud,
double & kmin,
double& kmax, std::map<std::string,double> &liste_kmin,std::map<std::string,double> &liste_kmax,std::map<std::string,double> &liste_gau,std::map<std::string,double> &liste_courburemax1,std::map<std::string,double> &liste_courburemax2,std::map<std::string,double> &liste_courburemax3,std::map<std::string,double> &liste_courburemax4,std::map<std::string,double> &liste_courburemax5 )
2605 H= (3. / (4.*surface))*H1;
2607 const std::complex<double> result =
std::sqrt(std::complex<double>(H*H - K));
2608 kmin=(H-result.real());
2609 kmax=(H+result.real());
2613 unsigned long idnoeud=noeud->
get_id();
2615 sprintf(mess,
"%lu_%lu",idnoeud,idface);
2616 liste_kmax[mess]=kmax;
2617 liste_kmin[mess]=kmin;
2619 unsigned long idnoeud1=noeud->
get_id();
2621 sprintf(mess1,
"%lu",idnoeud1);
2627 if(kmax==0 && kmax<=0.00009)
2629 liste_courburemax1[mess1]=kmax;
2631 else if(kmax<=0.04 && kmax>0.00009)
2633 liste_courburemax2[mess1]=kmax;
2635 else if(kmax<=0.07 && kmax>=0.04)
2637 liste_courburemax3[mess1]=kmax;
2639 else if(kmax<=0.1 && kmax>=0.07)
2641 liste_courburemax4[mess1]=kmax;
2643 else if(kmax<=0.2 && kmax>=0.1)
2645 liste_courburemax5[mess1]=kmax;
2681 for(
int p=0;p<nbtrian1;p++)
2700 for(
int pp=0;pp<nbtrian2;pp++)
2747 H11=(longueur1*(M_PI-angle11));
2757 double surface11=0.;
2775 n_tri1=sens1*n_tri1;
2779 else if(noeud==no12)
2787 n_tri1=sens1*n_tri1;
2791 else if(noeud==no13)
2799 n_tri1=sens1*n_tri1;
2810 double angletri1=0.;
2811 double surface11=0.;
2813 double surface12=0.;
2832 n_tri1=sens1*n_tri1;
2834 surface11=surface11+sur11;
2836 double b=vec12.get_longueur();
2837 double c=(vec11.
get_x()*vec12.get_x()+vec11.
get_y()*vec12.get_y()+vec11.
get_z()*vec12.get_z());
2841 else if(noeud==no12)
2849 n_tri1=sens1*n_tri1;
2851 surface11=surface11+sur11;
2853 double b=vec12.get_longueur();
2854 double c=(vec11.
get_x()*vec12.get_x()+vec11.
get_y()*vec12.get_y()+vec11.
get_z()*vec12.get_z());
2858 else if(noeud==no13)
2866 n_tri1=sens1*n_tri1;
2868 surface11=surface11+sur11;
2870 double b=vec12.get_longueur();
2871 double c=(vec11.
get_x()*vec12.get_x()+vec11.
get_y()*vec12.get_y()+vec11.
get_z()*vec12.get_z());
2885 for (
int i=0;i<nbtri;i++)
2907 surface=surface+sur;
2909 else if (noeud==no2)
2919 surface=surface+sur;
2921 else if (noeud==no3)
2932 surface=surface+sur;
2952 for (
int i=0;i<nbtri;i++)
2974 surface=surface+sur;
2977 double b=vec2.get_longueur();
2978 double c=(vec1.
get_x()*vec2.get_x()+vec1.
get_y()*vec2.get_y()+vec1.
get_z()*vec2.get_z());
2979 double o=
acos(c/(
a*b));
2982 else if (noeud==no2)
2992 surface=surface+sur;
2995 double b=vec2.get_longueur();
2996 double c=(vec1.
get_x()*vec2.get_x()+vec1.
get_y()*vec2.get_y()+vec1.
get_z()*vec2.get_z());
2997 double o=
acos(c/(
a*b));
3000 else if (noeud==no3)
3014 surface=surface+sur;
3018 double b=vec2.get_longueur();
3019 double c=(vec1.
get_x()*vec2.get_x()+vec1.
get_y()*vec2.get_y()+vec1.
get_z()*vec2.get_z());
3020 double o=
acos(c/(
a*b));
3030 K= ((2.* M_PI) - angle)/((1./3.)*surface);
3055 for (
int i=0;i<nbseg;i++)
3074 for(
int j=0;j<nbtriangle1;j++)
3086 for(
int k=0;k<nbtriangle2;k++)
3119 H1=(longueur* (M_PI-angle1));
3134 for (
int i=0;i<nbvoisin;i++)
3143 for (
int i=0;i<nbvoisin;i++)
3150 for (
int i=0;i<nbvoisin;i++)
3161 for (
int i=0;i<nbvoisin;i++)
3169 for (
int i=0;i<nbvoisin;i++)
3189 LISTE_MG_TRIANGLE::iterator it;
3203 for (
int k=0;k<3;k++)
3208 if (k==1) xsi=2./3.;
3209 if (k==2) eta=2./3.;
3210 double x=(1-xsi-eta)*xyz1[0]+xsi*xyz2[0]+eta*xyz3[0];
3212 volume=volume+detj*wi*(psi1*n);
3232 double aa=
acos(ab*ac);
3233 double bb=-
acos(bc*ab);
3234 double cc=
acos(ac*bc);
3236 centre[0]=(
sin(2.*aa)*xyz1[0]+
sin(2.*bb)*xyz2[0]+
sin(2.*cc)*xyz3[0])/(
sin(2.*aa)+
sin(2.*bb)+
sin(2.*cc));
3237 centre[1]=(
sin(2.*aa)*xyz1[1]+
sin(2.*bb)*xyz2[1]+
sin(2.*cc)*xyz3[1])/(
sin(2.*aa)+
sin(2.*bb)+
sin(2.*cc));
3238 centre[2]=(
sin(2.*aa)*xyz1[2]+
sin(2.*bb)*xyz2[2]+
sin(2.*cc)*xyz3[2])/(
sin(2.*aa)+
sin(2.*bb)+
sin(2.*cc));
3239 double r=(
a+b+c)/2./(
sin(aa)+
sin(bb)+
sin(cc));