Salome HOME
Little refactory
[tools/medcoupling.git] / src / INTERP_KERNEL / Geometric2D / InterpKernelGeo2DQuadraticPolygon.cxx
index 431ee8ad93e89862b115081ee6ddf34abf658809..9bbe6ce5527972076ed35979623475828e6196d2 100644 (file)
@@ -70,41 +70,63 @@ QuadraticPolygon::~QuadraticPolygon()
 {
 }
 
-QuadraticPolygon *QuadraticPolygon::BuildLinearPolygon(std::vector<Node *>& nodes, bool isClosed)
+QuadraticPolygon *QuadraticPolygon::BuildLinearPolygon(std::vector<Node *>& nodes)
 {
-  QuadraticPolygon *ret=new QuadraticPolygon;
+  QuadraticPolygon *ret(new QuadraticPolygon);
   std::size_t size=nodes.size();
-  for(std::size_t i=0;i< (size - (isClosed?0:1));i++)
+  for(std::size_t i=0;i<size;i++)
     {
       ret->pushBack(new EdgeLin(nodes[i],nodes[(i+1)%size]));
       nodes[i]->decrRef();
     }
-  if(!isClosed)
-    nodes[size-1]->decrRef();
   return ret;
 }
 
-QuadraticPolygon *QuadraticPolygon::BuildArcCirclePolygon(std::vector<Node *>& nodes, bool isClosed)
+QuadraticPolygon *QuadraticPolygon::BuildArcCirclePolygon(std::vector<Node *>& nodes)
 {
-  QuadraticPolygon *ret=new QuadraticPolygon;
+  QuadraticPolygon *ret(new QuadraticPolygon);
   std::size_t size=nodes.size();
-  std::size_t quad_offset = isClosed ? (size/2) : (size/2+1);
-  for(std::size_t i = 0; i < size/2; i++)
+  for(std::size_t i=0;i<size/2;i++)
+
     {
       EdgeLin *e1,*e2;
-      e1=new EdgeLin(nodes[i],nodes[i+quad_offset]);
-      e2=new EdgeLin(nodes[i+quad_offset],nodes[(i+1)%quad_offset]);
+      e1=new EdgeLin(nodes[i],nodes[i+size/2]);
+      e2=new EdgeLin(nodes[i+size/2],nodes[(i+1)%(size/2)]);
       SegSegIntersector inters(*e1,*e2);
       bool colinearity=inters.areColinears();
       delete e1; delete e2;
       if(colinearity)
-        ret->pushBack(new EdgeLin(nodes[i],nodes[(i+1)%quad_offset]));
+        ret->pushBack(new EdgeLin(nodes[i],nodes[(i+1)%(size/2)]));
       else
-        ret->pushBack(new EdgeArcCircle(nodes[i],nodes[i+quad_offset],nodes[(i+1)%quad_offset]));
-      nodes[i]->decrRef(); nodes[i+quad_offset]->decrRef();
+        ret->pushBack(new EdgeArcCircle(nodes[i],nodes[i+size/2],nodes[(i+1)%(size/2)]));
+      nodes[i]->decrRef(); nodes[i+size/2]->decrRef();
     }
-  if(!isClosed)
-    nodes[quad_offset-1]->decrRef();
+  return ret;
+}
+
+Edge *QuadraticPolygon::BuildLinearEdge(std::vector<Node *>& nodes)
+{
+  if(nodes.size()!=2)
+    throw INTERP_KERNEL::Exception("QuadraticPolygon::BuildLinearEdge : input vector is expected to be of size 2 !");
+  Edge *ret(new EdgeLin(nodes[0],nodes[1]));
+  nodes[0]->decrRef(); nodes[1]->decrRef();
+  return ret;
+}
+
+Edge *QuadraticPolygon::BuildArcCircleEdge(std::vector<Node *>& nodes)
+{
+  if(nodes.size()!=3)
+    throw INTERP_KERNEL::Exception("QuadraticPolygon::BuildArcCircleEdge : input vector is expected to be of size 3 !");
+  EdgeLin *e1(new EdgeLin(nodes[0],nodes[2])),*e2(new EdgeLin(nodes[2],nodes[1]));
+  SegSegIntersector inters(*e1,*e2);
+  bool colinearity=inters.areColinears();
+  delete e1; delete e2;
+  Edge *ret(0);
+  if(colinearity)
+    ret=new EdgeLin(nodes[0],nodes[1]);
+  else
+    ret=new EdgeArcCircle(nodes[0],nodes[2],nodes[1]);
+  nodes[0]->decrRef(); nodes[1]->decrRef(); nodes[2]->decrRef();
   return ret;
 }