46 #pragma package(smart_init)
61 return (__mcEdgeSense.
e == e && __mcEdgeSense.
Sense() == -Sense() ) ;
66 return e->get_cosommet1()->get_sommet();
68 return e->get_cosommet2()->get_sommet();
73 return e->get_cosommet2()->get_sommet();
75 return e->get_cosommet1()->get_sommet();
80 return e->get_cosommet1();
82 return e->get_cosommet2();
87 return e->get_cosommet2();
89 return e->get_cosommet1();
93 return this->StartVertex() == __mcEdgeSense.
EndVertex();
97 return this->EndVertex() == __mcEdgeSense.
StartVertex();
102 double t=StartCoVertex()->get_t();
112 double t=EndCoVertex()->get_t();
122 MG_SOMMET * v1=StartVertex(), *v2=EndVertex();
131 result=MeshDir(__mesh, v1, meshSense);
142 MG_SOMMET * v1=StartVertex(), *v2=EndVertex();
147 meshSense = -Sense();
151 result=MeshDir(__mesh, v2, meshSense);
166 double t1,t2,*xyz1,*xyz2, t1o, o, t2o;
167 double period=e->get_courbe()->get_periode();
173 for (
int i=0; i<nSeg; i++)
181 if (__meshSense == +1 || __meshSense == -1)
194 e->inverser(t1, xyz1);
195 e->inverser(t2, xyz2);
205 if (__meshSense == +1)
206 valid_sense = (t1o<t2o);
207 else if (__meshSense == -1)
208 valid_sense = (t1o>t2o);
224 if (vertexSeg == NULL)
231 e->inverser(t1, xyz1);
232 e->inverser(t2, xyz2);
234 t1o=.5*e->get_courbe()->get_periode();
244 dir /= Sense()*(t2o-t1o);
252 if (IsInverse(__coEdge))
254 if (IsAfter(__coEdge))
256 dir2_3D=StartMeshDir(__mesh);
259 else if (IsBefore(__coEdge))
261 dir1_3D=EndMeshDir(__mesh);
265 double angle = AngleInPlane(dir1_3D, dir2_3D, __normal);
266 printf(
"Angle Between %lu and %lu = %f\n", e->get_id(), __coEdge.
e->
get_id(), angle);
273 if (IsInverse(__coEdge))
275 if (IsAfter(__coEdge))
278 dir1_3D=__coEdge.
EndDir();
280 else if (IsBefore(__coEdge))
286 double angle = AngleInPlane(dir1_3D, dir2_3D, __normal);
287 printf(
"Angle Between %lu and %lu = %f\n", e->get_id(), __coEdge.
e->
get_id(), angle);
296 repereNormal.
transpose(transform3DToRepereNormal);
297 dir1_2D=transform3DToRepereNormal*dir1_3D;
298 dir2_2D=transform3DToRepereNormal*dir2_3D;
299 dir2_2D[2]=dir1_2D[2]=0;
302 double cs = x*(dir1_2D*dir2_2D);
304 double sn = dir2_2D*Y;
305 if (cs>1)cs=1;
else if (cs<-1)cs=-1;
306 double angle =
acos (cs);
307 if (sn<0) angle = -angle;
311 MakeLoops::MakeLoops(std::vector <MG_FACE*> __faceList, std::vector <MG_ARETE*> __edgeList, std::vector <int> __senseList)
313 for (
unsigned i=0; i<__edgeList.size(); i++)
315 MG_FACE * face = __faceList[i];
317 int sense = __senseList[i];
320 std::set < CoEdge * > faceCoEdges;
321 faceCoEdges.insert(
new CoEdge(face, edge, sense));
336 std::set < CoEdge * > & lst = itLst->second;
337 for ( std::set < CoEdge * >::iterator itCoEdge = lst.begin(); itCoEdge != lst.end(); itCoEdge++)
339 CoEdge * coedge = *itCoEdge;
346 std::stringstream out;
349 out <<
"BaseColor { rgb 0.5 0 0 }\n";
350 out <<
"\n Coordinate3 {\n point [ \n";
352 for (std::set < CoEdge * >::iterator itCoEdge = lst.begin();
353 itCoEdge != lst.end();
356 CoEdge * current = *itCoEdge;
361 double xyz[3],xyz2[3];
363 for (
int i=0; i<3; i++) xyz2[i] = xyz[i]+normal[i]*.005;
364 out << xyz[0] <<
" "<< xyz[1] <<
" "<< xyz[2]<<
",\n";
365 out << xyz2[0] <<
" "<< xyz2[1] <<
" "<< xyz2[2]<<
",\n";
369 out <<
"\nIndexedLineSet {";
370 out <<
"\ncoordIndex\n [ \n";
371 for (
unsigned int j=0; j+1<N; j+=2)
384 std::set < CoEdge * > unvisited = lst;
386 if (lst.size()==0)
return;
390 std::string MCSTR(
"MC");
392 string::size_type loc = idorig.find( MCSTR, 0 );
393 isMCT = ( loc == 0 );
396 std::vector<CoEdge*> currentLoop;
399 while (unvisited.size())
401 if (current == 0 || current->
next != 0 )
403 if (currentLoop.size())
405 __loops.push_back(currentLoop);
408 printf(
"Loop %lu of Face %lu\n", __loops.size(), __face->
get_id());
409 current = *(unvisited.begin());
411 currentLoop.push_back(current);
412 unvisited.erase(current);
413 printf(
"Edge %lu\n", current->
e->
get_id());
415 double score_max = -(+M_PI+.001);
428 double uvVertex[2]; __face->
inverser(uvVertex, xyzVertex);
433 for (std::set<CoEdge*>::const_iterator it = unvisited.begin(); it != unvisited.end(); it++)
436 if (candidate->
IsAfter(*current))
439 if (score > score_max)
442 current->
next = candidate;
447 current = current->
next;
450 __loops.push_back(currentLoop);
452 for (
unsigned k=0; k<__loops.size(); k++)
453 N+=__loops[k].size();
454 printf(
"N=%d lst=%lu\n", N, lst.size());