48 #pragma package(smart_init)
53 :
MG_SEGMENT(num,topo,mgnoeud1,mgnoeud2,longue),_polylineEvaluator(0),_sense(1), _saveFormat(0)
59 :
MG_SEGMENT(topo,mgnoeud1,mgnoeud2,longue),_polylineEvaluator(0),_sense(1),_cstrMCFaceScheme(__cstrMCFaceScheme), _saveFormat(0)
64 :
MG_SEGMENT(0,__s.liaison_topologique,__s.get_noeud1(),__s.get_noeud2(),__s.get_longueur()), _saveFormat(0)
70 F.insert(std::make_pair(face,itF->second));
75 E.insert(std::make_pair(edge,itE->second));
130 for (
int i=0; i<3; i++) tangent[i] *= L;
134 for (
int i=0; i<3; i++) tangent[i]*=-1;
234 for (
int i=0;i<3;i++)
239 for (
int i=0;i<3;i++)
243 else if (
_bbox[i+3]<x[i])
248 for (
double t=.25; t<=.75; t+=.25)
253 for (
int i=0;i<3;i++)
257 else if (
_bbox[i+3]<x[i])
269 int shortestPathOptions = 0;
272 std::vector<MCNode*> vecPts;
273 std::vector<MG_ELEMENT_TOPOLOGIQUE*> vecTopo;
274 double distance = shortestPath.
Find(&vecPts,&vecTopo);
278 unsigned maxNbTries = 4;
279 unsigned maxDistFactor = 1;
280 for (i=0; i<maxNbTries; i++)
283 vecPts.clear();vecTopo.clear();
285 distance = shortestPathDoubleDist->
Find(&vecPts,&vecTopo);
288 delete shortestPathDoubleDist;
289 vecPts.clear();vecTopo.clear();
292 distance = shortestPathDoubleDist->
Find(&vecPts,&vecTopo);
295 delete shortestPathDoubleDist;
296 shortestPathDoubleDist = NULL;
308 printf(
"Warning : Construct_MCFaceByShortestPath failed !\n");
309 distance = shortestPath.
Find(&vecPts,&vecTopo);
313 if (distance < .8*dN1N2)
315 printf(
"Warning : %f < .8*%f in Construct_MCFaceByShortestPath !\n", distance, dN1N2);
320 for (i=0;i+1<vecPts.size();i++)
322 MCNode * xi=vecPts[i], *xii=vecPts[i+1];
328 std::vector<MCNode*> Ci;
331 xii->NormalMCFace(__mcFace, normalXii);
332 normalAvg = .5*normalXi+.5*normalXii;
342 if (Ci.size()<2||Ci[Ci.size()-1]!=xii||Ci[0]!=xi)
356 F.insert( std::make_pair(face, Ci) );
358 for (j=0; j<Ci.size(); j++)
377 E.insert (std::make_pair(edge, Ci));
381 F.insert(std::make_pair(face, Ci));
384 for (j=0; j<Ci.size(); j++)
395 if (shortestPathDoubleDist != NULL)
396 delete shortestPathDoubleDist;
420 v2 = .5*(normal1+normal2);
423 printf(
"Warning: surface's normal at node 1 is opposite to surface's normal at node 2\n");
424 printf(
"\t trying to evaluate surface's normal with the shortest path algorithm\n");
432 std::vector<MCNode*> vecPts;
433 std::vector<MG_ELEMENT_TOPOLOGIQUE*> vecTopo;
434 double distance=shortestPath->
Find(&vecPts, &vecTopo);
438 printf(
"%f %f %f %f %f %f ",x1[0],x1[1],x1[2],x2[0],x2[1],x2[2]);
440 printf(
"Error in average normal\n");
452 unsigned nb_points=10, real_nb_points=0;
454 for (
double s=0; real_nb_points < 1 || s < s_max; s+=.9999*(s_max/nb_points))
461 avgNormal += tmpNormal;
463 avgNormal /= real_nb_points;
473 MCNode * polysurfaceNodes[2]={__n1,__n2};
474 MCNode * n[2]={__n1,__n2};
475 VPts MergedVertexCurveNodes[2];
476 std::vector < MG_ELEMENT_TOPOLOGIQUE * > MergedVertexCurveTopo[2];
477 for (
int i=0;i<2;i++)
478 if (n[i]->GetRefVertexMapping().size() > 1)
496 MCNode * mergedVertexNode =
new MCNode(mcVertex,mergedVertex,xyz[0],xyz[1],xyz[2]);
497 polysurfaceNodes[i] = mergedVertexNode;
499 MCFace * mcFacePath = NULL;
500 std::set<MG_FACE*> mergedVertexMCFaces;
502 for (std::set<MG_FACE*>::iterator itF=mergedVertexMCFaces.begin();
503 itF != mergedVertexMCFaces.end(); itF++)
510 mcFacePath = adjacentMCFace;
515 double distance = shortestPath.
Find(&(MergedVertexCurveNodes[i]),&(MergedVertexCurveTopo[i]));
518 for (
unsigned j=0; j<MergedVertexCurveNodes[i].size();j++)
526 if (intersectionPlaneMCFace != NULL)
537 F.insert(std::make_pair(face, nodes));
552 E.insert (std::make_pair(edge, Ci));
556 F.insert(std::make_pair(face, Ci));
569 int MCSegment::RefineInRefEdge(
MCEdge * __mcEdge,
MG_ARETE * __refEdge,
MCNode * __n1,
MCNode * __n2,
double __epsilon,
double __lastDistanceToEdge, std::map < double , MCNode * > & __mapMCEdgeNodesBySParameter, std::map < double , MG_ARETE * > & __mapMCEdgeRefEdgesBySParameter,
int __iRecursiveCalls)
571 static const int RefineInRefEdge_MAX_RECURSIVE_CALL_COUNT = 100;
572 if (__iRecursiveCalls > RefineInRefEdge_MAX_RECURSIVE_CALL_COUNT)
574 printf(
"Warning : RefineInRefEdge : The number of recursive calls has been reached (%d)\n",RefineInRefEdge_MAX_RECURSIVE_CALL_COUNT);
578 int insertedNodeCount = 0;
579 MCNode * n[2] = { __n1, __n2};
580 for (
int i=0; i<2; i++)
583 if (n[i]->get_lien_topologie_reference()->
get_dimension() == 0)
584 v = (
MG_SOMMET * ) n[i]->get_lien_topologie_reference();
588 if (n[i]->IsInEdge(__refEdge) ==
false)
595 double t1 = __n1->
T(__refEdge);
596 double t2 = __n2->
T(__refEdge);
601 if (period != 0.0 && fabs(t2 - t1) > .5*period)
605 double t3 = t1 + (t2-t1)*.5;
607 double xyz[3]; __refEdge->
evaluer(t3,xyz);
608 MCNode edgeNode (__mcEdge, __refEdge, t3, xyz);
614 faceLine.
Add(__n1,face);
615 faceLine.
Add(__n2,face);
619 double ratioConvergence = distanceToEdge / __lastDistanceToEdge;
621 bool testConvergence = ( fabs(ratioConvergence - 1) < .001 || distN1N2 < __epsilon );
622 if ( (distanceToEdge > __epsilon )
623 && testConvergence == false )
632 __mapMCEdgeNodesBySParameter.insert(std::make_pair(s3,newMCNode));
633 __mapMCEdgeRefEdgesBySParameter.insert(std::make_pair(s3, __refEdge));
635 insertedNodeCount +=
RefineInRefEdge(__mcEdge, __refEdge, __n1, newMCNode, __epsilon, distanceToEdge, __mapMCEdgeNodesBySParameter,__mapMCEdgeRefEdgesBySParameter, __iRecursiveCalls+1);
636 insertedNodeCount +=
RefineInRefEdge(__mcEdge, __refEdge, newMCNode, __n2, __epsilon, distanceToEdge, __mapMCEdgeNodesBySParameter,__mapMCEdgeRefEdgesBySParameter, __iRecursiveCalls+1);
642 return insertedNodeCount;
658 std::vector < MG_ELEMENT_TOPOLOGIQUE * > CurveTopo;
664 std::map < double , MCNode * > nodes;
665 std::map < double , MG_ARETE * > edges;
670 if (n[i]->GetRefVertexMapping().size() >= 1)
675 for (std::set<MG_SOMMET*>::iterator itV = n[i]->GetRefVertexMapping().begin();
683 if (n[i]->get_lien_topologie_reference() != v)
686 n[i] =
new MCNode (__mcEdge,v,xyzV[0],xyzV[1],xyzV[2]);
700 polycurve->
inverser(s[i], n[i]->get_coord(), 1
E-6);
707 if (s[i] > smax + fabs(smax-smin)*1
E-6)
709 if (s[i] < smin - fabs(smax-smin)*1
E-6)
713 if (period != 0.0 && fabs(s[1] - s[0]) > .5*period)
725 double si = std::min(s[0],s[1]);
731 for (
int i=0; i<2; i++)
738 printf(
"Distance between projection and node = %f\n", dist);
739 polycurve->
inverser(s[i], n[i]->get_coord(), 1
E-6);
746 for (i=0;si<std::max(s[1],s[0]);i++)
750 if ((si-s[0])*(s[1]-si) > 0)
754 MCNode * ni =
new MCNode ( __mcEdge, vertex, xyz[0], xyz[1], xyz[2] );
762 std::map < double , MCNode * > refinedNodes = nodes;
763 std::map < double , MG_ARETE * > refinedEdges = edges;
765 for (std::map<double, MCNode * >::iterator itN = nodes.begin();
769 std::map<double, MCNode * >::iterator itNii = itN;
771 if (itNii == nodes.end())
773 MCNode * ni = itN->second;
774 MCNode * nii = itNii->second;
775 double si = itN->first;
776 double sii = itNii->first;
777 double smid = .5*(si+sii);
793 MG_ARETE * refEdge=0;
double tMid;
double dtMid;
799 MG_ARETE * refEdgei=0, * refEdgeii=0;
800 double tii, dtii, ti, dti;
808 MCNode * newMCNode =
new MCNode(__mcEdge, refEdge, tMid, xyz);
810 refinedNodes[smid] = newMCNode;
811 refinedEdges[smid] = refEdge;
816 nodes = refinedNodes;
817 edges = refinedEdges;
819 for (std::map<double, MCNode * >::iterator itN = nodes.begin();
823 std::map<double, MCNode * >::iterator itNii = itN;
825 if (itNii == nodes.end())
827 MCNode * ni = itN->second;
828 MCNode * nii = itNii->second;
829 double si = itN->first;
837 RefineInRefEdge(__mcEdge, refEdge, ni, nii, deltaMax, 1E300, refinedNodes, refinedEdges );
844 for (std::map<double, MCNode * >::iterator itN = nodes.begin();
848 std::map<double, MCNode * >::iterator itNii = itN;
850 if (itNii == nodes.end())
853 MCNode * ni = itN->second;
854 MCNode * nii = itNii->second;
855 double si = itN->first;
856 std::map<double, MG_ARETE*>::iterator itRefEdge = edges.find(si);
857 if (itRefEdge != edges.end())
858 edge = itRefEdge->second;
868 edge = itNiRefEdge->first;
877 params[0]=itN->first;
878 params[1]=itNii->first;
880 for (
int i=0;i<2;i++)
881 if ((s[1]-params[i])*(s[0]-params[i])>0)
884 std::vector < MCNode * > segEdge;
885 segEdge.push_back (ni);
886 segEdge.push_back (nii);
888 E.insert(std::make_pair(edge, segEdge));
893 F.insert(std::make_pair(face, segEdge));
896 if (CurveNodes.size () == 0 || CurveNodes[CurveNodes.size()-1] != ni)
897 CurveNodes.push_back(ni);
898 CurveNodes.push_back(nii);
899 CurveTopo.push_back(edge);
904 for (
unsigned i=0;i<CurveNodes.size();i++)
915 bool v1Found =
false, v2Found =
false;
916 for (
int itFLoop = 0; itFLoop !=
F->get_nb_mg_boucle(); itFLoop ++)
919 for (
int itFLoopEdge = 0; itFLoopEdge != loop->
get_nb_mg_coarete(); itFLoopEdge++)
926 if (v1Found && v2Found)
938 printf(
"Warning: MCSegment topology is not a MCEdge ! then it's not possible to construct a mapping on a merged vertex\n");
950 if (v != mcVertexRefVertex)
952 polycurveRefVertex = v;
953 mcFace =
Find_MCFace(mcEdge, polycurveRefVertex, mcVertexRefVertex);
956 MCNode * polycurve_mcNode = NULL;
963 if (polycurve_mcNode)