0024968: Impove BRepMesh_Classifier to cope with intersection of huge number of wires
authoroan <oan@opencascade.com>
Thu, 10 Jul 2014 10:40:36 +0000 (14:40 +0400)
committerapn <apn@opencascade.com>
Thu, 10 Jul 2014 10:41:09 +0000 (14:41 +0400)
BRepMesh_Classifier: Two-pass approach for intersection check with possibility to run it in parallel mode.
First pass - bounding boxes of segments are checked for overlapping;
Second pass - intersection point is calculated in case if overlapping is detected.

Make NCollection_UBTree::ChangeLastNode() exported due to compilation error on Linux platform.
Reason: method does not depend on template parameters, so it should be available.

Revert previous change and try to use another trick for Linux

Fix compilation warning on MacOS: remove redundant constant
Fix regressions: do not consider insignificant loops in case of self intersections on the same wire.
More sugar solution for compilation errors on NCollection_EBTree on Linux

Test cases for issue CR24968

29 files changed:
src/BRepMesh/BRepMesh.cdl
src/BRepMesh/BRepMesh_BiPoint.cdl [deleted file]
src/BRepMesh/BRepMesh_BiPoint.cxx [deleted file]
src/BRepMesh/BRepMesh_BiPoint.lxx [deleted file]
src/BRepMesh/BRepMesh_Classifier.cdl [deleted file]
src/BRepMesh/BRepMesh_Classifier.cxx
src/BRepMesh/BRepMesh_Classifier.hxx [new file with mode: 0644]
src/BRepMesh/BRepMesh_Classifier.lxx [deleted file]
src/BRepMesh/BRepMesh_ClassifierPtr.hxx
src/BRepMesh/BRepMesh_Delaun.cxx
src/BRepMesh/BRepMesh_Delaun.hxx
src/BRepMesh/BRepMesh_FastDiscret.cdl
src/BRepMesh/BRepMesh_FastDiscret.cxx
src/BRepMesh/BRepMesh_FastDiscretFace.cxx
src/BRepMesh/BRepMesh_IncrementalMesh.cxx
src/BRepMesh/BRepMesh_WireChecker.cxx [new file with mode: 0644]
src/BRepMesh/BRepMesh_WireChecker.hxx [new file with mode: 0644]
src/BRepMesh/BRepMesh_WireInterferenceChecker.cxx [new file with mode: 0644]
src/BRepMesh/BRepMesh_WireInterferenceChecker.hxx [new file with mode: 0644]
src/BRepMesh/FILES
src/NCollection/NCollection_EBTree.hxx
tests/bugs/mesh/bug24968_1 [new file with mode: 0644]
tests/bugs/mesh/bug24968_2 [new file with mode: 0644]
tests/bugs/mesh/data/bug22778_square.brep [deleted file]
tests/mesh/data/standard/B5
tests/mesh/data/standard/C7
tests/mesh/data/standard/U7
tests/mesh/data/standard/W4
tests/mesh/data/standard/W9

index 52fe7b3..7c55409 100644 (file)
@@ -89,6 +89,7 @@ is    enumeration DegreeOfFreedom is
       imported VertexInspector from BRepMesh;
       imported VertexCellFilter from BRepMesh;
       imported VectorOfVertex from BRepMesh;
+      imported WireInterferenceChecker from BRepMesh;
       imported EdgeChecker from BRepMesh;
       imported FaceChecker from BRepMesh;
 
@@ -149,11 +150,6 @@ is    enumeration DegreeOfFreedom is
       class IndexedMapOfVertex instantiates IndexedMap from TCollection 
           (Vertex from  BRepMesh,  VertexHasher from  BRepMesh);
 
-
-      class BiPoint;
-  
-      class Array1OfBiPoint    instantiates Array1  from TCollection(BiPoint from BRepMesh);
-
       private class FastDiscretFace;
       
       class FastDiscret;
@@ -165,8 +161,9 @@ is    enumeration DegreeOfFreedom is
                                              FaceAttribute  from BRepMesh,
                                              ShapeMapHasher from TopTools);
               
-      private class Classifier;
+      imported Classifier from BRepMesh;
       imported ClassifierPtr; -- smart pointer on Classifier
+      imported WireChecker from BRepMesh;
 
       imported IncrementalMesh from BRepMesh;
 
diff --git a/src/BRepMesh/BRepMesh_BiPoint.cdl b/src/BRepMesh/BRepMesh_BiPoint.cdl
deleted file mode 100644 (file)
index bb838c4..0000000
+++ /dev/null
@@ -1,44 +0,0 @@
--- Created on: 1997-09-18
--- Created by: Christophe MARION
--- Copyright (c) 1997-1999 Matra Datavision
--- Copyright (c) 1999-2014 OPEN CASCADE SAS
---
--- This file is part of Open CASCADE Technology software library.
---
--- This library is free software; you can redistribute it and/or modify it under
--- the terms of the GNU Lesser General Public License version 2.1 as published
--- by the Free Software Foundation, with special exception defined in the file
--- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
--- distribution for complete text of the license and disclaimer of any warranty.
---
--- Alternatively, this file may be used under the terms of Open CASCADE
--- commercial license or contractual agreement.
-
-class BiPoint from BRepMesh
-
-uses
-    Address from Standard,
-    Real    from Standard,
-    Integer from Standard
-    
-is
-    Create
-    returns BiPoint from BRepMesh; 
-       ---C++: inline
-    
-    Create(X1,Y1,X2,Y2 : Real    from Standard)
-    returns BiPoint from BRepMesh; 
-    
-    Indices(me) returns Address from Standard
-       ---C++: inline
-    is static;
-
-    Coordinates(me) returns Address from Standard
-       ---C++: inline
-    is static;
-
-fields
-    myIndices     : Integer from Standard[2];
-    myCoordinates : Real    from Standard[6];
-    
-end BiPoint;
diff --git a/src/BRepMesh/BRepMesh_BiPoint.cxx b/src/BRepMesh/BRepMesh_BiPoint.cxx
deleted file mode 100644 (file)
index 7cd6569..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
-// Created on: 1997-09-18
-// Created by: Christophe MARION
-// Copyright (c) 1997-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-//#define No_Exception
-
-#include <BRepMesh_BiPoint.ixx>
-
-#define PntX1  myCoordinates[0]
-#define PntY1  myCoordinates[1]
-#define PntX2  myCoordinates[2]
-#define PntY2  myCoordinates[3]
-#define VectX  myCoordinates[4]
-#define VectY  myCoordinates[5]
-
-#define MinSg  myIndices[0]
-#define MaxSg  myIndices[1]
-
-//=======================================================================
-//function : BRepMesh_BiPoint
-//purpose  : 
-//=======================================================================
-
-BRepMesh_BiPoint::BRepMesh_BiPoint (const Standard_Real X1,
-                                   const Standard_Real Y1,
-                                   const Standard_Real X2,
-                                   const Standard_Real Y2)
-{
-  PntX1 = X1;
-  PntY1 = Y1;
-  PntX2 = X2;
-  PntY2 = Y2;
-}
-
diff --git a/src/BRepMesh/BRepMesh_BiPoint.lxx b/src/BRepMesh/BRepMesh_BiPoint.lxx
deleted file mode 100644 (file)
index 7a48f1d..0000000
+++ /dev/null
@@ -1,41 +0,0 @@
-// Created on: 1997-09-18
-// Created by: Christophe MARION
-// Copyright (c) 1997-1999 Matra Datavision
-// Copyright (c) 1999-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-//=======================================================================
-//function : BRepMesh_BiPoint
-//purpose  : 
-//=======================================================================
-
-inline BRepMesh_BiPoint::BRepMesh_BiPoint ()
-{
-}
-
-//=======================================================================
-//function : Indices
-//purpose  : 
-//=======================================================================
-
-inline Standard_Address BRepMesh_BiPoint::Indices () const
-{ return (Standard_Address)myIndices; }
-
-//=======================================================================
-//function : Coordinates
-//purpose  : 
-//=======================================================================
-
-inline Standard_Address BRepMesh_BiPoint::Coordinates () const
-{ return (Standard_Address)myCoordinates; }
-
diff --git a/src/BRepMesh/BRepMesh_Classifier.cdl b/src/BRepMesh/BRepMesh_Classifier.cdl
deleted file mode 100644 (file)
index 88b45b9..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
--- Created on: 1997-06-26
--- Created by: Laurent PAINNOT
--- Copyright (c) 1997-1999 Matra Datavision
--- Copyright (c) 1999-2014 OPEN CASCADE SAS
---
--- This file is part of Open CASCADE Technology software library.
---
--- This library is free software; you can redistribute it and/or modify it under
--- the terms of the GNU Lesser General Public License version 2.1 as published
--- by the Free Software Foundation, with special exception defined in the file
--- OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
--- distribution for complete text of the license and disclaimer of any warranty.
---
--- Alternatively, this file may be used under the terms of Open CASCADE
--- commercial license or contractual agreement.
-
-private class Classifier from BRepMesh
-
-
-
-uses  
-    Pnt2d                         from gp,
-    SequenceOfPnt2d               from TColgp,
-    Face                          from TopoDS,
-    State                         from TopAbs,
-    SequenceOfInteger             from TColStd,
-    SeqOfPtr                      from BRepTopAdaptor, 
-    DataMapOfShapePairOfPolygon   from BRepMesh,
-    IndexedMapOfInteger           from TColStd,
-    IndexedMapOfVertex            from BRepMesh,
-    Status                        from BRepMesh,
-    DataStructureOfDelaun         from BRepMesh
-
-is 
-    
-    Create   (theFace      : Face                          from TopoDS; 
-              theTolUV     : Real                          from Standard;
-              theEdges     : DataMapOfShapePairOfPolygon   from BRepMesh;
-              theMap       : IndexedMapOfInteger           from TColStd;
-              theStructure : DataStructureOfDelaun         from BRepMesh;
-              theUmin, theUmax, theVmin, theVmax : Real    from Standard)
-    returns Classifier from BRepMesh;
-
-
-    Perform(me; thePoint: Pnt2d from gp)
-    returns State from TopAbs;
-
-
-    State (me)
-    returns Status from BRepMesh;
-        ---C++: inline
-
-
-    Destroy(me: in out);
-        ---C++: alias ~
-
-
-    AnalizeWire (me          : in out;
-                 theSeqPnt2d : in SequenceOfPnt2d from TColgp;
-                 theUmin, theUmax, theVmin, theVmax: in Real from Standard)
-    is private;
-    -- Private method called from constructor after some (piece of) wire 
-    -- has been explored and put into <theSeqPnt2d>. 
-    -- Here it is triangulated if it is a hole and anyway added to the bulk.
-    
-fields 
-
-    myTabClass  : SeqOfPtr          from BRepTopAdaptor;
-    myTabOrient : SequenceOfInteger from TColStd;
-    myTolUV     : Real              from Standard;
-    myFace      : Face              from TopoDS;
-    myState     : Status            from BRepMesh;
-
-end Classifier from BRepMesh;
index 2c64b04..09545b4 100644 (file)
 // Alternatively, this file may be used under the terms of Open CASCADE
 // commercial license or contractual agreement.
 
-#include <BRepMesh_Classifier.ixx>
+#include <BRepMesh_Classifier.hxx>
 
-// Kernel
 #include <Precision.hxx>
-#include <Standard_ErrorHandler.hxx>
-#include <TColStd_ListOfTransient.hxx>
-#include <TColStd_Array1OfInteger.hxx>
-#include <TColStd_DataMapOfIntegerInteger.hxx>
-#include <ElCLib.hxx>
-// Geometry
-#include <gp_Pnt.hxx>
 #include <gp_Pnt2d.hxx>
-#include <TColgp_SequenceOfPnt2d.hxx>
-#include <TColgp_Array1OfPnt2d.hxx>
-#include <GeomAbs_SurfaceType.hxx>
-#include <Geom2dInt_Geom2dCurveTool.hxx>
-#include <Geom2d_Line.hxx>
-#include <Geom2d_BezierCurve.hxx>
-#include <Geom2d_BSplineCurve.hxx>
-#include <Geom2d_TrimmedCurve.hxx>
-// Topology
-#include <BRep_Tool.hxx>
-#include <BRepTools.hxx>
-#include <BRepTools_WireExplorer.hxx>
-#include <BRepAdaptor_Curve2d.hxx>
-#include <TopAbs_Orientation.hxx>
-#include <TopExp.hxx>
-#include <TopExp_Explorer.hxx>
-#include <TopoDS_Edge.hxx>
-#include <TopoDS.hxx>
 #include <CSLib_Class2d.hxx>
-#include <Poly_PolygonOnTriangulation.hxx>
-// BRepMesh
-#include <BRepMesh_Vertex.hxx>
-#include <BRepMesh_Array1OfBiPoint.hxx>
-#include <BRepMesh_PairOfPolygon.hxx>
+#include <TColgp_Array1OfPnt2d.hxx>
+
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+BRepMesh_Classifier::BRepMesh_Classifier()
+{
+}
 
-static const Standard_Real PARALL_COND = Sin(M_PI/3.0);
-static const Standard_Real RESOLUTION = 1.0E-16;
+//=======================================================================
+//function : Perform
+//purpose  : 
+//=======================================================================
+TopAbs_State BRepMesh_Classifier::Perform(const gp_Pnt2d& thePoint) const
+{
+  Standard_Boolean isOut = Standard_False;
+  Standard_Integer aNb   = myTabClass.Length();
+  
+  for (Standard_Integer i = 1; i <= aNb; i++)
+  {
+    Standard_Integer aCur = ((CSLib_Class2d*)myTabClass(i))->SiDans(thePoint);
+    if (aCur == 0)
+    {
+      // Point is ON, but mark it as OUT
+      isOut = Standard_True;
+    }
+    else
+      isOut = myTabOrient(i) ? (aCur == -1) : (aCur == 1);
+    
+    if (isOut)
+      return TopAbs_OUT;
+  }
 
-// Real mesh is created in the grid 10E5x10E5, so intersection
-// should be cheched with double of discretization.
-static const Standard_Real MIN_DIST = 2.E-5;
+  return TopAbs_IN;
+}
 
 //=======================================================================
-//function : AnalizeWire
+//function : RegisterWire
 //purpose  : 
 //=======================================================================
-void BRepMesh_Classifier::AnalizeWire (const TColgp_SequenceOfPnt2d&  theSeqPnt2d,
-                                       const Standard_Real theUmin,  const Standard_Real theUmax,
-                                       const Standard_Real theVmin,  const Standard_Real theVmax)
+void BRepMesh_Classifier::RegisterWire(
+  const NCollection_Sequence<gp_Pnt2d>& theWire,
+  const Standard_Real                   theTolUV,
+  const Standard_Real                   theUmin,
+  const Standard_Real                   theUmax,
+  const Standard_Real                   theVmin,
+  const Standard_Real                   theVmax)
 {
-  const Standard_Integer aNbPnts = theSeqPnt2d.Length();
+  const Standard_Integer aNbPnts = theWire.Length();
   if (aNbPnts < 2)
     return;
 
   // Accumulate angle
   TColgp_Array1OfPnt2d aPClass(1, aNbPnts);
   Standard_Real anAngle = 0.0;
-  gp_Pnt2d p1 = theSeqPnt2d(1), p2 = theSeqPnt2d(2), p3;
+  gp_Pnt2d p1 = theWire(1), p2 = theWire(2), p3;
   aPClass(1) = p1;
   aPClass(2) = p2;
+
+  const Standard_Real aAngTol = Precision::Angular();
+  const Standard_Real aSqConfusion =
+    Precision::PConfusion() * Precision::PConfusion();
+
   for (Standard_Integer i = 1; i <= aNbPnts; i++)
   { 
     Standard_Integer ii = i + 2;
@@ -85,17 +92,18 @@ void BRepMesh_Classifier::AnalizeWire (const TColgp_SequenceOfPnt2d&  theSeqPnt2
     }
     else
     {
-      p3 = theSeqPnt2d.Value(ii);
+      p3 = theWire.Value(ii);
       aPClass(ii) = p3;
     }
 
     gp_Vec2d A(p1,p2), B(p2,p3);
-    if (A.SquareMagnitude() > 1.e-16 && B.SquareMagnitude() > 1.e-16)
+    if (A.SquareMagnitude() > aSqConfusion && 
+        B.SquareMagnitude() > aSqConfusion)
     {
       const Standard_Real aCurAngle    = A.Angle(B);
       const Standard_Real aCurAngleAbs = Abs(aCurAngle);
       // Check if vectors are opposite
-      if (aCurAngleAbs > Precision::Angular() && (M_PI - aCurAngleAbs) > Precision::Angular())
+      if (aCurAngleAbs > aAngTol && (M_PI - aCurAngleAbs) > aAngTol)
       {
         anAngle += aCurAngle;
         p1 = p2;
@@ -104,504 +112,15 @@ void BRepMesh_Classifier::AnalizeWire (const TColgp_SequenceOfPnt2d&  theSeqPnt2
     p2 = p3;
   }
   // Check for zero angle - treat self intersecting wire as outer
-  if (Abs(anAngle) < Precision::Angular())
+  if (Abs(anAngle) < aAngTol)
     anAngle = 0.0;
 
-  myTabClass.Append( (void *)new CSLib_Class2d(aPClass, myTolUV, myTolUV,
-                                               theUmin, theVmin, theUmax, theVmax) );
-  myTabOrient.Append( ((anAngle < 0.0) ? 0 : 1) );
+  myTabClass.Append( (void *)new CSLib_Class2d(aPClass, 
+    theTolUV, theTolUV, theUmin, theVmin, theUmax, theVmax) );
+  myTabOrient.Append( !(anAngle < 0.0) );
 }
 
 //=======================================================================
-//function : triangle2Area
-//purpose  : calculating area under triangle
-//=======================================================================
-inline static Standard_Real triangle2Area(const gp_XY& p1, const gp_XY& p2)
-{
-  return p1.Crossed(p2);
-}
-
-//=======================================================================
-//function : getSegmentParams
-//purpose  : extracting segment attributes 
-//=======================================================================
-static Standard_Real getSegmentParams(const BRepMesh_Array1OfBiPoint& theBiPoints,
-                                      const Standard_Integer Index,
-                                      Standard_Real& x11,
-                                      Standard_Real& y11,
-                                      Standard_Real& x12,
-                                      Standard_Real& y12,
-                                      Standard_Real& A,
-                                      Standard_Real& B,
-                                      Standard_Real& C)
-{
-  Standard_Real *aCoordinates;
-  aCoordinates = ((Standard_Real*)(theBiPoints(Index).Coordinates()));
-  x11 =  aCoordinates[0];
-  y11 =  aCoordinates[1];
-  x12 =  aCoordinates[2];
-  y12 =  aCoordinates[3];
-  A   =  aCoordinates[5];
-  B   = -aCoordinates[4];
-  C   = - x11*A - y11*B;
-  return A*A+B*B;
-}
-
-//=======================================================================
-//function : checkWiresIntersection
-//purpose  : finding intersection.
-//           If the intersection is found return Standard_True
-//=======================================================================
-static Standard_Boolean checkWiresIntersection(const Standard_Integer           theFirstWireId,
-                                               const Standard_Integer           theSecondWireId,
-                                               Standard_Integer* const          theFirstOuterSegmentId,
-                                               Standard_Integer                 theLastOuterSegmentId,
-                                               const TColStd_SequenceOfInteger& theWireLength,
-                                               const BRepMesh_Array1OfBiPoint&  theBiPoints,
-                                               const Standard_Boolean           findNextIntersection   = Standard_False,
-                                               const Standard_Boolean           isFirstSegment         = Standard_False,
-                                               Standard_Integer* const          theFirstInnerSegmentId = 0)
-{
-  Standard_Real A1, B1, C1, A2, B2, C2, AB, BC, CA, xc, yc;
-  Standard_Real mu1, d, mu2;
-  Standard_Integer ik = *theFirstOuterSegmentId, jk;
-  Standard_Real x11, x12, y11, y12, x21, x22, y21, y22;
-
-  // Calculate bounds for first wire
-  Standard_Integer ikEnd = theLastOuterSegmentId;
-  Standard_Boolean isFirst = Standard_True;
-  if ( findNextIntersection )
-    isFirst = isFirstSegment;
-
-  // Calculate bounds for second wire
-  Standard_Integer jkStart = 0, jkEnd = 0;
-  for (jk = 1; jk <= theSecondWireId; jk++)
-  {
-    jkStart = jkEnd + 1;
-    jkEnd  += theWireLength(jk);
-  }
-
-  // total area under polygon (area of loop)
-  Standard_Real aLoopArea          = 0.0;
-  // area under first triangles of polygon
-  Standard_Real aFirstTriangleArea = 0.0;
-  // contains coordinates of the end point of segment if first intersection point is finding
-  // or coordinates of the intersecting point if second intersection point is finding
-  gp_XY aStartPoint;
-
-  for (; ik <= ikEnd; ik++)
-  {
-    mu1 = getSegmentParams(theBiPoints, ik, x11, y11, x12, y12, A1, B1, C1);
-    // for second intersection point we must count the area from first intersection point 
-    if ( !findNextIntersection )
-    {
-      aLoopArea = 0.0;
-      aStartPoint.SetCoord(x12, y12);
-    }
-
-    //for theFirstWireId == theSecondWireId the algorithm check current wire on selfintersection
-    if ( findNextIntersection && theFirstInnerSegmentId && isFirst)
-      jk = *theFirstInnerSegmentId;
-    else if (theSecondWireId == theFirstWireId)
-      jk = ik + 2;
-    else
-      jk = jkStart;
-
-    // Explore second wire
-    Standard_Boolean aFirstPass = Standard_True;
-    for (; jk <= jkEnd; jk++)
-    {
-      // don't check end's segment of the wire on selfrestriction
-      if ( theSecondWireId == theFirstWireId && isFirst && jk == ikEnd )
-        continue;
-
-      mu2 = getSegmentParams(theBiPoints, jk, x21, y21, x22, y22, A2, B2, C2);
-      gp_XY p2(x21, y21), p3(x22, y22);
-
-      //different segments may have common vertex (see OCC287 bug for example)
-      AB = A1*B2 - A2*B1;
-      //check on minimal of distance between current segment and points of another linear segments - OCC319
-      d = A1*x22 + B1*y22 + C1;
-      Standard_Real dTol = MIN_DIST*MIN_DIST;
-      if(theFirstWireId != theSecondWireId       && // if compared wires are different &&
-         AB*AB > PARALL_COND*PARALL_COND*mu1*mu2 && // angle between two segments greater then PARALL_COND &&
-         d*d   < dTol*mu1 &&                        // distance between vertex of the segment and other one's less then MIN_DIST
-         (x22-x11)*(x22-x12) < 0.0 && (y22-y11)*(y22-y12) < 0.0)
-      {
-        // if we finding the second intersection we must return Standard_False for setting
-        // self-intersection result flag
-        if ( findNextIntersection )
-          return Standard_False;
-
-        // we can step here when finding first intersection, return self-intersection flag
-        return Standard_True;
-      }
-
-      if( aFirstPass )
-        aFirstTriangleArea = triangle2Area(aStartPoint, p2);
-      
-      Standard_Real aTmpArea = triangle2Area(p2, p3);
-
-      //look for intersection of two linear segments
-      if(Abs(AB) <= RESOLUTION)
-      {
-        aLoopArea += aTmpArea;
-        continue;  //current segments seem parallel - no intersection
-      }
-      
-      //calculate coordinates of point of the intersection
-      BC = B1*C2 - B2*C1;  xc = BC/AB;
-      CA = C1*A2 - C2*A1;  yc = CA/AB;
-
-      // remember current intersection point and area of first triangle
-      if( findNextIntersection && ik == *theFirstOuterSegmentId && jk == *theFirstInnerSegmentId )
-      {
-        aStartPoint.SetCoord(xc, yc);
-        continue;
-      }
-
-      //check on belonging of intersection point to the both of segments
-      Standard_Boolean isOnLines = Standard_True;
-
-      Standard_Real dd[2][4] = { {(xc-x11), (xc-x12), (xc-x21), (xc-x22)},   //dX
-                                 {(yc-y11), (yc-y12), (yc-y21), (yc-y22)} }; //dY
-
-      for( Standard_Integer i = 0; i < 2; i++ )
-      {
-        if ( dd[i][0] * dd[i][1] > RESOLUTION || dd[i][2] * dd[i][3] > RESOLUTION )
-        {
-          isOnLines = Standard_False;
-          break;
-        }
-      }
-
-      // check the intersection point is on the ends of segments
-      if ( isOnLines )
-      {
-        for( Standard_Integer i = 0; i < 2; i++ )
-        {
-          //     if it's the last segment and intersection point lies at the end
-          if ( ( jk == jkEnd                                              ||
-          //     dX                        && dY
-          //     or when the start or the end point of the first segment
-                (Abs(dd[0][0])  < MIN_DIST && Abs(dd[1][0])   < MIN_DIST) ||
-                (Abs(dd[0][1])  < MIN_DIST && Abs(dd[1][1])   < MIN_DIST)) &&
-          //     is equal to one of the end points of the second
-               (Abs(dd[0][i+2]) < MIN_DIST && Abs(dd[1][i+2]) < MIN_DIST))
-          {
-            // no intersection
-            isOnLines = Standard_False;
-            aLoopArea = aTmpArea = 0.0;
-            aFirstPass = Standard_True;
-            break;
-          }
-        }
-      }
-
-
-      if( isOnLines )
-      {
-        p3.SetX(xc); p3.SetY(yc); 
-        aLoopArea += aFirstTriangleArea;             // First triangle area
-        aLoopArea += triangle2Area(p2, p3); 
-        aLoopArea += triangle2Area(p3, aStartPoint); // Last triangle area
-
-        if( Abs(aLoopArea)/2 > M_PI*MIN_DIST )
-        {
-          if ( findNextIntersection )
-          {
-            // intersection is found, but Standard_False returns, because area is too much
-            return Standard_False;
-          }
-
-          if ( checkWiresIntersection(theFirstWireId, theSecondWireId, &ik, ikEnd, theWireLength,
-                           theBiPoints, Standard_True, isFirst, &jk) )
-          {
-            // small crossing is not intersection, continue cheching
-            aLoopArea = aTmpArea = 0.0;
-            aFirstPass = Standard_True;
-          }
-          else
-          {
-            // if we found only one intersection
-            return Standard_True;
-          }
-        }
-        else if ( findNextIntersection )
-        {
-          // small intersection, skip double checking
-          *theFirstOuterSegmentId = ik;
-          *theFirstInnerSegmentId = jk + 1;
-          return Standard_True;
-        }
-      }
-      if ( aFirstPass )
-        aFirstPass = Standard_False;
-
-      aLoopArea += aTmpArea;
-    }
-    
-    if ( isFirst )
-      isFirst = Standard_False;
-  }
-  return Standard_False;
-}
-
-
-//=======================================================================
-//function : BRepMesh_Classifier
-//purpose  : 
-//=======================================================================
-BRepMesh_Classifier::BRepMesh_Classifier(const TopoDS_Face& theFace,
-                                         const Standard_Real theTolUV,
-                                         const BRepMesh_DataMapOfShapePairOfPolygon& theEdges,
-                                         const TColStd_IndexedMapOfInteger& theMap,
-                                         const Handle(BRepMesh_DataStructureOfDelaun)& theStructure,
-                                         const Standard_Real theUmin,
-                                         const Standard_Real theUmax,
-                                         const Standard_Real theVmin,
-                                         const Standard_Real theVmax)
-: myTolUV( theTolUV ),
-  myFace ( theFace ),
-  myState( BRepMesh_NoError )
-{
-  //-- impasse sur les surfs definies sur plus d une periode
-  //-- once definition
-  myFace.Orientation(TopAbs_FORWARD);
-  
-  TColgp_SequenceOfPnt2d    aWirePoints, aWire;
-  TColStd_SequenceOfInteger aWireLength;
-
-  TopoDS_Iterator aFaceExplorer;
-  for(aFaceExplorer.Initialize(myFace); aFaceExplorer.More(); aFaceExplorer.Next())
-  {
-    if(aFaceExplorer.Value().ShapeType() != TopAbs_WIRE)
-      continue;
-
-    // For each wire we create a data map, linking vertices (only
-    // the ends of edges) with their positions in the sequence of
-    // all 2d points from this wire.
-    // When we meet some vertex for the second time - the piece
-    // of sequence is treated for a HOLE and quits the sequence.
-    // Actually, we must unbind the vertices belonging to the
-    // loop from the map, but since they can't appear twice on the
-    // valid wire, leave them for a little speed up.
-    Standard_Integer aNbEdges = 0;
-    Standard_Integer aFirstIndex = 0, aLastIndex = 0;
-    Standard_Boolean isFalseWire = Standard_False;
-
-    TColgp_SequenceOfPnt2d aSeqPnt2d;
-    TColStd_DataMapOfIntegerInteger aNodeInSeq;
-
-    // Start traversing the wire
-    BRepTools_WireExplorer aWireExplorer;
-    for (aWireExplorer.Init(TopoDS::Wire( aFaceExplorer.Value() ), myFace); aWireExplorer.More(); aWireExplorer.Next())
-    {
-      TopoDS_Edge        anEdge   = aWireExplorer.Current();
-      TopAbs_Orientation anOrient = anEdge.Orientation();
-      if (anOrient != TopAbs_FORWARD && anOrient != TopAbs_REVERSED)
-        continue;
-
-      if (theEdges.IsBound(anEdge))
-      {
-        // Retrieve polygon
-        // Define the direction for adding points to aSeqPnt2d
-        Standard_Integer aIdxFirst, aIdxLast, aIdxIncr;
-
-        const BRepMesh_PairOfPolygon& aPair = theEdges.Find(anEdge);
-        Handle(Poly_PolygonOnTriangulation) aNOD;
-        if (anOrient == TopAbs_FORWARD)
-        {
-          aNOD = aPair.First();
-          aIdxFirst = 1;
-          aIdxLast  = aNOD->NbNodes();
-          aIdxIncr  = 1;
-        }
-        else
-        {
-          aNOD = aPair.Last();
-          aIdxFirst = aNOD->NbNodes();
-          aIdxLast  = 1;
-          aIdxIncr  = -1;
-        }
-        const TColStd_Array1OfInteger& anIndices = aNOD->Nodes();
-
-        // anIndexFirst and anIndexLast are the indices of first and last
-        // vertices of the edge in IndexedMap <Str>
-        const Standard_Integer anIndexFirst = theMap.FindKey( anIndices(aIdxFirst) );
-        const Standard_Integer anIndexLast  = theMap.FindKey( anIndices(aIdxLast) );
-
-        if (anIndexLast == anIndexFirst && (aIdxLast - aIdxFirst) == aIdxIncr)
-        {
-          // case of continuous set of degenerated edges
-          aLastIndex = anIndexLast;
-          continue;
-        }
-
-        // If there's a gap between edges -> raise <isFalseWire> flag
-        if (aNbEdges)
-        {
-          if (anIndexFirst != aLastIndex)
-          {
-            isFalseWire = Standard_True;
-            break;
-          }
-        }
-        else
-          aFirstIndex = anIndexFirst;
-
-        aLastIndex = anIndexLast;
-
-        // Record first vertex (to detect loops)
-        aNodeInSeq.Bind(anIndexFirst, (aSeqPnt2d.Length() + 1));
-
-        // Add vertices in sequence
-        for (Standard_Integer i = aIdxFirst; i != aIdxLast; i += aIdxIncr)
-        {
-          Standard_Integer anIndex = ((i == aIdxFirst) ? anIndexFirst : theMap.FindKey( anIndices(i) ));
-
-          gp_Pnt2d aPnt( theStructure->GetNode(anIndex).Coord() );
-          aSeqPnt2d.Append(aPnt);
-        }
-
-        // Now, is there a loop?
-        if (aNodeInSeq.IsBound(anIndexLast))
-        {
-          // Yes, treat it separately as a hole
-          // 1. Divide points into main wire and a loop
-          const Standard_Integer aIdxWireStart = aNodeInSeq(anIndexLast);
-          if(aIdxWireStart < aSeqPnt2d.Length())
-          {
-            aSeqPnt2d.Split(aIdxWireStart, aWire);
-            // 2. Proceed the loop
-            //AnalizeWire(aLoop, Umin, Umax, Vmin, Vmax, aWirePoints, aWireLength, NbBiPoint);
-            aWireLength.Append( aWire.Length() );
-            aWirePoints.Append( aWire );
-          }
-        }
-        aNbEdges++;
-      }
-    }
-
-    if (aNbEdges)
-    {
-      // Isn't it open?
-      if (isFalseWire || (aFirstIndex != aLastIndex) || aSeqPnt2d.Length() > 1)
-      {
-        myState = BRepMesh_OpenWire;
-        return;
-      }
-    }
-  }
-
-  const Standard_Integer aNbWires = aWireLength.Length();
-  Standard_Integer aNbBiPoint = aWirePoints.Length();
-  BRepMesh_Array1OfBiPoint aBiPoints(0, aNbBiPoint);
-  BRepMesh_BiPoint *aBiPoint = &(aBiPoints.ChangeValue(1));
-
-  // Fill array of segments (bi-points)
-  Standard_Integer k = 1;
-  for (Standard_Integer i = 1; i <= aNbWires; i++)
-  {
-    Standard_Real x1 = 0., y1 = 0., x2, y2, aXstart = 0., aYstart = 0.;
-    const Standard_Integer aLen = aWireLength(i) + 1;
-    for (Standard_Integer j = 1; j <= aLen; j++)
-    {
-      // Obtain last point of the segment
-      if (j == aLen)
-      {
-        x2 = aXstart;
-        y2 = aYstart;
-      }
-      else
-      {
-        const gp_Pnt2d& aPnt = aWirePoints(k);
-        k++;
-
-        x2 = aPnt.X();
-        y2 = aPnt.Y();
-      }
-      // Build segment (bi-point)
-      if (j == 1)
-      {
-        aXstart = x2;
-        aYstart = y2;
-      }
-      else
-      {
-        Standard_Real *aCoordinates1 = ((Standard_Real*)(aBiPoint->Coordinates()));
-        aBiPoint++;
-
-        aCoordinates1[0] = x1;
-        aCoordinates1[1] = y1;
-        aCoordinates1[2] = x2;
-        aCoordinates1[3] = y2;
-        aCoordinates1[4] = x2 - x1;
-        aCoordinates1[5] = y2 - y1;
-      }
-      x1 = x2;
-      y1 = y2;
-    }
-  }
-
-  // Search the intersection
-  // Explore first wire
-  Standard_Integer ikEnd = 0;
-  for(Standard_Integer i = 1; i <= aNbWires; i++)
-  {
-    Standard_Integer ik = ikEnd + 1;
-    ikEnd += aWireLength(i);
-
-    // Explore second wire
-    for (Standard_Integer j = i; j <= aNbWires; j++)
-    {
-      if ( checkWiresIntersection(i, j, &ik, ikEnd, aWireLength, aBiPoints) )
-      {
-        myState = BRepMesh_SelfIntersectingWire;
-        return;
-      }
-    }
-  }
-
-  // Find holes
-  for (Standard_Integer i = aNbWires; i >= 1; i--)
-  {
-    aNbBiPoint = aWirePoints.Length() - aWireLength(i) + 1;
-    aWirePoints.Split(aNbBiPoint, aWire);
-    AnalizeWire(aWire, theUmin, theUmax, theVmin, theVmax);
-  }
-}
-
-
-//=======================================================================
-//function : Perform
-//purpose  : 
-//=======================================================================
-TopAbs_State BRepMesh_Classifier::Perform(const gp_Pnt2d& thePoint) const
-{
-  Standard_Boolean isOut = Standard_False;
-  Standard_Integer aNb   = myTabClass.Length();
-  
-  for (Standard_Integer i = 1; i <= aNb; i++)
-  {
-    Standard_Integer aCur = ((CSLib_Class2d*)myTabClass(i))->SiDans(thePoint);
-    if (aCur == 0)
-    {
-      // Point is ON, but mark it as OUT
-      isOut = Standard_True;
-    }
-    else
-      isOut = myTabOrient(i)? (aCur == -1) : (aCur == 1);
-    
-    if (isOut)
-      return TopAbs_OUT;
-  }
-
-  return TopAbs_IN;
-}
-
-
-//=======================================================================
 //function : Destroy
 //purpose  : 
 //=======================================================================
@@ -616,4 +135,7 @@ void BRepMesh_Classifier::Destroy()
       myTabClass(i) = NULL;
     }
   }
+
+  myTabClass.Clear();
+  myTabOrient.Clear();
 }
diff --git a/src/BRepMesh/BRepMesh_Classifier.hxx b/src/BRepMesh/BRepMesh_Classifier.hxx
new file mode 100644 (file)
index 0000000..42c266d
--- /dev/null
@@ -0,0 +1,79 @@
+// Created on: 2014-06-03
+// Created by: Oleg AGASHIN
+// Copyright (c) 1997-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepMesh_Classifier_HeaderFile
+#define _BRepMesh_Classifier_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_DefineAlloc.hxx>
+#include <Standard_Macro.hxx>
+#include <BRepTopAdaptor_SeqOfPtr.hxx>
+#include <TColStd_SequenceOfBoolean.hxx>
+#include <TopAbs_State.hxx>
+#include <NCollection_Sequence.hxx>
+
+class gp_Pnt2d;
+class TColgp_SequenceOfPnt2d;
+
+//! Auxilary class contains information about correctness of discretized 
+//! face and used for classification of points regarding face internals.
+class BRepMesh_Classifier
+{
+public:
+
+  DEFINE_STANDARD_ALLOC
+
+  //! Constructor.
+  Standard_EXPORT BRepMesh_Classifier();
+
+  //! Destructor.
+  ~BRepMesh_Classifier()
+  {
+    Destroy();
+  }
+
+  //! Method is called on destruction.
+  //! Clears internal data structures.
+  Standard_EXPORT void Destroy();
+  
+  //! Performs classification of the given point regarding to face internals.
+  //! \param thePoint Point in parametric space to be classified.
+  //! \return 
+  Standard_EXPORT TopAbs_State Perform(const gp_Pnt2d& thePoint) const;
+
+  //! Registers wire specified by sequence of points for 
+  //! further classification of points.
+  //! \param theWire Wire to be registered. Specified by sequence of points.
+  //! \param theTolUV Tolerance to be used for calculations in parametric space.
+  //! \param theUmin Lower U boundary of the face in parametric space.
+  //! \param theUmax Upper U boundary of the face in parametric space.
+  //! \param theVmin Lower V boundary of the face in parametric space.
+  //! \param theVmax Upper V boundary of the face in parametric space.
+  void RegisterWire(
+    const NCollection_Sequence<gp_Pnt2d>& theWire,
+    const Standard_Real                   theTolUV,
+    const Standard_Real                   theUmin,
+    const Standard_Real                   theUmax,
+    const Standard_Real                   theVmin,
+    const Standard_Real                   theVmax);
+
+private:
+
+  BRepTopAdaptor_SeqOfPtr       myTabClass;
+  TColStd_SequenceOfBoolean     myTabOrient;
+};
+
+#endif
diff --git a/src/BRepMesh/BRepMesh_Classifier.lxx b/src/BRepMesh/BRepMesh_Classifier.lxx
deleted file mode 100644 (file)
index 0fc6605..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-// Created on: 2003-11-05
-// Created by: Open CASCADE Support
-// Copyright (c) 2003-2014 OPEN CASCADE SAS
-//
-// This file is part of Open CASCADE Technology software library.
-//
-// This library is free software; you can redistribute it and/or modify it under
-// the terms of the GNU Lesser General Public License version 2.1 as published
-// by the Free Software Foundation, with special exception defined in the file
-// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
-// distribution for complete text of the license and disclaimer of any warranty.
-//
-// Alternatively, this file may be used under the terms of Open CASCADE
-// commercial license or contractual agreement.
-
-//=======================================================================
-//function : State
-//purpose  : 
-//=======================================================================
-
-inline BRepMesh_Status BRepMesh_Classifier::State() const
-{
-  return myState;
-}
index ed9e4d1..6d8ec6f 100644 (file)
@@ -16,9 +16,9 @@
 #ifndef BRepMesh_ClassifierPtr_HeaderFile
 #define BRepMesh_ClassifierPtr_HeaderFile
 
-#include <BRepMesh_Classifier.hxx>
 #include <NCollection_Handle.hxx>
 
+class BRepMesh_Classifier;
 typedef NCollection_Handle<BRepMesh_Classifier> BRepMesh_ClassifierPtr;
 
 #endif
index c833f9c..a536814 100644 (file)
@@ -56,9 +56,8 @@ const Standard_Real AngDeviation1Deg  = M_PI/180.;
 const Standard_Real AngDeviation90Deg = 90 * AngDeviation1Deg;
 const Standard_Real Angle2PI          = 2 * M_PI;
 
-const Standard_Real Precision    = Precision::PConfusion();
-const Standard_Real EndPrecision = 1 - Precision;
-const Standard_Real Precision2   = Precision * Precision;
+const Standard_Real Precision  = Precision::PConfusion();
+const Standard_Real Precision2 = Precision * Precision;
 const gp_XY SortingDirection(M_SQRT1_2, M_SQRT1_2);
 
 //=======================================================================
@@ -1060,10 +1059,11 @@ Standard_Boolean BRepMesh_Delaun::checkIntersection(
         continue;
 
       gp_Pnt2d anIntPnt;
-      IntFlag aIntFlag = intSegSeg( theLink, aPolyLink, 
-        isConsiderEndPointTouch, isConsiderPointOnEdge, anIntPnt );
+      BRepMesh_WireInterferenceChecker::IntFlag aIntFlag = 
+        intSegSeg( theLink, aPolyLink, isConsiderEndPointTouch, 
+        isConsiderPointOnEdge, anIntPnt );
 
-      if ( aIntFlag != BRepMesh_Delaun::NoIntersection )
+      if ( aIntFlag != BRepMesh_WireInterferenceChecker::NoIntersection )
         return Standard_False;
     }
   }
@@ -1535,16 +1535,16 @@ void BRepMesh_Delaun::meshPolygon( TColStd_SequenceOfInteger&            thePoly
       };
 
       gp_Pnt2d anIntPnt;
-      IntFlag aIntFlag = intSegSeg( *aCurEdge, *aNextEdge, 
-        Standard_False, Standard_True, anIntPnt );
+      BRepMesh_WireInterferenceChecker::IntFlag aIntFlag = intSegSeg( *aCurEdge, 
+        *aNextEdge, Standard_False, Standard_True, anIntPnt );
 
-      if ( aIntFlag == BRepMesh_Delaun::NoIntersection )
+      if ( aIntFlag == BRepMesh_WireInterferenceChecker::NoIntersection )
         continue;
 
       Standard_Boolean isRemoveFromFirst  = Standard_False;
       Standard_Boolean isAddReplacingEdge = Standard_True;
       Standard_Integer aIndexToRemoveTo   = aNextPolyIt;
-      if ( aIntFlag == BRepMesh_Delaun::Cross )
+      if ( aIntFlag == BRepMesh_WireInterferenceChecker::Cross )
       {
         Standard_Real aLoopArea = polyArea( thePolygon, aPolyIt + 1, aNextPolyIt );
         gp_Vec2d aVec1( anIntPnt, aCurPnts [1] );
@@ -1586,7 +1586,7 @@ void BRepMesh_Delaun::meshPolygon( TColStd_SequenceOfInteger&            thePoly
             theSkipped->Add( Abs( thePolygon( aSkippedLinkIt ) ) );
         }
       }
-      else if ( aIntFlag == BRepMesh_Delaun::PointOnEdge )
+      else if ( aIntFlag == BRepMesh_WireInterferenceChecker::PointOnSegment )
       {
         // Indentify chopping link 
         Standard_Boolean isFirstChopping = Standard_False;
@@ -1657,7 +1657,7 @@ void BRepMesh_Delaun::meshPolygon( TColStd_SequenceOfInteger&            thePoly
             thePolygon, thePolyBoxes );
         }
       }
-      else if ( aIntFlag == BRepMesh_Delaun::Glued )
+      else if ( aIntFlag == BRepMesh_WireInterferenceChecker::Glued )
       {
         if ( aCurNodes[1] == aNextNodes[0] )
         {
@@ -1666,7 +1666,7 @@ void BRepMesh_Delaun::meshPolygon( TColStd_SequenceOfInteger&            thePoly
         }
         // TODO: Non-adjacent glued links within the polygon
       }
-      else if ( aIntFlag == BRepMesh_Delaun::Same )
+      else if ( aIntFlag == BRepMesh_WireInterferenceChecker::Same )
       {
         processLoop( aPolyIt, aNextPolyIt, thePolygon, thePolyBoxes );
 
@@ -1843,10 +1843,11 @@ void BRepMesh_Delaun::meshSimplePolygon( TColStd_SequenceOfInteger&     thePolyg
 
           // intersection is possible...                  
           gp_Pnt2d anIntPnt;
-          IntFlag aIntFlag = intSegSeg( aCheckLink, aPolyLink, 
-            Standard_False, Standard_False, anIntPnt );
+          BRepMesh_WireInterferenceChecker::IntFlag aIntFlag = 
+            intSegSeg( aCheckLink, aPolyLink, Standard_False, 
+            Standard_False, anIntPnt );
 
-          if( aIntFlag != BRepMesh_Delaun::NoIntersection )
+          if( aIntFlag != BRepMesh_WireInterferenceChecker::NoIntersection )
           {
             isIntersect = Standard_True;
             break;
@@ -2274,54 +2275,16 @@ Standard_Boolean BRepMesh_Delaun::Contains( const Standard_Integer theTriangleId
               ( aDistance[0] <= 0. && aDistance[1] <= 0. && aDistance[2] <= 0. ) ) );
 }
 
-
-//=============================================================================
-//function : classifyPoint
-//purpose  : Classifies the point in case of coincidence of two vectors.
-//           Returns zero value if point is out of segment and non zero 
-//           value if point is between the first and the second point of segment.
-//           thePoint1       - the start point of a segment (base point)
-//           thePoint2       - the end point of a segment
-//           thePointToCheck - the point to classify
-//=============================================================================
-Standard_Integer BRepMesh_Delaun::classifyPoint( const gp_XY& thePoint1,
-                                                 const gp_XY& thePoint2,
-                                                 const gp_XY& thePointToCheck ) const
-{
-  gp_XY aP1 = thePoint2       - thePoint1;
-  gp_XY aP2 = thePointToCheck - thePoint1;
-  
-  Standard_Real aDist = Abs( aP1 ^ aP2 );
-  if ( aDist >= Precision )
-  {
-    aDist = ( aDist * aDist ) / aP1.SquareModulus();
-    if ( aDist >= Precision2 )
-      return 0; //out
-  }
-    
-  gp_XY aMult = aP1.Multiplied( aP2 );
-  if ( aMult.X() < 0.0 || aMult.Y() < 0.0 )
-    return 0; //out
-    
-  if ( aP1.SquareModulus() < aP2.SquareModulus() )
-    return 0; //out
-    
-  if ( thePointToCheck.IsEqual( thePoint1, Precision ) || 
-       thePointToCheck.IsEqual( thePoint2, Precision ) )
-    return -1; //coinsides with an end point
-    
-  return 1;
-}
-
 //=============================================================================
 //function : intSegSeg
 //purpose  : Checks intersection between the two segments.
 //=============================================================================
-BRepMesh_Delaun::IntFlag BRepMesh_Delaun::intSegSeg( const BRepMesh_Edge&   theEdg1,
-                                                     const BRepMesh_Edge&   theEdg2,
-                                                     const Standard_Boolean isConsiderEndPointTouch,
-                                                     const Standard_Boolean isConsiderPointOnEdge,
-                                                     gp_Pnt2d&              theIntPnt) const
+BRepMesh_WireInterferenceChecker::IntFlag BRepMesh_Delaun::intSegSeg( 
+  const BRepMesh_Edge&   theEdg1,
+  const BRepMesh_Edge&   theEdg2,
+  const Standard_Boolean isConsiderEndPointTouch,
+  const Standard_Boolean isConsiderPointOnEdge,
+  gp_Pnt2d&              theIntPnt) const
 {
   gp_XY p1, p2, p3, p4;
   p1 = GetVertex( theEdg1.FirstNode() ).Coord();
@@ -2329,113 +2292,8 @@ BRepMesh_Delaun::IntFlag BRepMesh_Delaun::intSegSeg( const BRepMesh_Edge&   theE
   p3 = GetVertex( theEdg2.FirstNode() ).Coord();
   p4 = GetVertex( theEdg2.LastNode()  ).Coord();
   
-  Standard_Integer aPoint1 = classifyPoint( p1, p2, p3 );
-  Standard_Integer aPoint2 = classifyPoint( p1, p2, p4 );
-  Standard_Integer aPoint3 = classifyPoint( p3, p4, p1 );
-  Standard_Integer aPoint4 = classifyPoint( p3, p4, p2 );
-
-  // Consider case when edges have shared vertex
-  if ( isConsiderEndPointTouch )
-  {
-    if ( aPoint1 < 0 || aPoint2 < 0 )
-      return BRepMesh_Delaun::EndPointTouch;
-  }
-
-  Standard_Integer aPosHash = 
-    aPoint1 + aPoint2 + aPoint3 + aPoint4;
-
-  /*=========================================*/
-  /*  1) hash code == 1:
-
-                    0+
-                    /
-           0      1/         0
-           +======+==========+
-  
-      2) hash code == 2:
-
-           0    1        1   0
-        a) +----+========+---+
-
-           0       1   1     0
-        b) +-------+===+=====+
-
-                                             */
-  /*=========================================*/
-  if ( aPosHash == 1 )
-  {
-    return isConsiderPointOnEdge ? 
-      BRepMesh_Delaun::PointOnEdge :
-      BRepMesh_Delaun::NoIntersection;
-  }
-  else if ( aPosHash == 2 )
-    return BRepMesh_Delaun::Glued;
-
-  gp_XY aVec1           = p2 - p1;
-  gp_XY aVec2           = p4 - p3;
-  gp_XY aVecStartPoints = p3 - p1;
-    
-  Standard_Real aCrossD1D2 = aVec1           ^ aVec2;
-  Standard_Real aCrossD1D3 = aVecStartPoints ^ aVec2;
-
-  // is edgegs codirectional
-  if ( Abs( aCrossD1D2 ) < Precision )
-  {
-    // just a parallel case?
-    if( Abs( aCrossD1D3 ) < Precision )
-    {
-      /*=========================================*/
-      /*  Here the following cases are possible:
-          1) hash code == -4:
-
-               -1                -1
-                +=================+
-               -1                -1
-
-          2) hash code == -2:
-
-                0       -1        0
-                +--------+========+
-                        -1
-
-          3) hash code == -1:
-
-                0        1        -1
-                +--------+========+
-                                  -1
-
-          4) hash code == 0:
-
-                0      0  0       0
-                +------+  +=======+
-                0      0  0       0
-                                                 */
-      /*=========================================*/
-
-      if ( aPosHash < -2 )
-        return BRepMesh_Delaun::Same;
-      else if ( aPosHash == -1 )
-        return BRepMesh_Delaun::Glued;
-
-      return BRepMesh_Delaun::NoIntersection;
-    }
-    else
-      return BRepMesh_Delaun::NoIntersection;
-  }
-
-  Standard_Real aPar = aCrossD1D3 / aCrossD1D2;
-  // inrersects out of first segment range
-  if( aPar < Precision || aPar > EndPrecision )
-    return BRepMesh_Delaun::NoIntersection;
-  Standard_Real aCrossD2D3 = aVecStartPoints.Reversed() ^ aVec1;
-  aPar = aCrossD2D3 / -aCrossD1D2;
-  // inrersects out of second segment range
-  if( aPar < Precision || aPar > EndPrecision )
-    return BRepMesh_Delaun::NoIntersection;
-  theIntPnt = p3 + aPar * aVec2;
-  return BRepMesh_Delaun::Cross;
+  return BRepMesh_WireInterferenceChecker::Intersect(p1, p2, p3, p4,
+    isConsiderEndPointTouch, isConsiderPointOnEdge, theIntPnt);
 }
 
 //=============================================================================
index f4cfc78..71c2fab 100755 (executable)
@@ -25,6 +25,7 @@
 #include <BRepMesh_MapOfIntegerInteger.hxx>
 #include <BRepMesh_DataStructureOfDelaun.hxx>
 #include <NCollection_Sequence.hxx>
+#include <BRepMesh_WireInterferenceChecker.hxx>
 
 class Bnd_B2d;
 class Bnd_Box2d;
@@ -119,16 +120,6 @@ public:
 
 private:
 
-  enum IntFlag
-  {
-    NoIntersection,
-    Cross,
-    EndPointTouch,
-    PointOnEdge,
-    Glued,
-    Same
-  };
-
   enum ReplaceFlag
   {
     Replace,
@@ -305,21 +296,13 @@ private:
                                Standard_Real          theSqModulus[3],
                                Standard_Integer&      theEdgeOn) const;
 
-  //! Classifies the point in case of coincidence of two vectors.
-  //! @param thePoint1       the start point of a segment (base point)
-  //! @param thePoint2       the end point of a segment
-  //! @param thePointToCheck the point to classify
-  //! @returns zero value if point is out of segment and non zero value if point is between the first and the second point of segment
-  Standard_Integer classifyPoint (const gp_XY& thePoint1,
-                                  const gp_XY& thePoint2,
-                                  const gp_XY& thePointToCheck) const;
-
   //! Checks intersection between the two segments.
-  IntFlag intSegSeg (const BRepMesh_Edge&   theEdge1,
-                     const BRepMesh_Edge&   theEdge2,
-                     const Standard_Boolean isConsiderEndPointTouch,
-                     const Standard_Boolean isConsiderPointOnEdge,
-                     gp_Pnt2d&              theIntPnt) const;
+  BRepMesh_WireInterferenceChecker::IntFlag intSegSeg (
+    const BRepMesh_Edge&   theEdge1,
+    const BRepMesh_Edge&   theEdge2,
+    const Standard_Boolean isConsiderEndPointTouch,
+    const Standard_Boolean isConsiderPointOnEdge,
+    gp_Pnt2d&              theIntPnt) const;
 
   //! Returns area of the loop of the given polygon defined by indices of its start and end links.
   Standard_Real polyArea (const TColStd_SequenceOfInteger& thePolygon,
index e7a12b0..340eddc 100644 (file)
@@ -67,24 +67,26 @@ uses    Boolean                   from Standard,
 
 is
 
-        Create (defle     : Real    from Standard;
-                angle     : Real    from Standard;
-                B         : Box     from Bnd;
-                withShare : Boolean from Standard=Standard_True;
-                inshape   : Boolean from Standard=Standard_False;
-                relative  : Boolean from Standard=Standard_False;
-                shapetrigu: Boolean from Standard=Standard_False)
+        Create (defle       : Real    from Standard;
+                angle       : Real    from Standard;
+                B           : Box     from Bnd;
+                withShare   : Boolean from Standard=Standard_True;
+                inshape     : Boolean from Standard=Standard_False;
+                relative    : Boolean from Standard=Standard_False;
+                shapetrigu  : Boolean from Standard=Standard_False;
+                isInParallel: Boolean from Standard=Standard_False)
           returns FastDiscret from BRepMesh;
 
 
-        Create (defle     : Real    from Standard;
-                shape     : Shape   from TopoDS;
-                B         : Box     from Bnd;
-                angle     : Real    from Standard;
-                withShare : Boolean from Standard=Standard_True;
-                inshape   : Boolean from Standard=Standard_False;
-                relative  : Boolean from Standard=Standard_False;
-                shapetrigu: Boolean from Standard=Standard_False)
+        Create (defle       : Real    from Standard;
+                shape       : Shape   from TopoDS;
+                B           : Box     from Bnd;
+                angle       : Real    from Standard;
+                withShare   : Boolean from Standard=Standard_True;
+                inshape     : Boolean from Standard=Standard_False;
+                relative    : Boolean from Standard=Standard_False;
+                shapetrigu  : Boolean from Standard=Standard_False;
+                isInParallel: Boolean from Standard=Standard_False)
            ---Purpose: if the  boolean    <relative>   is  True,    the
            --          deflection used   for the polygonalisation   of
            --          each edge will be <defle> * Size of Edge.
index d65e8eb..9ef6818 100644 (file)
@@ -20,6 +20,8 @@
 #include <BRepMesh_FaceAttribute.hxx>
 #include <BRepMesh_DataStructureOfDelaun.hxx>
 #include <BRepMesh_ClassifierPtr.hxx>
+#include <BRepMesh_Classifier.hxx>
+#include <BRepMesh_WireChecker.hxx>
 #include <BRepMesh_GeomTool.hxx>
 #include <BRepMesh_PairOfPolygon.hxx>
 #include <BRepMesh_DataMapOfShapePairOfPolygon.hxx>
@@ -126,11 +128,12 @@ BRepMesh_FastDiscret::BRepMesh_FastDiscret(const Standard_Real    theDefle,
                                            const Standard_Boolean theWithShare,
                                            const Standard_Boolean theInshape,
                                            const Standard_Boolean theRelative,
-                                           const Standard_Boolean theShapetrigu) :
-  myAngle (theAngl),
+                                           const Standard_Boolean theShapetrigu,
+                                           const Standard_Boolean isInParallel)
+: myAngle (theAngl),
   myDeflection (theDefle),
   myWithShare (theWithShare),
-  myInParallel (Standard_False),
+  myInParallel (isInParallel),
   myNbLocat (0),
   myRelative (theRelative),
   myShapetrigu (theShapetrigu), 
@@ -153,11 +156,12 @@ BRepMesh_FastDiscret::BRepMesh_FastDiscret(const Standard_Real    theDefle,
                                            const Standard_Boolean theWithShare,
                                            const Standard_Boolean theInshape,
                                            const Standard_Boolean theRelative,
-                                           const Standard_Boolean theShapetrigu): 
-  myAngle (theAngl),
+                                           const Standard_Boolean theShapetrigu,
+                                           const Standard_Boolean isInParallel)
+: myAngle (theAngl),
   myDeflection (theDefle),
   myWithShare (theWithShare),
-  myInParallel (Standard_False),
+  myInParallel (isInParallel),
   myNbLocat (0),
   myRelative (theRelative),
   myShapetrigu (theShapetrigu),
@@ -493,59 +497,59 @@ void BRepMesh_FastDiscret::Add(const TopoDS_Face& theface,
     Standard_Integer nbVertices = myVemap.Extent();
     const Standard_Real tolclass = Precision::PConfusion(); //0.03*Max(myumax-myumin, myvmax-myvmin);
     
-    BRepMesh_ClassifierPtr classifier ( 
-      new BRepMesh_Classifier(face, tolclass,  myInternaledges, myVemap, 
-                              myStructure, myumin, myumax, myvmin, myvmax) );   
-  
-    myFacestate = classifier->State();
-    if (myFacestate == BRepMesh_SelfIntersectingWire)
+    BRepMesh_ClassifierPtr classifier = new BRepMesh_Classifier;
     {
-      Standard_Integer nbmaill = 0;
-      Standard_Real eps = Precision::Confusion();
-      while (nbmaill < 5 && myFacestate != BRepMesh_ReMesh)
+      BRepMesh_WireChecker aDFaceChecker(face, 
+        tolclass, myInternaledges, myVemap, myStructure, 
+        myumin, myumax, myvmin, myvmax, myInParallel);
+      aDFaceChecker.ReCompute(classifier);
+    
+      myFacestate = aDFaceChecker.Status();
+      if (myFacestate == BRepMesh_SelfIntersectingWire)
       {
-        nbmaill++;
-        
-        //clear the structure of links
-        myStructure.Nullify();
-        myStructure = new BRepMesh_DataStructureOfDelaun(anAlloc);
-        
-        myVemap.Clear();
-        myLocation2d.Clear();
-        myInternaledges.Clear();
-
-        Standard_Integer j1;
-        for(j1 = 1; j1 <= aShSeq.Length(); j1++)
+        Standard_Integer nbmaill = 0;
+        Standard_Real eps = Precision::Confusion();
+        while (nbmaill < 5 && myFacestate != BRepMesh_ReMesh)
         {
-          const TopoDS_Edge& edge = TopoDS::Edge(aShSeq.Value(j1));
-          if (myEdges.IsBound(edge))
+          nbmaill++;
+          
+          //clear the structure of links
+          myStructure.Nullify();
+          myStructure = new BRepMesh_DataStructureOfDelaun(anAlloc);
+          
+          myVemap.Clear();
+          myLocation2d.Clear();
+          myInternaledges.Clear();
+
+          Standard_Integer j1;
+          for(j1 = 1; j1 <= aShSeq.Length(); j1++)
           {
-            myEdges.UnBind(edge);
-            myInternaledges.UnBind(edge);
+            const TopoDS_Edge& edge = TopoDS::Edge(aShSeq.Value(j1));
+            if (myEdges.IsBound(edge))
+            {
+              myEdges.UnBind(edge);
+              myInternaledges.UnBind(edge);
+            }
+          }
+          
+          
+          for( j1 = 1; j1 <= aShSeq.Length(); j1++)
+          {
+            const TopoDS_Edge& edge = TopoDS::Edge(aShSeq.Value(j1));
+            defedge = myMapdefle(edge) / 3.;
+            defedge = Max(defedge, eps);
+            myMapdefle.Bind(edge, defedge);
+            const Handle(Geom2d_Curve)& C = aCSeq.Value(j1);
+            Add(edge, face, gFace, C, theAncestors, defedge, aFSeq.Value(j1), aLSeq.Value(j1));
           }
-        }
-        
-        
-        for( j1 = 1; j1 <= aShSeq.Length(); j1++)
-        {
-          const TopoDS_Edge& edge = TopoDS::Edge(aShSeq.Value(j1));
-          defedge = myMapdefle(edge) / 3.;
-          defedge = Max(defedge, eps);
-          myMapdefle.Bind(edge, defedge);
-          const Handle(Geom2d_Curve)& C = aCSeq.Value(j1);
-          Add(edge, face, gFace, C, theAncestors, defedge, aFSeq.Value(j1), aLSeq.Value(j1));
-        }
-
-        classifier.Nullify();
-
-        classifier = new BRepMesh_Classifier(face, tolclass, myInternaledges, myVemap,
-                                             myStructure, myumin, myumax, myvmin, myvmax);
 
-        if (classifier->State() == BRepMesh_NoError)
-        {
-          myFacestate = BRepMesh_ReMesh;
+          aDFaceChecker.ReCompute(classifier);
+          if (aDFaceChecker.Status() == BRepMesh_NoError)
+          {
+            myFacestate = BRepMesh_ReMesh;
+          }
+          nbVertices = myVemap.Extent();
         }
-        nbVertices = myVemap.Extent();
       }
     }
     
index b453e12..f889017 100644 (file)
@@ -25,6 +25,7 @@
 #include <BRepMesh_DataMapIteratorOfDataMapOfShapePairOfPolygon.hxx>
 #include <BRep_ListIteratorOfListOfPointRepresentation.hxx>
 #include <BRepMesh_ClassifierPtr.hxx>
+#include <BRepMesh_Classifier.hxx>
 #include <BRep_Builder.hxx>
 #include <BRep_PointRepresentation.hxx>
 #include <BRep_TVertex.hxx>
index 09cca19..b08023c 100644 (file)
@@ -109,10 +109,10 @@ BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh()
 //function : BRepMesh_IncrementalMesh
 //purpose  : 
 //=======================================================================
-BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh (const TopoDS_Shape& theShape,
-                                                    const Standard_Real theDeflection,
+BRepMesh_IncrementalMesh::BRepMesh_IncrementalMesh (const TopoDS_Shape&    theShape,
+                                                    const Standard_Real    theDeflection,
                                                     const Standard_Boolean theRelative,
-                                                    const Standard_Real theAngle,
+                                                    const Standard_Real    theAngle,
                                                     const Standard_Boolean theInParallel)
 : myRelative (theRelative),
   myInParallel (theInParallel)
@@ -215,12 +215,13 @@ void BRepMesh_IncrementalMesh::Perform()
   }
   //
   myMesh = new BRepMesh_FastDiscret(myDeflection,
-                                   myAngle,
-                                   aBox,
-                                   Standard_True,
-                                   Standard_True,
-                                   myRelative,
-                                   Standard_True);
+            myAngle,
+            aBox,
+            Standard_True,
+            Standard_True,
+            myRelative,
+            Standard_True,
+            myInParallel);
   //
   Update(myShape);
 }
@@ -519,7 +520,7 @@ void  BRepMesh_IncrementalMesh::Update(const TopoDS_Face& F)
               TopoDS_Face F2 = TopoDS::Face(it.Value());
               if (!MShape.Contains(F2)) {
                 MShape.Add(F2);
-                T = BRep_Tool::Triangulation(F2, l);     
+                T = BRep_Tool::Triangulation(F2, l);
                 if (!T.IsNull()) {
 #ifdef DEB_MESH
                   cout <<"triangulation a refaire" <<endl;
diff --git a/src/BRepMesh/BRepMesh_WireChecker.cxx b/src/BRepMesh/BRepMesh_WireChecker.cxx
new file mode 100644 (file)
index 0000000..a2826fc
--- /dev/null
@@ -0,0 +1,423 @@
+// Created on: 2014-06-03
+// Created by: Oleg AGASHIN
+// Copyright (c) 1997-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepMesh_WireChecker.hxx>
+
+#include <Precision.hxx>
+#include <TColStd_Array1OfInteger.hxx>
+#include <gp_Pnt2d.hxx>
+#include <BRepTools_WireExplorer.hxx>
+#include <TopAbs_Orientation.hxx>
+#include <TopoDS.hxx>
+#include <TopoDS_Iterator.hxx>
+#include <Poly_PolygonOnTriangulation.hxx>
+#include <BRepMesh_PairOfPolygon.hxx>
+#include <BRepMesh_DataMapOfShapePairOfPolygon.hxx>
+#include <TColStd_SequenceOfInteger.hxx>
+#include <TColStd_IndexedMapOfInteger.hxx>
+#include <BRepMesh_DataStructureOfDelaun.hxx>
+#include <BRepMesh_Classifier.hxx>
+#include <BRepMesh_WireInterferenceChecker.hxx>
+
+#ifdef HAVE_TBB
+  // paralleling using Intel TBB
+  #include <tbb/parallel_for.h>
+  #include <tbb/blocked_range.h>
+#endif
+
+//=======================================================================
+//function : Selector::Constructor
+//purpose  : 
+//=======================================================================
+BRepMesh_WireChecker::BndBox2dTreeSelector::BndBox2dTreeSelector(
+  const Standard_Integer theReservedSize)
+  : mySkippedIndex(-1),
+    myIndices(0, theReservedSize - 1),
+    myIndicesNb(0)
+{
+}
+
+//=======================================================================
+//function : Reject
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepMesh_WireChecker::BndBox2dTreeSelector::Reject(
+  const Bnd_Box2d& theBox2D) const
+{
+  return myBox2D.IsOut(theBox2D);
+}
+
+//=======================================================================
+//function : Accept
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepMesh_WireChecker::BndBox2dTreeSelector::Accept(
+  const Standard_Integer& theIndex)
+{
+  if (theIndex <= mySkippedIndex)
+    return Standard_False;
+
+  myIndices(myIndicesNb++) = theIndex;
+  return Standard_True;
+}
+
+//=======================================================================
+//function : Clear
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireChecker::BndBox2dTreeSelector::Clear()
+{
+  mySkippedIndex = -1;
+  myIndicesNb    = 0;
+}
+
+//=======================================================================
+//function : SetBox
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireChecker::BndBox2dTreeSelector::SetBox(
+  const Bnd_Box2d& theBox2D)
+{
+  myBox2D = theBox2D;
+}
+
+//=======================================================================
+//function : Clear
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireChecker::BndBox2dTreeSelector::SetSkippedIndex(
+  const Standard_Integer theIndex)
+{
+  mySkippedIndex = theIndex;
+}
+
+//=======================================================================
+//function : Indices
+//purpose  : 
+//=======================================================================
+const BRepMesh_WireChecker::ArrayOfInteger& 
+  BRepMesh_WireChecker::BndBox2dTreeSelector::Indices() const
+{
+  return myIndices;
+}
+
+//=======================================================================
+//function : IndicesNb
+//purpose  : 
+//=======================================================================
+Standard_Integer BRepMesh_WireChecker::BndBox2dTreeSelector::IndicesNb() const
+{
+  return myIndicesNb;
+}
+
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+BRepMesh_WireChecker::BRepMesh_WireChecker(
+  const TopoDS_Face&                            theFace,
+  const Standard_Real                           theTolUV,
+  const BRepMesh_DataMapOfShapePairOfPolygon&   theEdges,
+  const TColStd_IndexedMapOfInteger&            theVertexMap,
+  const Handle(BRepMesh_DataStructureOfDelaun)& theStructure,
+  const Standard_Real                           theUmin,
+  const Standard_Real                           theUmax,
+  const Standard_Real                           theVmin,
+  const Standard_Real                           theVmax,
+  const Standard_Boolean                        isInParallel)
+  : myTolUV(theTolUV),
+    myEdges(theEdges),
+    myVertexMap(theVertexMap),
+    myStructure(theStructure),
+    myUmin(theUmin),
+    myUmax(theUmax),
+    myVmin(theVmin),
+    myVmax(theVmax),
+    myStatus(BRepMesh_NoError),
+    myIsInParallel(isInParallel)
+{
+  TopoDS_Face aFace = theFace;
+  aFace.Orientation(TopAbs_FORWARD);
+
+  TopoDS_Iterator aFaceExplorer(aFace);
+  for (; aFaceExplorer.More(); aFaceExplorer.Next())
+  {
+    const TopoDS_Shape& aWire = aFaceExplorer.Value();
+    if (aWire.ShapeType() != TopAbs_WIRE)
+      continue;
+
+    myWiresEdges.push_back(ListOfEdges());
+    ListOfEdges& aEdges = myWiresEdges.back();
+
+    // Start traversing the wires
+    BRepTools_WireExplorer aWireExplorer(TopoDS::Wire(aWire), aFace);
+    for (; aWireExplorer.More(); aWireExplorer.Next())
+    {
+      const TopoDS_Edge& aEdge   = aWireExplorer.Current();
+      TopAbs_Orientation aOrient = aEdge.Orientation();
+      if (aOrient != TopAbs_FORWARD && aOrient != TopAbs_REVERSED)
+        continue;
+
+      aEdges.Append(aEdge);
+    }
+
+    if (aEdges.IsEmpty())
+      myWiresEdges.pop_back();
+  }
+}
+
+//=======================================================================
+//function : ReCompute
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireChecker::ReCompute(BRepMesh_ClassifierPtr& theClassifier)
+{
+  if (theClassifier.IsNull())
+    return;
+
+  theClassifier->Destroy();
+  myStatus = BRepMesh_NoError;
+  
+  SeqOfDWires aDWires;
+  if (!collectDiscretizedWires(aDWires))
+    return;
+
+  const Standard_Integer aNbWires = aDWires.size();
+
+  std::vector<SegmentsTree> aWiresBiPoints(aNbWires);
+  fillSegmentsTree(aDWires, aWiresBiPoints);
+
+#ifdef HAVE_TBB
+  Standard_Mutex aWireMutex;
+  BRepMesh_WireInterferenceChecker aIntChecker(aWiresBiPoints, 
+    &myStatus, &aWireMutex);
+
+  if (myIsInParallel && aNbWires > 1)
+  {
+    // check wires in parallel threads using TBB
+    tbb::parallel_for(tbb::blocked_range<Standard_Integer>(0, aNbWires), 
+      aIntChecker);
+  }
+  else
+  {
+#else
+    BRepMesh_WireInterferenceChecker aIntChecker(aWiresBiPoints, &myStatus);
+#endif
+    for (Standard_Integer i = 0; i < aNbWires; ++i)
+      aIntChecker(i);
+#ifdef HAVE_TBB
+  }
+#endif
+
+  if (myStatus == BRepMesh_SelfIntersectingWire)
+    return;
+
+  // Find holes
+  SeqOfDWires::iterator aDWiresIt = aDWires.begin();
+  for (; aDWiresIt != aDWires.end(); ++aDWiresIt)
+  {
+    const SeqOfPnt2d& aDWire = *aDWiresIt;
+    theClassifier->RegisterWire(aDWire, myTolUV, myUmin, myUmax, myVmin, myVmax);
+  }
+}
+
+//=======================================================================
+//function : collectDiscretizedWires
+//purpose  : 
+//=======================================================================
+Standard_Boolean BRepMesh_WireChecker::collectDiscretizedWires(
+  SeqOfDWires& theDWires)
+{
+  // TODO: Collect disretized wires in parallel
+  SeqOfWireEdges::iterator aWireIt = myWiresEdges.begin();
+  for(; aWireIt != myWiresEdges.end(); ++aWireIt)
+  {
+    const ListOfEdges& aEdges = *aWireIt;
+    // For each wire we create a data map, linking vertices (only
+    // the ends of edges) with their positions in the sequence of
+    // all 2d points from this wire.
+    // When we meet some vertex for the second time - the piece
+    // of sequence is treated for a HOLE and quits the sequence.
+    // Actually, we must unbind the vertices belonging to the
+    // loop from the map, but since they can't appear twice on the
+    // valid wire, leave them for a little speed up.
+
+    SeqOfPnt2d    aSeqPnt2d;
+    DataMapIntInt aNodeInSeq;
+    Standard_Integer aFirstIndex = 0, aLastIndex = 0;
+
+    // Start traversing the wire
+    ListOfEdges::Iterator aEdgeIt(aEdges);
+    for (; aEdgeIt.More(); aEdgeIt.Next())
+    {
+      const TopoDS_Edge& aEdge   = aEdgeIt.Value();
+      TopAbs_Orientation aOrient = aEdge.Orientation();
+      if (!myEdges.IsBound(aEdge))
+        continue;
+
+      // Retrieve polygon
+      // Define the direction for adding points to aSeqPnt2d
+      Standard_Integer aStartId, aEndId, aIncrement;
+      const BRepMesh_PairOfPolygon& aPair = myEdges.Find(aEdge);
+      Handle(Poly_PolygonOnTriangulation) aNOD;
+      if (aOrient == TopAbs_FORWARD)
+      {
+        aNOD       = aPair.First();
+        aStartId   = 1;
+        aEndId     = aNOD->NbNodes();
+        aIncrement = 1;
+      }
+      else
+      {
+        aNOD       = aPair.Last();
+        aStartId   = aNOD->NbNodes();
+        aEndId     = 1;
+        aIncrement = -1;
+      }
+
+      const TColStd_Array1OfInteger& aIndices = aNOD->Nodes();
+      const Standard_Integer aFirstVertexId = myVertexMap.FindKey(aIndices(aStartId));
+      const Standard_Integer aLastVertexId  = myVertexMap.FindKey(aIndices(aEndId)  );
+
+      if (aFirstVertexId == aLastVertexId && (aEndId - aStartId) == aIncrement)
+      {
+        // case of continuous set of degenerated edges
+        aLastIndex = aLastVertexId;
+        continue;
+      }
+
+      if (aFirstIndex != 0)
+      {
+        if (aFirstVertexId != aLastIndex)
+        {
+          // there's a gap between edges
+          myStatus = BRepMesh_OpenWire;
+          return Standard_False;
+        }
+      }
+      else
+        aFirstIndex = aFirstVertexId;
+
+      aLastIndex = aLastVertexId;
+
+      // Record first vertex (to detect loops)
+      aNodeInSeq.Bind(aFirstVertexId, (aSeqPnt2d.Length() + 1));
+
+      // Add vertices in sequence
+      for (Standard_Integer i = aStartId; i != aEndId; i += aIncrement)
+      {
+        Standard_Integer aIndex = ((i == aStartId) ? 
+          aFirstVertexId : 
+          myVertexMap.FindKey(aIndices(i)));
+
+        aSeqPnt2d.Append(gp_Pnt2d(myStructure->GetNode(aIndex).Coord()));
+      }
+
+      // Now, is there a loop?
+      if (aNodeInSeq.IsBound(aLastVertexId))
+      {
+        // Yes, treat it separately as a hole
+        // Divide points into main wire and a loop
+        const Standard_Integer aIdxWireStart = aNodeInSeq(aLastVertexId);
+        if(aIdxWireStart < aSeqPnt2d.Length())
+        {
+          theDWires.push_back(SeqOfPnt2d());
+          SeqOfPnt2d& aWire = theDWires.back();
+          aSeqPnt2d.Split(aIdxWireStart, aWire);
+        }
+      }
+    }
+
+    if (aFirstIndex == 0)
+      continue;
+
+    // Isn't wire open?
+    if (aFirstIndex != aLastIndex || aSeqPnt2d.Length() > 1)
+    {
+      myStatus = BRepMesh_OpenWire;
+      return Standard_False;
+    }
+  }
+
+  return Standard_True;
+}
+
+//=======================================================================
+//function : fillSegmentsTree
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireChecker::fillSegmentsTree(
+  const SeqOfDWires&         theDWires, 
+  std::vector<SegmentsTree>& theWiresSegmentsTree)
+{
+  const Standard_Integer aNbWires = theDWires.size();
+  for (Standard_Integer aWireIt = 0; aWireIt < aNbWires; ++aWireIt)
+  {
+    const SeqOfPnt2d&      aWire    = theDWires[aWireIt];
+    const Standard_Integer aWireLen = aWire.Size();
+
+    HArrayOfSegments   aWireSegments = new ArrayOfSegments(aWireLen);
+    HBndBox2dTree      aBndBoxTree   = new BndBox2dTree;
+    BndBox2dTreeFiller aBndBoxTreeFiller(*aBndBoxTree);
+
+    Standard_Real x1 = 0., y1 = 0., aXstart = 0., aYstart = 0.;
+    for (Standard_Integer aPntIt = 0; aPntIt <= aWireLen; ++aPntIt)
+    {
+      Standard_Real x2, y2;
+      // Obtain last point of the segment
+      if (aPntIt == aWireLen)
+      {
+        x2 = aXstart;
+        y2 = aYstart;
+      }
+      else
+      {
+        const gp_Pnt2d& aPnt = aWire(aPntIt + 1);
+        x2 = aPnt.X();
+        y2 = aPnt.Y();
+      }
+
+      // Build segment (bi-point)
+      if (aPntIt == 0)
+      {
+        aXstart = x2;
+        aYstart = y2;
+      }
+      else
+      {
+        gp_Pnt2d aStartPnt(x1, y1);
+        gp_Pnt2d   aEndPnt(x2, y2);
+       
+        const Standard_Integer aPointId = aPntIt - 1;
+        Segment& aSegment = aWireSegments->at(aPointId);
+        aSegment.StartPnt = aStartPnt.XY();
+        aSegment.EndPnt   = aEndPnt.XY();
+
+        Bnd_Box2d aBox;
+        aBox.Add(aStartPnt);
+        aBox.Add(  aEndPnt);
+        aBndBoxTreeFiller.Add(aPointId, aBox);
+      }
+      x1 = x2;
+      y1 = y2;
+    }
+    aBndBoxTreeFiller.Fill();
+
+    SegmentsTree& aSegmentsTree = theWiresSegmentsTree[aWireIt];
+    aSegmentsTree.first  = aWireSegments;
+    aSegmentsTree.second = aBndBoxTree;
+  }
+}
diff --git a/src/BRepMesh/BRepMesh_WireChecker.hxx b/src/BRepMesh/BRepMesh_WireChecker.hxx
new file mode 100644 (file)
index 0000000..57c4b8f
--- /dev/null
@@ -0,0 +1,167 @@
+// Created on: 2014-06-03
+// Created by: Oleg AGASHIN
+// Copyright (c) 1997-1999 Matra Datavision
+// Copyright (c) 1999-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepMesh_WireChecker_HeaderFile
+#define _BRepMesh_WireChecker_HeaderFile
+
+#include <Standard.hxx>
+#include <TopoDS_Face.hxx>
+#include <BRepMesh_Status.hxx>
+#include <Handle_BRepMesh_DataStructureOfDelaun.hxx>
+#include <BRepMesh_ClassifierPtr.hxx>
+#include <NCollection_Sequence.hxx>
+#include <NCollection_List.hxx>
+#include <NCollection_DataMap.hxx>
+#include <NCollection_EBTree.hxx>
+#include <NCollection_UBTreeFiller.hxx>
+#include <NCollection_Handle.hxx>
+#include <NCollection_Array1.hxx>
+#include <TopoDS_Edge.hxx>
+#include <Bnd_Box2d.hxx>
+#include <gp_Pnt2d.hxx>
+#include <gp_XY.hxx>
+
+#include <vector>
+
+class BRepMesh_DataMapOfShapePairOfPolygon;
+class TColStd_IndexedMapOfInteger;
+class BRepMesh_DataStructureOfDelaun;
+
+//! Auxilary class intended to check correctness of discretized face.
+//! In particular, checks boundaries of discretized face for self 
+//! intersections and gaps.
+class BRepMesh_WireChecker
+{
+public:
+
+  //! Structure keeping parameters of segment.
+  struct Segment
+  {
+    gp_XY StartPnt;
+    gp_XY EndPnt;
+  };
+
+  typedef NCollection_EBTree<Standard_Integer, Bnd_Box2d>       BndBox2dTree;
+  typedef NCollection_UBTreeFiller<Standard_Integer, Bnd_Box2d> BndBox2dTreeFiller;
+  typedef NCollection_Array1<Standard_Integer>                  ArrayOfInteger;
+  typedef std::vector<Segment>                                  ArrayOfSegments;
+  typedef NCollection_Handle<ArrayOfSegments>                   HArrayOfSegments;
+  typedef NCollection_Handle<BndBox2dTree>                      HBndBox2dTree;
+  typedef std::pair<HArrayOfSegments, HBndBox2dTree>            SegmentsTree;
+
+  //! Selector.
+  //! Used to identify segments with overlapped bounding boxes.
+  //! Note that instance of selector can be used only once due to
+  //! unextentable array of indices.
+  class BndBox2dTreeSelector : public BndBox2dTree::Selector
+  {
+    public:
+      Standard_EXPORT BndBox2dTreeSelector(const Standard_Integer theReservedSize);
+      Standard_EXPORT virtual Standard_Boolean Reject(const Bnd_Box2d& theBox2D) const;
+      Standard_EXPORT virtual Standard_Boolean Accept(const Standard_Integer& theIndex);
+      
+      Standard_EXPORT void Clear();
+      Standard_EXPORT void SetBox(const Bnd_Box2d& theBox2D);
+      Standard_EXPORT void SetSkippedIndex(const Standard_Integer theIndex);
+      Standard_EXPORT const ArrayOfInteger& Indices() const;
+      Standard_EXPORT Standard_Integer IndicesNb() const;
+
+    protected:
+      Bnd_Box2d        myBox2D;
+      Standard_Integer mySkippedIndex;
+      ArrayOfInteger   myIndices;
+      Standard_Integer myIndicesNb;
+  };
+
+private:
+
+  typedef NCollection_List<TopoDS_Edge>                           ListOfEdges;
+  typedef std::vector<ListOfEdges>                                SeqOfWireEdges;
+  typedef NCollection_Sequence<gp_Pnt2d>                          SeqOfPnt2d;
+  typedef std::vector<SeqOfPnt2d>                                 SeqOfDWires;
+  typedef NCollection_DataMap<Standard_Integer, Standard_Integer> DataMapIntInt;
+  typedef std::pair<Standard_Integer, gp_XY>                      PairIntPnt;
+
+public:
+
+  //! Constructor.
+  //! \param theFace Face to be checked.
+  //! \param theTolUV Tolerance to be used for calculations in parametric space.
+  //! \param theEdges Map of edges with associated polygon on triangulation.
+  //! \param theVertexMap Map of face vertices.
+  //! \param theStructure Discretized representation of face in parametric space.
+  //! \param theUmin Lower U boundary of the face in parametric space.
+  //! \param theUmax Upper U boundary of the face in parametric space.
+  //! \param theVmin Lower V boundary of the face in parametric space.
+  //! \param theVmax Upper V boundary of the face in parametric space.
+  Standard_EXPORT BRepMesh_WireChecker(
+    const TopoDS_Face&                            theFace,
+    const Standard_Real                           theTolUV,
+    const BRepMesh_DataMapOfShapePairOfPolygon&   theEdges,
+    const TColStd_IndexedMapOfInteger&            theVertexMap,
+    const Handle(BRepMesh_DataStructureOfDelaun)& theStructure,
+    const Standard_Real                           theUmin,
+    const Standard_Real                           theUmax,
+    const Standard_Real                           theVmin,
+    const Standard_Real                           theVmax,
+    const Standard_Boolean                        isInParallel);
+
+  //! Recompute data using parameters passed in constructor.
+  //! \param[out] theClassifier Classifier to be updated using calculated data.
+  Standard_EXPORT void ReCompute(BRepMesh_ClassifierPtr& theClassifier);
+
+  //! Returns status of the check.
+  inline BRepMesh_Status Status() const
+  {
+    return myStatus;
+  }
+
+private:
+
+  //! Collects disñrete wires.
+  //! \param[out] theDWires sequence of discretized wires to be filled.
+  //! \return TRUE on success, FALSE in case of open wire.
+  Standard_Boolean collectDiscretizedWires(SeqOfDWires& theDWires);
+
+  //! Fills array of BiPoints for corresponding wire.
+  //! \param theDWires Sequence of wires to be processed.
+  //! \param theWiresSegmentsTree Array of segments with corresponding 
+  //! bounding boxes trees to be filled.
+  void fillSegmentsTree(
+    const SeqOfDWires&         theDWires, 
+    std::vector<SegmentsTree>& theWiresSegmentsTree);
+
+  //! Assignment operator.
+  void operator =(BRepMesh_WireChecker& /*theOther*/)
+  {
+  }
+
+private:
+
+  const Standard_Real                           myTolUV;
+  const BRepMesh_DataMapOfShapePairOfPolygon&   myEdges;
+  const TColStd_IndexedMapOfInteger&            myVertexMap;
+  const Handle(BRepMesh_DataStructureOfDelaun)& myStructure;
+  const Standard_Real                           myUmin;
+  const Standard_Real                           myUmax;
+  const Standard_Real                           myVmin;
+  const Standard_Real                           myVmax;
+  BRepMesh_Status                               myStatus;
+  SeqOfWireEdges                                myWiresEdges;
+  Standard_Boolean                              myIsInParallel;
+};
+
+#endif
diff --git a/src/BRepMesh/BRepMesh_WireInterferenceChecker.cxx b/src/BRepMesh/BRepMesh_WireInterferenceChecker.cxx
new file mode 100644 (file)
index 0000000..78604a9
--- /dev/null
@@ -0,0 +1,345 @@
+// Created on: 2014-06-18
+// Created by: Oleg AGASHIN
+// Copyright (c) 2011-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#include <BRepMesh_WireInterferenceChecker.hxx>
+#include <Precision.hxx>
+
+// TODO: remove this variable after implementation of LoopChecker2d.
+static const Standard_Real MIN_LOOP_S = 2 * M_PI * 2.E-5;
+
+#ifdef HAVE_TBB
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+BRepMesh_WireInterferenceChecker::BRepMesh_WireInterferenceChecker(
+  const std::vector<BRepMesh_WireChecker::SegmentsTree>& theWires,
+  BRepMesh_Status*                                       theStatus,
+  Standard_Mutex*                                        theMutex)
+  : myWires(&theWires.front()),
+    myWiresNb(theWires.size()),
+    myStatus(theStatus),
+    myMutex(theMutex)
+{
+}
+
+//=======================================================================
+//function : Checker's body
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireInterferenceChecker::operator ()(
+  const tbb::blocked_range<Standard_Integer>& theWireRange) const
+{
+  for (Standard_Integer i = theWireRange.begin(); i != theWireRange.end(); ++i)
+    this->operator ()(i);
+}
+#else
+//=======================================================================
+//function : Constructor
+//purpose  : 
+//=======================================================================
+BRepMesh_WireInterferenceChecker::BRepMesh_WireInterferenceChecker(
+  const std::vector<BRepMesh_WireChecker::SegmentsTree>& theWires,
+  BRepMesh_Status*                                       theStatus)
+  : myWires(&theWires.front()),
+    myWiresNb(theWires.size()),
+    myStatus(theStatus)
+{
+}
+#endif
+
+//=======================================================================
+//function : Checker's body
+//purpose  : 
+//=======================================================================
+void BRepMesh_WireInterferenceChecker::operator ()(
+  const Standard_Integer& theWireId) const
+{
+  if (*myStatus == BRepMesh_SelfIntersectingWire)
+    return;
+
+  const BRepMesh_WireChecker::SegmentsTree&  aWireSegTree1  = myWires[theWireId];
+  const BRepMesh_WireChecker::Segment*       aWireSegments1 = &aWireSegTree1.first->front();
+  const BRepMesh_WireChecker::HBndBox2dTree& aWireBoxTree1  = aWireSegTree1.second;
+  const Standard_Integer aWireLen1 = aWireSegTree1.first->size();
+
+  for (Standard_Integer aWireIt = theWireId; aWireIt < myWiresNb; ++aWireIt)
+  {
+#ifdef HAVE_TBB
+    // Break execution in case if flag was raised by another thread
+    if (*myStatus == BRepMesh_SelfIntersectingWire)
+      return;
+#endif
+
+    const Standard_Boolean isSelfIntCheck = (aWireIt == theWireId);
+    const BRepMesh_WireChecker::SegmentsTree& aWireSegTree2 = 
+      isSelfIntCheck ? aWireSegTree1 : myWires[aWireIt];
+
+    const BRepMesh_WireChecker::Segment*       aWireSegments2 = &aWireSegTree2.first->front();
+    const BRepMesh_WireChecker::HBndBox2dTree& aWireBoxTree2  = aWireSegTree2.second;
+
+    BRepMesh_WireChecker::BndBox2dTreeSelector aSelector(aWireSegTree2.first->size());
+    for (Standard_Integer aSegmentId1 = 0; aSegmentId1 < aWireLen1; ++aSegmentId1)
+    {
+#ifdef HAVE_TBB
+      // Break execution in case if flag was raised by another thread
+      if (*myStatus == BRepMesh_SelfIntersectingWire)
+        return;
+#endif
+
+      aSelector.Clear();
+      aSelector.SetBox(aWireBoxTree1->FindNode(aSegmentId1).Bnd());
+      if (isSelfIntCheck)
+        aSelector.SetSkippedIndex(aSegmentId1);
+
+      if (aWireBoxTree2->Select(aSelector) == 0)
+        continue;
+
+      const BRepMesh_WireChecker::Segment& aSegment1 = aWireSegments1[aSegmentId1];
+      const BRepMesh_WireChecker::ArrayOfInteger& aSelected = aSelector.Indices();
+      const Standard_Integer aSelectedNb = aSelector.IndicesNb();
+      for (Standard_Integer aBndIt = 0; aBndIt < aSelectedNb; ++aBndIt)
+      {
+#ifdef HAVE_TBB
+        // Break execution in case if flag was raised by another thread
+        if (*myStatus == BRepMesh_SelfIntersectingWire)
+          return;
+#endif
+
+        const Standard_Integer aSegmentId2 = aSelected(aBndIt);
+        const BRepMesh_WireChecker::Segment& aSegment2 = aWireSegments2[aSegmentId2];
+
+        gp_Pnt2d aIntPnt;
+        BRepMesh_WireInterferenceChecker::IntFlag aIntStatus = Intersect(
+          aSegment1.StartPnt, aSegment1.EndPnt, 
+          aSegment2.StartPnt, aSegment2.EndPnt,
+          Standard_False, Standard_False,
+          aIntPnt);
+
+        if (aIntStatus == Cross)
+        {
+          // TODO: remove this block after implementation of LoopChecker2d.
+          if (isSelfIntCheck)
+          {
+            gp_XY aPrevVec;
+            Standard_Real aSumS = 0.;
+            const gp_XY& aRefPnt  = aIntPnt.Coord();
+            for (Standard_Integer i = aSegmentId1; i < aSegmentId2; ++i)
+            {
+              const BRepMesh_WireChecker::Segment& aSeg = aWireSegments1[i];
+              gp_XY aCurVec = aSeg.EndPnt - aRefPnt;
+
+              if (aCurVec.SquareModulus() < gp::Resolution())
+                continue;
+
+              if (aPrevVec.SquareModulus() > gp::Resolution())
+                aSumS += aPrevVec ^ aCurVec;
+
+              aPrevVec = aCurVec;
+            }
+
+            if (Abs(aSumS / 2.) < MIN_LOOP_S)
+              continue;
+          }
+
+#ifdef HAVE_TBB
+          Standard_Mutex::Sentry aSentry(myMutex);
+#endif
+          *myStatus = BRepMesh_SelfIntersectingWire;
+          return;
+        }
+      }
+    }
+  }
+}
+
+//=============================================================================
+//function : Intersect
+//purpose  : 
+//=============================================================================
+BRepMesh_WireInterferenceChecker::IntFlag 
+  BRepMesh_WireInterferenceChecker::Intersect(
+  const gp_XY&           theStartPnt1,
+  const gp_XY&           theEndPnt1,
+  const gp_XY&           theStartPnt2,
+  const gp_XY&           theEndPnt2,
+  const Standard_Boolean isConsiderEndPointTouch,
+  const Standard_Boolean isConsiderPointOnSegment,
+  gp_Pnt2d&              theIntPnt)
+{
+  Standard_Integer aPointHash[] = {
+    classifyPoint(theStartPnt1, theEndPnt1, theStartPnt2),
+    classifyPoint(theStartPnt1, theEndPnt1, theEndPnt2  ),
+    classifyPoint(theStartPnt2, theEndPnt2, theStartPnt1),
+    classifyPoint(theStartPnt2, theEndPnt2, theEndPnt1  )
+  };
+
+  // Consider case when edges have shared vertex
+  if ( isConsiderEndPointTouch )
+  {
+    if ( aPointHash[0] < 0 || aPointHash[1] < 0 )
+      return BRepMesh_WireInterferenceChecker::EndPointTouch;
+  }
+
+  Standard_Integer aPosHash = 
+    aPointHash[0] + aPointHash[1] + aPointHash[2] + aPointHash[3];
+
+  /*=========================================*/
+  /*  1) hash code == 1:
+
+                    0+
+                    /
+           0      1/         0
+           +======+==========+
+  
+      2) hash code == 2:
+
+           0    1        1   0
+        a) +----+========+---+
+
+           0       1   1     0
+        b) +-------+===+=====+
+
+                                             */
+  /*=========================================*/
+  if ( aPosHash == 1 )
+  {
+    if (isConsiderPointOnSegment)
+    {
+      if (aPointHash[0] == 1)
+        theIntPnt = theStartPnt1;
+      else if (aPointHash[1] == 1)
+        theIntPnt = theEndPnt1;
+      else if (aPointHash[2] == 1)
+        theIntPnt = theStartPnt2;
+      else
+        theIntPnt = theEndPnt2;
+
+      return BRepMesh_WireInterferenceChecker::PointOnSegment;
+    }
+
+    return BRepMesh_WireInterferenceChecker::NoIntersection;
+  }
+  else if ( aPosHash == 2 )
+    return BRepMesh_WireInterferenceChecker::Glued;
+
+  gp_XY aVec1           = theEndPnt1   - theStartPnt1;
+  gp_XY aVec2           = theEndPnt2   - theStartPnt2;
+  gp_XY aVecStartPoints = theStartPnt2 - theStartPnt1;
+    
+  Standard_Real aCrossD1D2 = aVec1           ^ aVec2;
+  Standard_Real aCrossD1D3 = aVecStartPoints ^ aVec2;
+
+  const Standard_Real aPrec = Precision::PConfusion();
+  // Are edgegs codirectional
+  if ( Abs( aCrossD1D2 ) < aPrec )
+  {
+    // Just a parallel case?
+    if( Abs( aCrossD1D3 ) < aPrec )
+    {
+      /*=========================================*/
+      /*  Here the following cases are possible:
+          1) hash code == -4:
+
+               -1                -1
+                +=================+
+               -1                -1
+
+          2) hash code == -2:
+
+                0       -1        0
+                +--------+========+
+                        -1
+
+          3) hash code == -1:
+
+                0        1        -1
+                +--------+========+
+                                  -1
+
+          4) hash code == 0:
+
+                0      0  0       0
+                +------+  +=======+
+                0      0  0       0
+                                                 */
+      /*=========================================*/
+
+      if ( aPosHash < -2 )
+        return BRepMesh_WireInterferenceChecker::Same;
+      else if ( aPosHash == -1 )
+        return BRepMesh_WireInterferenceChecker::Glued;
+
+      return BRepMesh_WireInterferenceChecker::NoIntersection;
+    }
+    else
+      return BRepMesh_WireInterferenceChecker::NoIntersection;
+  }
+
+  Standard_Real aPar = aCrossD1D3 / aCrossD1D2;
+  const Standard_Real aEndPrec = 1 - aPrec;
+
+  // Intersection is out of first segment range
+  if( aPar < aPrec || aPar > aEndPrec )
+    return BRepMesh_WireInterferenceChecker::NoIntersection;
+  Standard_Real aCrossD2D3 = aVecStartPoints.Reversed() ^ aVec1;
+  aPar = aCrossD2D3 / -aCrossD1D2;
+
+  // Intersection is out of second segment range
+  if( aPar < aPrec || aPar > aEndPrec )
+    return BRepMesh_WireInterferenceChecker::NoIntersection;
+  theIntPnt = theStartPnt2 + aPar * aVec2;
+  return BRepMesh_WireInterferenceChecker::Cross;
+}
+
+//=============================================================================
+//function : classifyPoint
+//purpose  : 
+//=============================================================================
+Standard_Integer BRepMesh_WireInterferenceChecker::classifyPoint(
+  const gp_XY& thePoint1,
+  const gp_XY& thePoint2,
+  const gp_XY& thePointToCheck)
+{
+  gp_XY aP1 = thePoint2       - thePoint1;
+  gp_XY aP2 = thePointToCheck - thePoint1;
+  
+  const Standard_Real aPrec   = Precision::PConfusion();
+  const Standard_Real aSqPrec = aPrec * aPrec;
+  Standard_Real aDist = Abs(aP1 ^ aP2);
+  if (aDist > aPrec)
+  {
+    aDist = (aDist * aDist) / aP1.SquareModulus();
+    if (aDist > aSqPrec)
+      return 0; //out
+  }
+    
+  gp_XY aMult = aP1.Multiplied(aP2);
+  if ( aMult.X() < 0.0 || aMult.Y() < 0.0 )
+    return 0; //out
+    
+  if (aP1.SquareModulus() < aP2.SquareModulus())
+    return 0; //out
+    
+  if (thePointToCheck.IsEqual(thePoint1, aPrec) || 
+      thePointToCheck.IsEqual(thePoint2, aPrec))
+  {
+    return -1; //coinsides with an end point
+  }
+    
+  return 1;
+}
diff --git a/src/BRepMesh/BRepMesh_WireInterferenceChecker.hxx b/src/BRepMesh/BRepMesh_WireInterferenceChecker.hxx
new file mode 100644 (file)
index 0000000..430e83c
--- /dev/null
@@ -0,0 +1,114 @@
+// Created on: 2014-06-18
+// Created by: Oleg AGASHIN
+// Copyright (c) 2011-2014 OPEN CASCADE SAS
+//
+// This file is part of Open CASCADE Technology software library.
+//
+// This library is free software; you can redistribute it and/or modify it under
+// the terms of the GNU Lesser General Public License version 2.1 as published
+// by the Free Software Foundation, with special exception defined in the file
+// OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
+// distribution for complete text of the license and disclaimer of any warranty.
+//
+// Alternatively, this file may be used under the terms of Open CASCADE
+// commercial license or contractual agreement.
+
+#ifndef _BRepMesh_WireInterferenceChecker_HeaderFile
+#define _BRepMesh_WireInterferenceChecker_HeaderFile
+
+#include <Standard.hxx>
+#include <Standard_Mutex.hxx>
+#include <BRepMesh_WireChecker.hxx>
+#include <BRepMesh_Status.hxx>
+
+#ifdef HAVE_TBB
+  // paralleling using Intel TBB
+  #include <tbb/blocked_range.h>
+#endif
+
+//! Auxilary class implementing functionality for 
+//! checking interference between two discretized wires.
+class BRepMesh_WireInterferenceChecker
+{
+public:
+
+  //! Enumerates states of segments intersection check.
+  enum IntFlag
+  {
+    NoIntersection,
+    Cross,
+    EndPointTouch,
+    PointOnSegment,
+    Glued,
+    Same
+  };
+
+#ifdef HAVE_TBB
+  //! Constructor
+  //! \param theWires wires that should be checked.
+  //! \param theStatus shared flag to set status of the check.
+  //! \param theMutex shared mutex for parallel processing.
+  BRepMesh_WireInterferenceChecker(
+    const std::vector<BRepMesh_WireChecker::SegmentsTree>& theWires,
+    BRepMesh_Status*                                       theStatus,
+    Standard_Mutex*                                        theMutex);
+
+  //! Checker's body.
+  //! \param theWireRange range of wires to be checked.
+  void operator ()(const tbb::blocked_range<Standard_Integer>& theWireRange) const;
+#else
+  //! Constructor
+  //! \param theWires wires that should be checked.
+  //! \param theStatus shared flag to set status of the check.
+  BRepMesh_WireInterferenceChecker(
+    const std::vector<BRepMesh_WireChecker::SegmentsTree>& theWires,
+    BRepMesh_Status*                                       theStatus);
+#endif
+
+  //! Checker's body.
+  //! \param theWireId Id of discretized wire to be checked.
+  void operator ()(const Standard_Integer& theWireId) const;
+
+  //! Checks intersection between the two segments.
+  //! \param theStartPnt1 start point of first segment.
+  //! \param theEndPnt1 end point of first segment.
+  //! \param theStartPnt2 start point of second segment.
+  //! \param theEndPnt2 end point of second segment.
+  //! \param isConsiderEndPointTouch if TRUE EndPointTouch status will be
+  //! returned in case if segments are touching by end points, if FALSE
+  //! returns NoIntersection flag.
+  //! \param isConsiderPointOnSegment if TRUE PointOnSegment status will be
+  //! returned in case if end point of one segment lies onto another one, 
+  //! if FALSE returns NoIntersection flag.
+  //! \param[out] theIntPnt point of intersection.
+  //! \return status of intersection check.
+  static IntFlag Intersect(const gp_XY&           theStartPnt1,
+                           const gp_XY&           theEndPnt1,
+                           const gp_XY&           theStartPnt2,
+                           const gp_XY&           theEndPnt2,
+                           const Standard_Boolean isConsiderEndPointTouch,
+                           const Standard_Boolean isConsiderPointOnSegment,
+                           gp_Pnt2d&              theIntPnt);
+
+private:
+
+  //! Classifies the point in case of coincidence of two vectors.
+  //! \param thePoint1 the start point of a segment (base point).
+  //! \param thePoint2 the end point of a segment.
+  //! \param thePointToCheck the point to classify.
+  //! \return zero value if point is out of segment and non zero value 
+  //! if point is between the first and the second point of segment.
+  static Standard_Integer classifyPoint (const gp_XY& thePoint1,
+                                         const gp_XY& thePoint2,
+                                         const gp_XY& thePointToCheck);
+private:
+  const BRepMesh_WireChecker::SegmentsTree* myWires;
+  Standard_Integer                          myWiresNb;
+  BRepMesh_Status*                          myStatus;
+
+#ifdef HAVE_TBB
+  Standard_Mutex*                           myMutex;
+#endif
+};
+
+#endif
index 9d80a5d..43aeb48 100755 (executable)
@@ -2,7 +2,13 @@ BRepMesh_PluginEntryType.hxx
 BRepMesh_PluginMacro.hxx
 BRepMesh_Triangle.hxx
 BRepMesh_Triangle.cxx
+BRepMesh_Classifier.hxx
+BRepMesh_Classifier.cxx
 BRepMesh_ClassifierPtr.hxx
+BRepMesh_WireInterferenceChecker.hxx
+BRepMesh_WireInterferenceChecker.cxx
+BRepMesh_WireChecker.hxx
+BRepMesh_WireChecker.cxx
 BRepMesh_CellFilter.hxx
 BRepMesh_Delaun.hxx
 BRepMesh_Delaun.cxx
index f10a7c1..3f224d8 100644 (file)
@@ -117,7 +117,7 @@ Standard_Boolean NCollection_EBTree<TheObjType,TheBndType>::Add
     UBTree::Add (theObj, theBnd);
 
     // Update the map
-    TreeNode& aNewNode = ChangeLastNode();
+    TreeNode& aNewNode = this->ChangeLastNode();
     myObjNodeMap.Bind (theObj, &aNewNode);
     // If the new node is not the root (has a parent) check the neighbour node
     if (!aNewNode.IsRoot()) {
diff --git a/tests/bugs/mesh/bug24968_1 b/tests/bugs/mesh/bug24968_1
new file mode 100644 (file)
index 0000000..4e1ad86
--- /dev/null
@@ -0,0 +1,45 @@
+puts "=========="
+puts "OCC24968"
+puts "=========="
+puts ""
+#####################################
+# Impove BRepMesh_Classifier to cope with intersection of huge number of wires
+#####################################
+
+restore [locate_data_file bug24968_Shape_1.brep] result
+
+tclean result
+dchrono h reset
+dchrono h start
+incmesh result 0.1 0
+dchrono h stop
+
+set info [dchrono h show]
+regexp {CPU user time: ([-0-9.+eE]+) seconds} ${info} full cpu_time
+
+if { [regexp {Debug mode} [dversion]] } {
+  if { [regexp {Windows} [dversion]] } {
+    set max_time 100
+  } else {
+    set max_time 250
+  }
+} else {
+  if { [regexp {Windows} [dversion]] } {
+    set max_time 100
+  } else {
+    set max_time 250
+  }
+}
+
+if { ${cpu_time} > ${max_time} } {
+    puts "Error : meshing is slow"
+} else {
+    puts "OK: meshing is quite fast"
+}
+
+vinit
+vdisplay result
+vfit
+vsetdispmode 1
+
+set only_screen 1
diff --git a/tests/bugs/mesh/bug24968_2 b/tests/bugs/mesh/bug24968_2
new file mode 100644 (file)
index 0000000..4a21d20
--- /dev/null
@@ -0,0 +1,45 @@
+puts "=========="
+puts "OCC24968"
+puts "=========="
+puts ""
+#####################################
+# Impove BRepMesh_Classifier to cope with intersection of huge number of wires
+#####################################
+
+restore [locate_data_file bug24968_Shape_1.brep] result
+
+tclean result
+dchrono h reset
+dchrono h start
+incmesh result 0.1 1
+dchrono h stop
+
+set info [dchrono h show]
+regexp {CPU user time: ([-0-9.+eE]+) seconds} ${info} full cpu_time
+
+if { [regexp {Debug mode} [dversion]] } {
+  if { [regexp {Windows} [dversion]] } {
+    set max_time 100
+  } else {
+    set max_time 250
+  }
+} else {
+  if { [regexp {Windows} [dversion]] } {
+    set max_time 100
+  } else {
+    set max_time 250
+  }
+}
+
+if { ${cpu_time} > ${max_time} } {
+    puts "Error : meshing is slow"
+} else {
+    puts "OK: meshing is quite fast"
+}
+
+vinit
+vdisplay result
+vfit
+vsetdispmode 1
+
+set only_screen 1
diff --git a/tests/bugs/mesh/data/bug22778_square.brep b/tests/bugs/mesh/data/bug22778_square.brep
deleted file mode 100644 (file)
index 0232809..0000000
+++ /dev/null
@@ -1,2376 +0,0 @@
-DBRep_DrawableShape
-
-CASCADE Topology V1, (c) Matra-Datavision
-Locations 0
-Curve2ds 120
-7 0 0  4 5 2  1.81577498991914 -0.23794112483270391  1.8118534212982407 -0.23816569484964639  1.8079216001928708 -0.23838612248773772  1.8039797879920916 -0.23860233090074806  1.8000282600745126 -0.23881424610428864 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.8000282600687112 -0.23881424610925572  1.7960767321525317 -0.23902616131285664  1.7921154884808783 -0.23923378334010198  1.7881448044420656 -0.23943703820702089  1.7841649689498851 -0.23963585518914268 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7841649689429651 -0.23963585519403721  1.780185133452181 -0.23983467217628002  1.7761961464618938 -0.24002905130635538  1.772198296895579 -0.24021892186063198  1.7681918866485169 -0.24040421676683632 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7681918866404869 -0.24040421677160909  1.7641854763948035 -0.24058951167799669  1.7601705054148389 -0.24077023096813133  1.7561472756054308 -0.2409463075710101  1.7521161012006774 -0.24111767844911861 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7521161011915596 -0.24111767845371976  1.7480849267881486 -0.24128904933207437  1.7440458077286061 -0.24145571451633255  1.7399990582563363 -0.24161761097068596  1.7359450042143509 -0.241774680061209 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7359450042041802 -0.24177468006558855  1.7318909501634829 -0.24193174915641999  1.7278295914852684 -0.24208399091261776  1.7237612540214808 -0.24223134670239493  1.7196862744097368 -0.24237376264650845 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  1.719686274398563 -0.242373762650617  1.7156112947880382 -0.2425161785950995  1.7115296729550631 -0.24265365472130923  1.7074417455457069 -0.24278613715256242  1.7033478590974016 -0.24291357709370032 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7033478590852866 -0.24291357709749056  1.6992539726381148 -0.2430410170390557  1.6951541270712269 -0.24316341451577381  1.6910486689299178 -0.24328072073544854  1.6869379536811711 -0.24339289229090119 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6869379536681901 -0.24339289229432795  1.6828272384204765 -0.24350506385026205  1.6787112659787879 -0.2436121007648199  1.6745903918172682 -0.24371395963416065  1.6704649792927553 -0.24381060271386032 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6704649792789965 -0.24381060271688201  1.6663395667553975 -0.24390724579711259  1.6622096157770814 -0.24399867310784651  1.6580754897072276 -0.24408484690834098  1.6539375586904002 -0.24416573535923247 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6539375586759619 -0.2441657353618116  1.6497996276599192 -0.24424662381327827  1.6456578916006481 -0.24432222693233607  1.6415127206481526 -0.24439251288360941  1.6373644905780964 -0.24445745593963256 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.637364490563088 -0.24445745594173676  1.6332162604936735 -0.24452239899837239  1.6290649712066447 -0.24458199917378598  1.6249109984821148 -0.24463623074475932  1.6207547225244721 -0.24468507426448502 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  1.6207547225090106 -0.24468507426608746  1.6165984465518586 -0.24473391778645551  1.6124398672585123 -0.24477737326625917  1.6082793648367626 -0.24481542126314509  1.6041173226809726 -0.24484804873949195 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6041173226651826 -0.24484804874057189  1.5999552805097248 -0.24488067621758253  1.5957916985149641 -0.24490788318125464  1.5916269600775679 -0.24492965659856963  1.5874614505167985 -0.24494598992772743 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5874614505008091 -0.24494598992827096  1.5832959409402068 -0.24496232325810585  1.5791296601496394 -0.24497321650340687  1.57496299344952 -0.24497866312706879  1.5707963268029244 -0.24497866312672784 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5707963267868685 -0.24497866312672781  1.5666296601402723 -0.24497866312706865  1.562462993440155 -0.24497321650340687  1.5582967126495861 -0.24496232325810591  1.554131203088984 -0.24494598992827096 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5541312030729943 -0.24494598992772743  1.549965693512225 -0.24492965659856955  1.5458009550748295 -0.24490788318125456  1.5416373730800674 -0.24488067621758275  1.5374753309246103 -0.24484804874057189 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5374753309088207 -0.24484804873949192  1.5333132887530312 -0.24481542126314496  1.5291527863312806 -0.24477737326625934  1.5249942070379354 -0.24473391778645537  1.5208379310807827 -0.24468507426608743 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5208379310653213 -0.24468507426448505  1.5166816551076774 -0.24463623074475904  1.5125276823831499 -0.24458199917378645  1.5083763930961192 -0.24452239899837225  1.5042281630267054 -0.24445745594173682 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5042281630116969 -0.24445745593963261  1.5000799329416414 -0.24439251288360936  1.4959347619891448 -0.24432222693233616  1.4917930259298742 -0.24424662381327839  1.4876550949138312 -0.24416573536181169 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.487655094899393 -0.24416573535923244  1.4835171638825659 -0.2440848469083409  1.479383037812712 -0.24399867310784651  1.4752530868343956 -0.24390724579711276  1.4711276743107971 -0.24381060271688204 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4711276742970378 -0.24381060271386029  1.4670022617725245 -0.24371395963416076  1.4628813876110061 -0.24361210076481957  1.458765415169317 -0.24350506385026227  1.4546546999216028 -0.24339289229432795 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4546546999086221 -0.24339289229090122  1.4505439846598769 -0.24328072073544846  1.4464385265185651 -0.24316341451577395  1.4423386809516785 -0.24304101703905573  1.4382447945045067 -0.24291357709749059 
- 0 5 0.033333333333333437 5
-7 0 0  4 5 2  1.4382447944923915 -0.24291357709370037  1.4341509080440857 -0.24278613715256236  1.4300629806347314 -0.24265365472130945  1.4259813588017538 -0.2425161785950995  1.4219063791912301 -0.24237376265061705 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4219063791800564 -0.24237376264650842  1.4178313995683129 -0.24223134670239488  1.4137630621045243 -0.2420839909126179  1.40970170342631 -0.24193174915641991  1.4056476493856129 -0.24177468006558853 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4056476493754422 -0.24177468006120903  1.4015935953334566 -0.24161761097068585  1.3975468458611875 -0.24145571451633271  1.3935077268016449 -0.24128904933207429  1.3894765523982335 -0.24111767845371973 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3894765523891155 -0.24111767844911863  1.3854453779843616 -0.24094630757101004  1.3814221481749545 -0.2407702309681313  1.3774071771949901 -0.2405895116779968  1.3734007669493065 -0.24040421677160911 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3734007669412764 -0.24040421676683629  1.3693943566942153 -0.24021892186063176  1.3653965071278991 -0.24002905130635549  1.3614075201376123 -0.23983467217628007  1.3574276846468283 -0.23963585519403718 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.357427684639908 -0.23963585518914271  1.3534478491477273 -0.23943703820702092  1.3494771651089148 -0.23923378334010201  1.3455159214372614 -0.2390261613128567  1.3415643935210821 -0.23881424610925575 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3415643935152808 -0.23881424610428864  1.3376128655977011 -0.23860233090074812  1.3336710533969229 -0.23838612248773772  1.3297392322915524 -0.23816569484964667  1.3258176636706529 -0.23794112483270399 
- 0 5 0.033333333333333326 5
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.23794112483020824  1.3258176636680326 -0.22261479476943236 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.22261479476943233  1.3258176636680326 -0.2071813847642745 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.2071813847642745  1.3258176636680326 -0.19164719497541646 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.19164719497541644  1.3258176636680326 -0.17601880249915638 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.17601880249915641  1.3258176636680326 -0.16030304835031667 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333381
-7 0 0  1 2 2  1.3258176636680326 -0.16030304835031667  1.3258176636680326 -0.14450702269845903 
- 0 2 0.033333333333333381 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.14450702269845905  1.3258176636680326 -0.12863804840920093 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.1286380484092009  1.3258176636680326 -0.11270366296281543 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.11270366296281543  1.3258176636680326 -0.096711598842529223 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.096711598842529223  1.3258176636680326 -0.0806697625046148 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.0806697625046148  1.3258176636680326 -0.064586212061125553 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333381
-7 0 0  1 2 2  1.3258176636680326 -0.064586212061125553  1.3258176636680326 -0.048469133823546194 
- 0 2 0.033333333333333381 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.048469133823546194  1.3258176636680326 -0.032326817871364613 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.032326817871364613  1.3258176636680326 -0.016167632823265565 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 -0.016167632823265561  1.3258176636680326 0 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0  1.3258176636680326 0.016167632823265565 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.016167632823265561  1.3258176636680326 0.032326817871364613 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.032326817871364613  1.3258176636680326 0.048469133823546194 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.048469133823546194  1.3258176636680326 0.064586212061125525 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.064586212061125525  1.3258176636680326 0.080669762504614773 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.080669762504614773  1.3258176636680326 0.096711598842529195 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.096711598842529195  1.3258176636680326 0.11270366296281541 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333437
-7 0 0  1 2 2  1.3258176636680326 0.11270366296281541  1.3258176636680326 0.12863804840920093 
- 0 2 0.033333333333333437 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.12863804840920093  1.3258176636680326 0.14450702269845908 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.14450702269845905  1.3258176636680326 0.16030304835031667 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.16030304835031667  1.3258176636680326 0.17601880249915638 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.17601880249915641  1.3258176636680326 0.19164719497541646 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.19164719497541644  1.3258176636680326 0.2071813847642745 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.2071813847642745  1.3258176636680326 0.22261479476943236 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.3258176636680326 0.22261479476943233  1.3258176636680326 0.23794112483020827 
- 0 2 0.033333333333333326 2
-7 0 0  4 5 2  1.3258176636706533 0.23794112483270391  1.329739232291552 0.23816569484964639  1.3336710533969238 0.23838612248773772  1.3376128655977015 0.23860233090074806  1.3415643935152808 0.23881424610428864 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3415643935210824 0.23881424610925572  1.345515921437261 0.23902616131285664  1.3494771651089155 0.23923378334010198  1.3534478491477273 0.23943703820702089  1.3574276846399083 0.23963585518914268 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3574276846468283 0.23963585519403721  1.3614075201376128 0.23983467217628002  1.3653965071278982 0.24002905130635538  1.3693943566942162 0.24021892186063198  1.3734007669412764 0.24040421676683632 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3734007669493065 0.24040421677160906  1.3774071771949898 0.24058951167799683  1.3814221481749545 0.2407702309681311  1.3854453779843627 0.2409463075710101  1.3894765523891159 0.24111767844911858 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.3894765523982338 0.24111767845371976  1.3935077268016443 0.24128904933207437  1.3975468458611886 0.24145571451633255  1.4015935953334568 0.24161761097068596  1.4056476493754424 0.241774680061209 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4056476493856132 0.24177468006558855  1.4097017034263091 0.24193174915641999  1.4137630621045258 0.24208399091261776  1.4178313995683123 0.24223134670239493  1.4219063791800566 0.24237376264650845 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  1.4219063791912303 0.242373762650617  1.4259813588017545 0.2425161785950995  1.4300629806347303 0.24265365472130923  1.4341509080440868 0.24278613715256242  1.4382447944923917 0.24291357709370032 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4382447945045069 0.24291357709749056  1.4423386809516785 0.2430410170390557  1.446438526518566 0.24316341451577381  1.4505439846598767 0.24328072073544854  1.4546546999086223 0.24339289229090119 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.454654699921603 0.24339289229432795  1.4587654151693166 0.24350506385026205  1.4628813876110058 0.2436121007648199  1.4670022617725247 0.24371395963416065  1.4711276742970378 0.24381060271386032 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4711276743107971 0.24381060271688201  1.4752530868343947 0.24390724579711259  1.4793830378127131 0.24399867310784651  1.483517163882565 0.24408484690834098  1.487655094899393 0.24416573535923247 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.4876550949138312 0.2441657353618116  1.4917930259298748 0.24424662381327827  1.4959347619891437 0.24432222693233607  1.5000799329416421 0.24439251288360941  1.5042281630116969 0.24445745593963256 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5042281630267056 0.24445745594173676  1.5083763930961192 0.24452239899837239  1.5125276823831504 0.24458199917378598  1.5166816551076781 0.24463623074475932  1.5208379310653215 0.24468507426448502 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  1.5208379310807825 0.24468507426608746  1.5249942070379356 0.24473391778645551  1.529152786331279 0.24477737326625917  1.5333132887530316 0.24481542126314509  1.5374753309088205 0.24484804873949195 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5374753309246108 0.24484804874057189  1.5416373730800679 0.24488067621758253  1.5458009550748295 0.24490788318125464  1.5499656935122264 0.24492965659856963  1.5541312030729948 0.24494598992772743 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.554131203088984 0.24494598992827096  1.5582967126495866 0.24496232325810585  1.5624629934401539 0.24497321650340687  1.5666296601402729 0.24497866312706879  1.5707963267868685 0.24497866312672784 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5707963268029246 0.24497866312672784  1.5749629934495208 0.2449786631270687  1.5791296601496381 0.24497321650340689  1.5832959409402076 0.24496232325810602  1.5874614505008093 0.24494598992827099 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.5874614505167988 0.24494598992772743  1.5916269600775685 0.24492965659856955  1.5957916985149634 0.24490788318125456  1.5999552805097255 0.24488067621758275  1.6041173226651828 0.24484804874057189 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6041173226809724 0.24484804873949192  1.6082793648367619 0.24481542126314496  1.6124398672585127 0.24477737326625934  1.6165984465518581 0.24473391778645537  1.6207547225090104 0.24468507426608743 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6207547225244718 0.24468507426448505  1.624910998482116 0.24463623074475904  1.629064971206643 0.24458199917378645  1.6332162604936744 0.24452239899837225  1.6373644905630877 0.24445745594173682 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6373644905780962 0.24445745593963261  1.6415127206481515 0.24439251288360936  1.6456578916006486 0.24432222693233616  1.6497996276599189 0.24424662381327839  1.6539375586759619 0.24416573536181169 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6539375586903999 0.24416573535923244  1.6580754897072278 0.2440848469083409  1.6622096157770803 0.24399867310784651  1.6663395667553982 0.24390724579711276  1.6704649792789963 0.24381060271688204 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6704649792927553 0.24381060271386029  1.6745903918172682 0.24371395963416076  1.6787112659787877 0.24361210076481957  1.6828272384204759 0.24350506385026227  1.6869379536681901 0.24339289229432795 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.6869379536811711 0.24339289229090122  1.6910486689299167 0.24328072073544846  1.6951541270712287 0.24316341451577395  1.6992539726381146 0.24304101703905573  1.7033478590852866 0.24291357709749059 
- 0 5 0.033333333333333437 5
-7 0 0  4 5 2  1.7033478590974018 0.24291357709370037  1.7074417455457072 0.24278613715256236  1.7115296729550626 0.24265365472130945  1.7156112947880395 0.2425161785950995  1.7196862743985633 0.24237376265061705 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.719686274409737 0.24237376264650842  1.7237612540214819 0.24223134670239488  1.7278295914852673 0.2420839909126179  1.7318909501634845 0.24193174915641991  1.7359450042041804 0.24177468006558853 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7359450042143509 0.24177468006120903  1.7399990582563369 0.24161761097068585  1.7440458077286052 0.24145571451633271  1.7480849267881486 0.24128904933207429  1.7521161011915596 0.24111767845371973 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7521161012006774 0.24111767844911866  1.7561472756054295 0.24094630757101004  1.7601705054148402 0.2407702309681313  1.7641854763948031 0.2405895116779968  1.7681918866404869 0.24040421677160911 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7681918866485167 0.24040421676683629  1.7721982968955776 0.24021892186063176  1.7761961464618941 0.24002905130635549  1.7801851334521808 0.23983467217628007  1.7841649689429648 0.23963585519403718 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.7841649689498851 0.23963585518914271  1.7881448044420654 0.23943703820702092  1.792115488480879 0.23923378334010201  1.7960767321525317 0.2390261613128567  1.8000282600687112 0.23881424610925575 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.8000282600745128 0.23881424610428864  1.8039797879920916 0.23860233090074812  1.8079216001928717 0.23838612248773772  1.8118534212982407 0.23816569484964667  1.8157749899191402 0.23794112483270399 
- 0 5 0.033333333333333326 5
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.23794112483020824  1.8157749899217608 0.22261479476943236 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.22261479476943233  1.8157749899217608 0.2071813847642745 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.2071813847642745  1.8157749899217608 0.19164719497541646 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.19164719497541644  1.8157749899217608 0.17601880249915638 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.17601880249915638  1.8157749899217608 0.16030304835031667 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333381
-7 0 0  1 2 2  1.8157749899217608 0.16030304835031667  1.8157749899217608 0.14450702269845903 
- 0 2 0.033333333333333381 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.14450702269845905  1.8157749899217608 0.12863804840920093 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.1286380484092009  1.8157749899217608 0.11270366296281543 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.11270366296281543  1.8157749899217608 0.096711598842529223 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.096711598842529223  1.8157749899217608 0.0806697625046148 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.0806697625046148  1.8157749899217608 0.064586212061125553 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333381
-7 0 0  1 2 2  1.8157749899217608 0.064586212061125553  1.8157749899217608 0.048469133823546194 
- 0 2 0.033333333333333381 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.048469133823546194  1.8157749899217608 0.032326817871364613 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.032326817871364613  1.8157749899217608 0.016167632823265565 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0.016167632823265561  1.8157749899217608 0 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 0  1.8157749899217608 -0.016167632823265565 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.016167632823265561  1.8157749899217608 -0.032326817871364613 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.032326817871364613  1.8157749899217608 -0.048469133823546194 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.048469133823546194  1.8157749899217608 -0.064586212061125525 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.064586212061125525  1.8157749899217608 -0.080669762504614773 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.080669762504614773  1.8157749899217608 -0.096711598842529195 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.096711598842529195  1.8157749899217608 -0.11270366296281541 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333437
-7 0 0  1 2 2  1.8157749899217608 -0.11270366296281541  1.8157749899217608 -0.12863804840920093 
- 0 2 0.033333333333333437 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.12863804840920093  1.8157749899217608 -0.14450702269845908 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.14450702269845905  1.8157749899217608 -0.16030304835031667 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.16030304835031667  1.8157749899217608 -0.17601880249915638 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.17601880249915638  1.8157749899217608 -0.19164719497541646 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.19164719497541644  1.8157749899217608 -0.2071813847642745 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.2071813847642745  1.8157749899217608 -0.22261479476943236 
- 0 2 0.033333333333333326 2
-8 0 0.033333333333333326
-7 0 0  1 2 2  1.8157749899217608 -0.22261479476943233  1.8157749899217608 -0.23794112483020827 
- 0 2 0.033333333333333326 2
-Curves 120
-7 0 0  4 5 2  -0.23570226039199793 0.94280904159144452 -0.23570226039786107  -0.23199213222790052 0.94368201290279008 -0.23592050322569741  -0.22826826282489454 0.94453881814084573 -0.23613470453521168  -0.22453098305911048 0.94537916373249353 -0.23634479093312322  -0.22078064568849953 0.94620276721196817 -0.23655069180299201 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.22078064568050595 0.94620276723062735 -0.23655069180765684  -0.21703030831228917 0.94702637071036033 -0.23675659267759008  -0.21326691328595593 0.94783323220231785 -0.23695830805057946  -0.20949081337605785 0.94862306924252615 -0.23715576731063154  -0.20570238259959264 0.94939561196818578 -0.23734890299204645 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.20570238258968104 0.94939561198654909 -0.23734890299663727  -0.20191395181561683 0.95016815471269078 -0.23754203867817289  -0.19811319010890827 0.95092340324670632 -0.23773085081167639  -0.19430047150320184 0.95166108772913716 -0.23791527193228446  -0.19047619048162659 0.95238095237186715 -0.23809523809296684 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.19047619046980269 0.95238095238975295 -0.23809523809743824  -0.18665190945060692 0.95310081703319449 -0.23827520425829862  -0.18281606593671623 0.95380286195617348 -0.23845071548904337  -0.17896905442775785 0.9544868313755055 -0.23862170784387637  -0.17511128892674621 0.95515248501133576 -0.23878812125283394 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.17511128891303954 0.95515248502855987 -0.23878812125714  -0.17125352341435501 0.95581813866533283 -0.23895453466633323  -0.16738500383223967 0.95646547663343284 -0.23911636915835829  -0.16350614418584389 0.95709425865953923 -0.2392735646648847  -0.15961737690084321 0.95770426135272291 -0.23942606533818073 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.15961737688530808 0.95770426136910158 -0.2394260653422754  -0.15572860960255142 0.9583142640634571 -0.23957856601586427  -0.15182993457762176 0.95890548753407945 -0.23972637188351986  -0.14792178425175465 0.95947770839816449 -0.23986942709954112  -0.14400460822941222 0.96003072146668367 -0.24000768036667092 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  -0.1440046082121276 0.96003072148203583 -0.24000768037050893  -0.14008743219191483 0.9605837345519499 -0.24014593363798742  -0.13616123035999661 0.96111753992864746 -0.24027938498216186  -0.13222645233560185 0.96163193243277112 -0.24040798310819278  -0.12828356351778611 0.96212672630798657 -0.24053168157699661 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.12828356349885583 0.96212672632213792 -0.24053168158053448  -0.1243406746830247 0.96262152019896063 -0.24065538004974016  -0.12038967494757033 0.96309671554121645 -0.24077417888530411  -0.11643102970530898 0.96355212660371614 -0.24088803165092904  -0.11246521863368032 0.96398758819740293 -0.24099689704935073 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.11246521861323211 0.9639875882101886 -0.24099689705254715  -0.10849940754341351 0.96442304980568239 -0.2411057624514206  -0.10452643050790618 0.96483856201759999 -0.2412096405044  -0.10054676719670153 0.96523395966941572 -0.24130848991735393  -0.096560909927639618 0.96560909916450388 -0.24140227479112597 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.096560909905824013 0.9656090991757712 -0.2414022747939428  -0.092575052638370542 0.96598423867284822 -0.24149605966821205  -0.088583001267622613 0.96633912008831657 -0.24158478002207912  -0.084585248122573065 0.9666735998393392 -0.24166839995983497  -0.080582296413767462 0.96698755682522031 -0.24174688920630513 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.080582296390755911 0.96698755683483306 -0.24174688920870824  -0.076579344683331815 0.96730151382286322 -0.24182537845571581  -0.072571194258741117 0.96759494810983226 -0.24189873702745807  -0.068558348337109234 0.96786773860994657 -0.24196693465248664  -0.064541319178025011 0.96811978748926597 -0.24202994687231649 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.064541319154007598 0.96811978749710503 -0.24202994687427626  -0.060524289996056524 0.96837183637870972 -0.24209295909467743  -0.056503077440536974 0.96860314369178291 -0.24215078592294573  -0.052478193754894688 0.96881361161823132 -0.24220340290455783  -0.048450158323386158 0.96900316621955584 -0.24225079155488896 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  -0.048450158298569024 0.96900316622552352 -0.24225079155638091  -0.044422122867926642 0.96919272082924146 -0.24229818020731042  -0.04039093552597052 0.96936136214762114 -0.24234034053690523  -0.036357115662963665 0.96950901625875785 -0.24237725406468941  -0.032321187799272753 0.96963563359822491 -0.2424089083995562 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.032321187773874972 0.96963563360224614 -0.24240890840056153  -0.028285259910769581 0.96976225094418622 -0.24244056273604653  -0.024247223877661605 0.96986783154126421 -0.24246695788531594  -0.02020760419897772 0.96995232584619973 -0.24248808146154999  -0.016166928496027806 0.97001570899119371 -0.24250392724779846 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.016166928470277744 0.97001570899321721 -0.2425039272483043  -0.012126252767623032 0.97007909214073229 -0.24251977303518316  -0.0080845208690352305 0.97012136414179695 -0.24253034103544904  -0.0040422603978710493 0.97014250014609282 -0.24253562503652343  -1.2934013235432751e-11 0.97014250014482439 -0.2425356250362061 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  1.293409129798917e-11 0.97014250014482439 -0.2425356250362061  0.0040422603978712305 0.97014250014609271 -0.24253562503652318  0.0080845208690352305 0.97012136414179717 -0.24253034103544929  0.012126252767622886 0.97007909214073251 -0.24251977303518313  0.016166928470277689 0.97001570899321721 -0.2425039272483043 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.016166928496027758 0.97001570899119371 -0.24250392724779843  0.020207604198977568 0.96995232584619961 -0.24248808146154993  0.024247223877661622 0.96986783154126421 -0.24246695788531603  0.028285259910769772 0.96976225094418611 -0.24244056273604658  0.032321187773875049 0.96963563360224603 -0.24240890840056153 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.032321187799272871 0.96963563359822502 -0.2424089083995562  0.036357115662963763 0.96950901625875774 -0.24237725406468946  0.040390935525970631 0.96936136214762136 -0.24234034053690512  0.044422122867926794 0.96919272082924146 -0.24229818020731048  0.048450158298569149 0.96900316622552363 -0.24225079155638091 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.048450158323386248 0.96900316621955584 -0.24225079155488896  0.05247819375489484 0.96881361161823176 -0.24220340290455772  0.056503077440537001 0.96860314369178191 -0.24215078592294581  0.060524289996056357 0.96837183637871016 -0.24209295909467743  0.064541319154007543 0.96811978749710503 -0.24202994687427626 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.064541319178024956 0.96811978748926575 -0.24202994687231649  0.068558348337109026 0.96786773860994546 -0.24196693465248656  0.072571194258741284 0.96759494810983315 -0.2418987370274582  0.076579344683331885 0.96730151382286245 -0.24182537845571583  0.080582296390755981 0.96698755683483273 -0.24174688920870829 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.080582296413767546 0.96698755682522031 -0.24174688920630508  0.084585248122573259 0.96667359983933898 -0.24166839995983475  0.088583001267622599 0.96633912008831668 -0.24158478002207917  0.092575052638370431 0.96598423867284811 -0.24149605966821203  0.096560909905823958 0.9656090991757712 -0.2414022747939428 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.096560909927639563 0.96560909916450377 -0.24140227479112594  0.10054676719670133 0.96523395966941516 -0.24130848991735362  0.10452643050790621 0.96483856201760032 -0.24120964050440027  0.10849940754341374 0.9644230498056825 -0.24110576245142051  0.11246521861323219 0.96398758821018848 -0.24099689705254712 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.11246521863368041 0.96398758819740282 -0.24099689704935071  0.11643102970530919 0.96355212660371625 -0.24088803165092906  0.12038967494757037 0.96309671554121568 -0.24077417888530392  0.12434067468302451 0.96262152019896097 -0.24065538004974024  0.12828356349885578 0.9621267263221378 -0.24053168158053445 
- 0 5 0.033333333333333437 5
-7 0 0  4 5 2  0.128283563517786 0.96212672630798668 -0.2405316815769967  0.13222645233560185 0.96163193243277123 -0.24040798310819284  0.13616123035999633 0.9611175399286479 -0.24027938498216186  0.14008743219191483 0.9605837345519499 -0.24014593363798747  0.14400460821212752 0.96003072148203594 -0.24000768037050899 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.14400460822941216 0.96003072146668367 -0.24000768036667092  0.1479217842517544 0.95947770839816338 -0.23986942709954087  0.15182993457762187 0.95890548753408134 -0.23972637188352025  0.15572860960255139 0.9583142640634561 -0.23957856601586414  0.159617376885308 0.95770426136910158 -0.2394260653422754 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.15961737690084321 0.95770426135272302 -0.23942606533818075  0.16350614418584383 0.95709425865953945 -0.23927356466488486  0.16738500383223948 0.95646547663343262 -0.23911636915835816  0.17125352341435546 0.95581813866533349 -0.23895453466633337  0.17511128891303965 0.95515248502855998 -0.23878812125714 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.17511128892674629 0.95515248501133565 -0.23878812125283394  0.17896905442775807 0.95448683137550538 -0.23862170784387646  0.18281606593671601 0.95380286195617259 -0.23845071548904306  0.18665190945060689 0.95310081703319471 -0.23827520425829879  0.1904761904698026 0.95238095238975284 -0.23809523809743824 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.19047619048162651 0.95238095237186715 -0.23809523809296679  0.19430047150320165 0.95166108772913682 -0.23791527193228421  0.19811319010890818 0.95092340324670688 -0.23773085081167672  0.20191395181561717 0.95016815471269078 -0.2375420386781727  0.2057023825896811 0.94939561198654909 -0.23734890299663727 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.20570238259959275 0.94939561196818578 -0.23734890299204642  0.20949081337605818 0.94862306924252571 -0.23715576731063143  0.21326691328595571 0.94783323220231763 -0.23695830805057944  0.21703030831228914 0.947026370710361 -0.23675659267759008  0.2207806456805059 0.94620276723062735 -0.23655069180765681 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.22078064568849942 0.94620276721196817 -0.23655069180299201  0.22453098305911018 0.94537916373249242 -0.23634479093312308  0.2282682628248946 0.94453881814084684 -0.23613470453521165  0.23199213222790066 0.94368201290278986 -0.23592050322569752  0.23570226039199796 0.94280904159144452 -0.23570226039786116 
- 0 5 0.033333333333333326 5
-7 0 0  3 4 2  0.23570226036159853 0.94280904144639444 -0.23570226036250502  0.23599430977657521 0.94397723910630105 -0.23073742193351526  0.23627713131847589 0.94510852527390399 -0.22576335563749239  0.23655069177139562 0.94620276708558282 -0.22078064565239955 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23655069177033974 0.94620276708135931 -0.22078064565325228  0.23682616368316009 0.94730465473264058 -0.21576312331137359  0.23709224464215772 0.94836897856863134 -0.21073683608549493  0.2373489029593448 0.94939561183737953 -0.20570238256383352 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23734890295832736 0.94939561183330978 -0.20570238256484663  0.23760723743804801 0.9504289497521925 -0.20063505435152545  0.23785602581059367 0.95142410324237481 -0.19555945285173787  0.23809523805917684 0.95238095223670771 -0.19047619044638175 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23809523805820471 0.95238095223281916 -0.1904761904475531  0.23833590113711439 0.9533436045484579 -0.18536210219564769  0.23856687159237894 0.95426748636951619 -0.18024025985142134  0.23878812121797918 0.95515248487191706 -0.1751112888921984 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23878812121705911 0.95515248486823678 -0.1751112888935244  0.23901060781395611 0.95604243125582467 -0.16995364747547115  0.23922326459593329 0.95689305838373373 -0.16478879753323863  0.23942606530229138 0.95770426120916585 -0.15961737686718275 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23942606530143004 0.9577042612057205 -0.15961737686865779  0.23962990206028997 0.95851960824116023 -0.15441954222628895  0.23982378179878874 0.95929512719515553 -0.14921506957726366  0.24000768032978417 0.96003072131913703 -0.14400460819683536 
- 0 4 0.033333333333333381 4
-7 0 0  3 4 2  0.24000768032898798 0.96003072131595224 -0.14400460819845218  0.24019242834350127 0.96076971337400541 -0.13877008417863843  0.2403671027445381 0.96146841097815272 -0.13352951599780069  0.24053168153915694 0.96212672615662809 -0.12828356348649347 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24053168153843213 0.96212672615372885 -0.12828356348824277  0.24069693893305713 0.96278775573222874 -0.12301598752434852  0.24085201731942846 0.96340806927771427 -0.11774298276324539  0.24099689701060983 0.96398758804243967 -0.1124652186038744 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24099689700996191 0.96398758803984796 -0.11246521860574543  0.24114230134880368 0.96456920539521496 -0.10716835030079026  0.24127743302238003 0.96510973208952033 -0.10186668809268801  0.24140227475154261 0.96560909900617076 -0.096560909899522415 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24140227475097695 0.96560909900390812 -0.096560909901502623  0.24152750524696495 0.96611002098786003 -0.091238618584592326  0.24164238164552126 0.9665695265820855 -0.085912185636121449  0.24174688916594533 0.96698755666378167 -0.080582296387538277 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24174688916546649 0.96698755666186631 -0.080582296389613589  0.24185166866397351 0.96740667465589425 -0.07523854773230175  0.24194602528714199 0.96778410114856839 -0.069891324790708656  0.24202994683125312 0.9681197873250128 -0.064541319153877452 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24202994683086507 0.9681197873234606 -0.064541319156032562  0.24211404354406568 0.96845617417626317 -0.059180160949461776  0.24218766162524902 0.96875064650099652 -0.053816208448587546  0.24225079151320134 0.96900316605280568 -0.048450158301506147 
- 0 4 0.033333333333333381 4
-7 0 0  3 4 2  0.24225079151290738 0.96900316605162984 -0.048450158303724539  0.24231402048379239 0.96925608193516988 -0.043075705510345355  0.24236672838758019 0.96946691355032111 -0.037699148511167117  0.2424089083573297 0.96963563342931913 -0.03232118777983501 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24240890835713233 0.96963563342852965 -0.032321187782099262  0.24245113263512649 0.9698045305405063 -0.026937606987166528  0.24248280696287505 0.96993122785150065 -0.021552619539856252  0.24250392720512387 0.97001570882049581 -0.016166928479193765 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24250392720502476 0.97001570882009935 -0.016166928481485814  0.24252505871855751 0.97010023487423036 -0.010778421879108524  0.24253562510825621 0.97014250043302508 -0.0053892109428145523  0.24253562499317913 0.97014249997271684 1.1506802455318876e-12 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.2425356249931791 0.97014249997271673 -1.1506802455318876e-12  0.2425356251082561 0.97014250043302452 0.0053892109428145523  0.24252505871855762 0.9701002348742308 0.010778421879108522  0.24250392720502473 0.97001570882009924 0.016166928481485821 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24250392720512384 0.9700157088204957 0.016166928479193758  0.24248280696287489 0.9699312278515001 0.021552619539856249  0.24245113263512658 0.96980453054050675 0.026937606987166525  0.2424089083571323 0.96963563342852954 0.032321187782099262 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24240890835732973 0.96963563342931924 0.032321187779834996  0.24236672838758005 0.96946691355032077 0.037699148511167069  0.24231402048379258 0.96925608193517032 0.043075705510345369  0.2422507915129074 0.96900316605162995 0.048450158303724525 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24225079151320134 0.96900316605280568 0.048450158301506133  0.24218766162524899 0.9687506465009964 0.053816208448587519  0.24211404354406579 0.96845617417626351 0.059180160949461748  0.24202994683086507 0.9681197873234606 0.064541319156032534 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24202994683125312 0.9681197873250128 0.064541319153877438  0.24194602528714193 0.96778410114856817 0.069891324790708587  0.24185166866397356 0.96740667465589447 0.075238547732301791  0.24174688916546649 0.96698755666186631 0.080582296389613575 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24174688916594533 0.96698755666378167 0.080582296387538235  0.24164238164552113 0.96656952658208495 0.085912185636121338  0.24152750524696504 0.96611002098786058 0.091238618584592368  0.24140227475097695 0.96560909900390812 0.096560909901502567 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24140227475154263 0.96560909900617087 0.096560909899522374  0.24127743302237992 0.96510973208952022 0.1018666880926879  0.24114230134880377 0.96456920539521529 0.1071683503007903  0.24099689700996194 0.96398758803984808 0.11246521860574539 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24099689701060981 0.96398758804243956 0.11246521860387437  0.2408520173194284 0.96340806927771372 0.11774298276324528  0.24069693893305721 0.96278775573222919 0.12301598752434863  0.2405316815384321 0.96212672615372874 0.1282835634882428 
- 0 4 0.033333333333333437 4
-7 0 0  3 4 2  0.24053168153915697 0.9621267261566282 0.1282835634864935  0.24036710274453799 0.96146841097815217 0.13352951599780064  0.24019242834350141 0.96076971337400607 0.13877008417863851  0.240007680328988 0.96003072131595235 0.14400460819845221 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.24000768032978417 0.96003072131913703 0.14400460819683542  0.23982378179878866 0.95929512719515508 0.1492150695772636  0.23962990206029011 0.95851960824116078 0.15441954222628904  0.23942606530143004 0.9577042612057205 0.15961737686865782 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23942606530229135 0.95770426120916574 0.15961737686718278  0.23922326459593321 0.95689305838373317 0.16478879753323855  0.23901060781395614 0.95604243125582489 0.16995364747547115  0.23878812121705908 0.95515248486823667 0.1751112888935244 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23878812121797915 0.95515248487191695 0.1751112888921984  0.2385668715923788 0.95426748636951553 0.18024025985142123  0.23833590113711448 0.95334360454845801 0.18536210219564775  0.23809523805820468 0.95238095223281904 0.1904761904475531 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23809523805917684 0.95238095223670771 0.19047619044638173  0.23785602581059354 0.95142410324237447 0.19555945285173781  0.23760723743804818 0.95042894975219305 0.20063505435152548  0.23734890295832736 0.94939561183330978 0.20570238256484663 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23734890295934483 0.94939561183737964 0.20570238256383355  0.2370922446421577 0.948368978568631 0.21073683608549493  0.23682616368316017 0.94730465473264114 0.21576312331137373  0.23655069177033977 0.94620276708135942 0.22078064565325237 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  0.23655069177139559 0.94620276708558271 0.22078064565239949  0.23627713131847569 0.94510852527390354 0.22576335563749225  0.23599430977657532 0.94397723910630127 0.23073742193351529  0.2357022603615985 0.94280904144639432 0.23570226036250502 
- 0 4 0.033333333333333326 4
-7 0 0  4 5 2  0.23570226039199782 0.94280904159144452 0.23570226039786107  0.23199213222790033 0.94368201290279008 0.23592050322569741  0.22826826282489454 0.94453881814084573 0.23613470453521168  0.22453098305911026 0.94537916373249353 0.23634479093312322  0.22078064568849942 0.94620276721196817 0.23655069180299201 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.2207806456805059 0.94620276723062735 0.23655069180765684  0.21703030831228912 0.94702637071036033 0.23675659267759008  0.21326691328595573 0.94783323220231785 0.23695830805057946  0.20949081337605824 0.94862306924252615 0.23715576731063154  0.20570238259959275 0.94939561196818578 0.23734890299204645 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.20570238258968115 0.94939561198654909 0.23734890299663727  0.20191395181561736 0.95016815471269078 0.23754203867817289  0.19811319010890802 0.95092340324670632 0.23773085081167639  0.19430047150320182 0.95166108772913716 0.23791527193228446  0.19047619048162656 0.95238095237186715 0.23809523809296684 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.19047619046980258 0.95238095238975295 0.23809523809743821  0.18665190945060695 0.95310081703319449 0.23827520425829857  0.18281606593671601 0.95380286195617348 0.23845071548904329  0.17896905442775779 0.9544868313755055 0.23862170784387632  0.17511128892674616 0.95515248501133576 0.23878812125283391 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.17511128891303959 0.95515248502855987 0.23878812125714  0.17125352341435532 0.95581813866533283 0.23895453466633323  0.16738500383223948 0.95646547663343284 0.23911636915835829  0.16350614418584383 0.95709425865953923 0.2392735646648847  0.15961737690084316 0.95770426135272291 0.23942606533818073 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.159617376885308 0.95770426136910158 0.2394260653422754  0.15572860960255139 0.9583142640634571 0.23957856601586427  0.15182993457762153 0.95890548753407945 0.23972637188351986  0.14792178425175465 0.95947770839816449 0.23986942709954112  0.14400460822941213 0.96003072146668367 0.24000768036667092 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  0.14400460821212752 0.96003072148203583 0.24000768037050893  0.14008743219191483 0.9605837345519499 0.24014593363798742  0.13616123035999633 0.96111753992864746 0.24027938498216186  0.13222645233560185 0.96163193243277112 0.24040798310819278  0.128283563517786 0.96212672630798657 0.24053168157699661 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.12828356349885578 0.96212672632213792 0.24053168158053448  0.12434067468302444 0.96262152019896063 0.24065538004974016  0.1203896749475704 0.96309671554121645 0.24077417888530411  0.11643102970530912 0.96355212660371614 0.24088803165092904  0.11246521863368039 0.96398758819740293 0.24099689704935073 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.11246521861323225 0.9639875882101886 0.24099689705254715  0.10849940754341367 0.96442304980568239 0.2411057624514206  0.10452643050790632 0.96483856201759999 0.2412096405044  0.10054676719670165 0.96523395966941572 0.24130848991735393  0.096560909927639757 0.96560909916450388 0.24140227479112597 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.096560909905823972 0.9656090991757712 0.2414022747939428  0.092575052638370375 0.96598423867284822 0.24149605966821205  0.088583001267622641 0.96633912008831657 0.24158478002207912  0.084585248122573259 0.9666735998393392 0.24166839995983497  0.080582296413767546 0.96698755682522031 0.24174688920630513 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.080582296390755981 0.96698755683483295 0.24174688920870824  0.076579344683331912 0.96730151382286322 0.24182537845571581  0.072571194258741145 0.96759494810983226 0.24189873702745807  0.068558348337109096 0.96786773860994657 0.24196693465248664  0.064541319178024942 0.96811978748926597 0.24202994687231649 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.064541319154007543 0.96811978749710503 0.24202994687427626  0.060524289996056337 0.96837183637870972 0.24209295909467743  0.056503077440537036 0.96860314369178291 0.24215078592294573  0.052478193754894847 0.96881361161823132 0.24220340290455783  0.048450158323386242 0.96900316621955584 0.24225079155488896 
- 0 5 0.033333333333333381 5
-7 0 0  4 5 2  0.048450158298569156 0.96900316622552352 0.24225079155638091  0.044422122867926753 0.96919272082924146 0.24229818020731042  0.040390935525970707 0.96936136214762114 0.24234034053690523  0.036357115662963735 0.96950901625875785 0.24237725406468941  0.032321187799272871 0.96963563359822491 0.2424089083995562 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.032321187773875049 0.96963563360224614 0.24240890840056153  0.028285259910769762 0.96976225094418622 0.24244056273604653  0.024247223877661619 0.96986783154126421 0.24246695788531594  0.020207604198977564 0.96995232584619973 0.24248808146154999  0.016166928496027751 0.97001570899119371 0.24250392724779846 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  0.016166928470277689 0.97001570899321721 0.2425039272483043  0.012126252767622877 0.97007909214073229 0.24251977303518316  0.0080845208690352409 0.97012136414179695 0.24253034103544904  0.0040422603978712262 0.97014250014609282 0.24253562503652343  1.293409129798917e-11 0.97014250014482439 0.2425356250362061 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -1.2934013235432751e-11 0.97014250014482439 0.2425356250362061  -0.0040422603978710475 0.97014250014609271 0.24253562503652318  -0.0080845208690352305 0.97012136414179717 0.24253034103544929  -0.012126252767623035 0.97007909214073251 0.24251977303518313  -0.016166928470277744 0.97001570899321721 0.2425039272483043 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.016166928496027806 0.97001570899119371 0.24250392724779843  -0.020207604198977717 0.96995232584619961 0.24248808146154993  -0.024247223877661608 0.96986783154126421 0.24246695788531603  -0.028285259910769592 0.96976225094418611 0.24244056273604658  -0.032321187773874972 0.96963563360224603 0.24240890840056153 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.03232118779927276 0.96963563359822502 0.2424089083995562  -0.036357115662963659 0.96950901625875774 0.24237725406468946  -0.040390935525970548 0.96936136214762136 0.24234034053690512  -0.044422122867926656 0.96919272082924146 0.24229818020731048  -0.048450158298569031 0.96900316622552363 0.24225079155638091 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.048450158323386124 0.96900316621955584 0.24225079155488896  -0.05247819375489475 0.96881361161823176 0.24220340290455772  -0.056503077440536828 0.96860314369178191 0.24215078592294581  -0.060524289996056274 0.96837183637871016 0.24209295909467743  -0.064541319154007418 0.96811978749710503 0.24202994687427626 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.064541319178024831 0.96811978748926575 0.24202994687231649  -0.068558348337108957 0.96786773860994568 0.24196693465248656  -0.072571194258741034 0.96759494810983271 0.2418987370274582  -0.076579344683331829 0.96730151382286289 0.24182537845571583  -0.08058229639075587 0.96698755683483273 0.24174688920870829 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.08058229641376749 0.96698755682522042 0.24174688920630508  -0.084585248122573078 0.96667359983933931 0.24166839995983475  -0.088583001267622599 0.96633912008831668 0.24158478002207917  -0.092575052638370611 0.96598423867284811 0.24149605966821203  -0.096560909905824027 0.9656090991757712 0.2414022747939428 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.096560909927639618 0.96560909916450377 0.24140227479112594  -0.1005467671967015 0.96523395966941516 0.24130848991735362  -0.10452643050790621 0.96483856201760032 0.24120964050440027  -0.10849940754341351 0.9644230498056825 0.24110576245142051  -0.11246521861323211 0.96398758821018848 0.24099689705254712 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.11246521863368029 0.96398758819740282 0.24099689704935071  -0.11643102970530902 0.96355212660371625 0.24088803165092906  -0.12038967494757025 0.96309671554121568 0.24077417888530392  -0.12434067468302468 0.96262152019896097 0.24065538004974024  -0.12828356349885583 0.9621267263221378 0.24053168158053445 
- 0 5 0.033333333333333437 5
-7 0 0  4 5 2  -0.12828356351778611 0.96212672630798668 0.2405316815769967  -0.1322264523356019 0.96163193243277123 0.24040798310819284  -0.13616123035999655 0.9611175399286479 0.24027938498216186  -0.14008743219191491 0.9605837345519499 0.24014593363798747  -0.1440046082121276 0.96003072148203594 0.24000768037050899 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.14400460822941225 0.96003072146668367 0.24000768036667092  -0.14792178425175467 0.95947770839816338 0.23986942709954087  -0.15182993457762167 0.95890548753408134 0.23972637188352025  -0.15572860960255155 0.9583142640634561 0.23957856601586414  -0.15961737688530808 0.95770426136910158 0.2394260653422754 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.15961737690084321 0.95770426135272302 0.23942606533818075  -0.16350614418584397 0.95709425865953945 0.23927356466488486  -0.1673850038322395 0.95646547663343262 0.23911636915835816  -0.17125352341435518 0.95581813866533349 0.23895453466633337  -0.17511128891303954 0.95515248502855998 0.23878812125714 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.17511128892674618 0.95515248501133565 0.23878812125283397  -0.17896905442775782 0.95448683137550538 0.23862170784387646  -0.18281606593671604 0.95380286195617259 0.23845071548904315  -0.186651909450607 0.95310081703319471 0.23827520425829868  -0.19047619046980266 0.95238095238975284 0.23809523809743824 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.19047619048162662 0.95238095237186715 0.23809523809296679  -0.19430047150320204 0.95166108772913682 0.23791527193228421  -0.19811319010890796 0.95092340324670688 0.23773085081167672  -0.20191395181561708 0.95016815471269078 0.2375420386781727  -0.20570238258968107 0.94939561198654909 0.23734890299663727 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.20570238259959267 0.94939561196818578 0.23734890299204642  -0.20949081337605785 0.94862306924252571 0.23715576731063143  -0.21326691328595596 0.94783323220231763 0.23695830805057944  -0.2170303083122892 0.947026370710361 0.23675659267759008  -0.22078064568050598 0.94620276723062735 0.23655069180765681 
- 0 5 0.033333333333333326 5
-7 0 0  4 5 2  -0.22078064568849953 0.94620276721196817 0.23655069180299201  -0.22453098305911032 0.94537916373249242 0.23634479093312308  -0.22826826282489474 0.94453881814084684 0.23613470453521165  -0.23199213222790049 0.94368201290278986 0.23592050322569752  -0.23570226039199793 0.94280904159144452 0.23570226039786116 
- 0 5 0.033333333333333326 5
-7 0 0  3 4 2  -0.23570226036159864 0.94280904144639444 0.23570226036250502  -0.23599430977657521 0.94397723910630105 0.23073742193351526  -0.23627713131847605 0.94510852527390399 0.22576335563749239  -0.23655069177139573 0.94620276708558282 0.22078064565239955 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23655069177033985 0.94620276708135931 0.22078064565325228  -0.23682616368316015 0.94730465473264058 0.21576312331137359  -0.23709224464215789 0.94836897856863134 0.21073683608549493  -0.23734890295934491 0.94939561183737953 0.20570238256383352 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23734890295832747 0.94939561183330978 0.20570238256484663  -0.23760723743804812 0.9504289497521925 0.20063505435152545  -0.23785602581059384 0.95142410324237481 0.19555945285173787  -0.23809523805917696 0.95238095223670771 0.19047619044638175 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23809523805820482 0.95238095223281916 0.1904761904475531  -0.23833590113711445 0.9533436045484579 0.18536210219564769  -0.2385668715923791 0.95426748636951619 0.18024025985142134  -0.23878812121797929 0.95515248487191706 0.1751112888921984 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23878812121705922 0.95515248486823678 0.17511128889352437  -0.23901060781395625 0.95604243125582467 0.16995364747547115  -0.2392232645959334 0.95689305838373373 0.16478879753323858  -0.23942606530229149 0.95770426120916585 0.15961737686718275 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23942606530143015 0.9577042612057205 0.15961737686865779  -0.2396299020602902 0.95851960824116023 0.15441954222628895  -0.23982378179878883 0.95929512719515553 0.14921506957726366  -0.24000768032978428 0.96003072131913703 0.14400460819683536 
- 0 4 0.033333333333333381 4
-7 0 0  3 4 2  -0.24000768032898809 0.96003072131595224 0.14400460819845218  -0.24019242834350141 0.96076971337400541 0.13877008417863843  -0.24036710274453818 0.96146841097815272 0.13352951599780069  -0.24053168153915705 0.96212672615662809 0.12828356348649347 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24053168153843224 0.96212672615372885 0.12828356348824277  -0.2406969389330573 0.96278775573222874 0.12301598752434852  -0.24085201731942854 0.96340806927771427 0.11774298276324539  -0.24099689701060995 0.96398758804243967 0.1124652186038744 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24099689700996199 0.96398758803984796 0.11246521860574543  -0.24114230134880374 0.96456920539521496 0.10716835030079026  -0.24127743302238008 0.96510973208952033 0.10186668809268801  -0.24140227475154269 0.96560909900617076 0.096560909899522415 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.241402274750977 0.96560909900390812 0.096560909901502623  -0.24152750524696498 0.96611002098786003 0.091238618584592326  -0.24164238164552143 0.9665695265820855 0.085912185636121449  -0.24174688916594544 0.96698755666378167 0.080582296387538277 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24174688916546661 0.96698755666186631 0.080582296389613589  -0.24185166866397356 0.96740667465589425 0.07523854773230175  -0.24194602528714215 0.96778410114856839 0.069891324790708656  -0.24202994683125323 0.9681197873250128 0.064541319153877452 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24202994683086518 0.9681197873234606 0.064541319156032562  -0.24211404354406582 0.96845617417626317 0.059180160949461776  -0.24218766162524916 0.96875064650099652 0.053816208448587546  -0.24225079151320145 0.96900316605280568 0.048450158301506147 
- 0 4 0.033333333333333381 4
-7 0 0  3 4 2  -0.24225079151290749 0.96900316605162984 0.048450158303724539  -0.24231402048379247 0.96925608193516988 0.043075705510345355  -0.24236672838758033 0.96946691355032111 0.037699148511167117  -0.24240890835732981 0.96963563342931913 0.03232118777983501 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24240890835713244 0.96963563342852965 0.032321187782099262  -0.24245113263512663 0.9698045305405063 0.026937606987166528  -0.24248280696287516 0.96993122785150065 0.021552619539856252  -0.24250392720512398 0.97001570882049581 0.016166928479193765 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24250392720502487 0.97001570882009935 0.016166928481485814  -0.24252505871855767 0.97010023487423036 0.010778421879108524  -0.24253562510825627 0.97014250043302508 0.0053892109428145523  -0.24253562499317924 0.97014249997271684 -1.1506802455318876e-12 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24253562499317921 0.97014249997271673 1.1506802455318876e-12  -0.2425356251082561 0.97014250043302452 -0.0053892109428145523  -0.24252505871855773 0.9701002348742308 -0.010778421879108522  -0.24250392720502484 0.97001570882009924 -0.016166928481485821 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24250392720512395 0.9700157088204957 -0.016166928479193758  -0.24248280696287502 0.9699312278515001 -0.021552619539856249  -0.24245113263512671 0.96980453054050675 -0.026937606987166525  -0.24240890835713241 0.96963563342852954 -0.032321187782099262 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24240890835732984 0.96963563342931924 -0.032321187779834996  -0.24236672838758022 0.96946691355032077 -0.037699148511167069  -0.24231402048379266 0.96925608193517032 -0.043075705510345369  -0.24225079151290752 0.96900316605162995 -0.048450158303724525 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24225079151320145 0.96900316605280568 -0.048450158301506133  -0.24218766162524905 0.9687506465009964 -0.053816208448587519  -0.2421140435440659 0.96845617417626351 -0.059180160949461748  -0.24202994683086518 0.9681197873234606 -0.064541319156032534 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24202994683125323 0.9681197873250128 -0.064541319153877438  -0.24194602528714204 0.96778410114856817 -0.069891324790708587  -0.24185166866397362 0.96740667465589447 -0.075238547732301791  -0.24174688916546661 0.96698755666186631 -0.080582296389613575 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24174688916594547 0.96698755666378167 -0.080582296387538235  -0.24164238164552129 0.96656952658208495 -0.085912185636121338  -0.24152750524696515 0.96611002098786058 -0.091238618584592368  -0.24140227475097703 0.96560909900390812 -0.096560909901502567 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24140227475154274 0.96560909900617087 -0.096560909899522374  -0.24127743302238003 0.96510973208952022 -0.1018666880926879  -0.24114230134880399 0.96456920539521529 -0.1071683503007903  -0.24099689700996205 0.96398758803984808 -0.11246521860574539 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24099689701060992 0.96398758804243956 -0.11246521860387437  -0.24085201731942849 0.96340806927771372 -0.11774298276324528  -0.2406969389330573 0.96278775573222919 -0.12301598752434863  -0.24053168153843221 0.96212672615372874 -0.1282835634882428 
- 0 4 0.033333333333333437 4
-7 0 0  3 4 2  -0.24053168153915708 0.9621267261566282 -0.1282835634864935  -0.24036710274453821 0.96146841097815217 -0.13352951599780064  -0.24019242834350149 0.96076971337400607 -0.13877008417863851  -0.24000768032898812 0.96003072131595235 -0.14400460819845221 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.24000768032978428 0.96003072131913703 -0.14400460819683542  -0.23982378179878869 0.95929512719515508 -0.1492150695772636  -0.23962990206029028 0.95851960824116078 -0.15441954222628904  -0.23942606530143015 0.9577042612057205 -0.15961737686865782 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23942606530229146 0.95770426120916574 -0.15961737686718278  -0.23922326459593332 0.95689305838373317 -0.16478879753323855  -0.23901060781395631 0.95604243125582489 -0.16995364747547115  -0.2387881212170592 0.95515248486823667 -0.1751112888935244 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23878812121797927 0.95515248487191695 -0.17511128889219837  -0.23856687159237905 0.95426748636951553 -0.1802402598514212  -0.23833590113711448 0.95334360454845801 -0.1853621021956478  -0.23809523805820479 0.95238095223281904 -0.19047619044755312 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23809523805917696 0.95238095223670771 -0.19047619044638173  -0.23785602581059365 0.95142410324237447 -0.19555945285173781  -0.23760723743804835 0.95042894975219305 -0.20063505435152548  -0.23734890295832747 0.94939561183330978 -0.20570238256484663 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.23734890295934494 0.94939561183737964 -0.20570238256383355  -0.23709224464215775 0.948368978568631 -0.21073683608549493  -0.23682616368316034 0.94730465473264114 -0.21576312331137373  -0.23655069177033988 0.94620276708135942 -0.22078064565325237 
- 0 4 0.033333333333333326 4
-7 0 0  3 4 2  -0.2365506917713957 0.94620276708558271 -0.22078064565239949  -0.23627713131847586 0.94510852527390354 -0.22576335563749225  -0.23599430977657543 0.94397723910630127 -0.23073742193351529  -0.23570226036159861 0.94280904144639432 -0.23570226036250502 
- 0 4 0.033333333333333326 4
-Polygon3D 0
-PolygonOnTriangulations 0
-Surfaces 1
-4 0 0 0 0 0 1 1 0 -0 -0 1 0 1
-Triangulations 0
-
-TShapes 242
-Ve
-1.00076180259827e-07
--0.235702260376798 0.942809041518919 -0.235702260380183
-0 0
-
-0101101
-*
-Ve
-1.0001041420988e-07
--0.220780645684503 0.946202767221298 -0.236550691805324
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  1 0 0 0.0333333333333333
-2  1 1 0 0 0.0333333333333333
-0
-
-0101000
-+242 0 -241 0 *
-Ve
-1.0001068324256e-07
--0.205702382594637 0.949395611977367 -0.237348902994342
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  2 0 0 0.0333333333333333
-2  2 1 0 0 0.0333333333333333
-0
-
-0101000
-+241 0 -239 0 *
-Ve
-1.00010951027826e-07
--0.190476190475715 0.95238095238081 -0.238095238095203
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  3 0 0 0.0333333333333333
-2  3 1 0 0 0.0333333333333333
-0
-
-0101000
-+239 0 -237 0 *
-Ve
-1.00011214778705e-07
--0.175111288919893 0.955152485019948 -0.238788121254987
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  4 0 0 0.0333333333333333
-2  4 1 0 0 0.0333333333333333
-0
-
-0101000
-+237 0 -235 0 *
-Ve
-1.00011471350982e-07
--0.159617376893076 0.957704261360912 -0.239426065340228
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  5 0 0 0.0333333333333333
-2  5 1 0 0 0.0333333333333333
-0
-
-0101000
-+235 0 -233 0 *
-Ve
-1.00011717266216e-07
--0.14400460822077 0.96003072147436 -0.24000768036859
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  6 0 0 0.0333333333333334
-2  6 1 0 0 0.0333333333333334
-0
-
-0101000
-+233 0 -231 0 *
-Ve
-1.00011949187988e-07
--0.128283563508321 0.962126726315062 -0.240531681578766
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  7 0 0 0.0333333333333333
-2  7 1 0 0 0.0333333333333333
-0
-
-0101000
-+231 0 -229 0 *
-Ve
-1.00012163671385e-07
--0.112465218623456 0.963987588203796 -0.240996897050949
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  8 0 0 0.0333333333333333
-2  8 1 0 0 0.0333333333333333
-0
-
-0101000
-+229 0 -227 0 *
-Ve
-1.00012357261602e-07
--0.0965609099167318 0.965609099170137 -0.241402274792534
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  9 0 0 0.0333333333333333
-2  9 1 0 0 0.0333333333333333
-0
-
-0101000
-+227 0 -225 0 *
-Ve
-1.00012527085203e-07
--0.0805822964022617 0.966987556830027 -0.241746889207507
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  10 0 0 0.0333333333333333
-2  10 1 0 0 0.0333333333333333
-0
-
-0101000
-+225 0 -223 0 *
-Ve
-1.00012670119534e-07
--0.0645413191660163 0.968119787493186 -0.242029946873296
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  11 0 0 0.0333333333333333
-2  11 1 0 0 0.0333333333333333
-0
-
-0101000
-+223 0 -221 0 *
-Ve
-1.00012784063896e-07
--0.0484501583109776 0.96900316622254 -0.242250791555635
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  12 0 0 0.0333333333333334
-2  12 1 0 0 0.0333333333333334
-0
-
-0101000
-+221 0 -219 0 *
-Ve
-1.00012866897991e-07
--0.0323211877865739 0.969635633600236 -0.242408908400059
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  13 0 0 0.0333333333333333
-2  13 1 0 0 0.0333333333333333
-0
-
-0101000
-+219 0 -217 0 *
-Ve
-1.00012917198655e-07
--0.0161669284831528 0.970015708992205 -0.242503927248051
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  14 0 0 0.0333333333333333
-2  14 1 0 0 0.0333333333333333
-0
-
-0101000
-+217 0 -215 0 *
-Ve
-1.00012934052267e-07
-3.90312782094782e-17 0.970142500144824 -0.242535625036206
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  15 0 0 0.0333333333333333
-2  15 1 0 0 0.0333333333333333
-0
-
-0101000
-+215 0 -213 0 *
-Ve
-1.00012917202384e-07
-0.0161669284831527 0.970015708992205 -0.242503927248051
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  16 0 0 0.0333333333333333
-2  16 1 0 0 0.0333333333333333
-0
-
-0101000
-+213 0 -211 0 *
-Ve
-1.00012866901188e-07
-0.032321187786574 0.969635633600235 -0.242408908400059
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  17 0 0 0.0333333333333333
-2  17 1 0 0 0.0333333333333333
-0
-
-0101000
-+211 0 -209 0 *
-Ve
-1.00012784060015e-07
-0.0484501583109777 0.96900316622254 -0.242250791555635
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  18 0 0 0.0333333333333333
-2  18 1 0 0 0.0333333333333333
-0
-
-0101000
-+209 0 -207 0 *
-Ve
-1.0001267015388e-07
-0.0645413191660162 0.968119787493185 -0.242029946873296
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  19 0 0 0.0333333333333333
-2  19 1 0 0 0.0333333333333333
-0
-
-0101000
-+207 0 -205 0 *
-Ve
-1.00012527033006e-07
-0.0805822964022618 0.966987556830027 -0.241746889207507
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  20 0 0 0.0333333333333333
-2  20 1 0 0 0.0333333333333333
-0
-
-0101000
-+205 0 -203 0 *
-Ve
-1.00012357288492e-07
-0.0965609099167318 0.965609099170138 -0.241402274792534
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  21 0 0 0.0333333333333333
-2  21 1 0 0 0.0333333333333333
-0
-
-0101000
-+203 0 -201 0 *
-Ve
-1.00012163671385e-07
-0.112465218623456 0.963987588203796 -0.240996897050949
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  22 0 0 0.0333333333333333
-2  22 1 0 0 0.0333333333333333
-0
-
-0101000
-+201 0 -199 0 *
-Ve
-1.00011949092043e-07
-0.128283563508321 0.962126726315062 -0.240531681578766
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  23 0 0 0.0333333333333334
-2  23 1 0 0 0.0333333333333334
-0
-
-0101000
-+199 0 -197 0 *
-Ve
-1.00011717317363e-07
-0.14400460822077 0.96003072147436 -0.24000768036859
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  24 0 0 0.0333333333333333
-2  24 1 0 0 0.0333333333333333
-0
-
-0101000
-+197 0 -195 0 *
-Ve
-1.00011471337067e-07
-0.159617376893076 0.957704261360912 -0.239426065340228
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  25 0 0 0.0333333333333333
-2  25 1 0 0 0.0333333333333333
-0
-
-0101000
-+195 0 -193 0 *
-Ve
-1.00011214855481e-07
-0.175111288919893 0.955152485019948 -0.238788121254987
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  26 0 0 0.0333333333333333
-2  26 1 0 0 0.0333333333333333
-0
-
-0101000
-+193 0 -191 0 *
-Ve
-1.00010950988161e-07
-0.190476190475715 0.95238095238081 -0.238095238095202
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  27 0 0 0.0333333333333333
-2  27 1 0 0 0.0333333333333333
-0
-
-0101000
-+191 0 -189 0 *
-Ve
-1.00010683258417e-07
-0.205702382594637 0.949395611977367 -0.237348902994342
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  28 0 0 0.0333333333333333
-2  28 1 0 0 0.0333333333333333
-0
-
-0101000
-+189 0 -187 0 *
-Ve
-1.00010414196119e-07
-0.220780645684503 0.946202767221298 -0.236550691805324
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  29 0 0 0.0333333333333333
-2  29 1 0 0 0.0333333333333333
-0
-
-0101000
-+187 0 -185 0 *
-Ve
-1.00076180227716e-07
-0.235702260376798 0.942809041518919 -0.235702260380183
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  30 0 0 0.0333333333333333
-2  30 1 0 0 0.0333333333333333
-0
-
-0101000
-+185 0 -183 0 *
-Ve
-1.00002218111477e-07
-0.236550691770868 0.946202767083471 -0.220780645652826
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  31 0 0 0.0333333333333333
-2  31 1 0 0 0.0333333333333333
-0
-
-0101000
-+183 0 -181 0 *
-Ve
-1.00002157798718e-07
-0.237348902958836 0.949395611835345 -0.20570238256434
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  32 0 0 0.0333333333333333
-2  32 1 0 0 0.0333333333333333
-0
-
-0101000
-+181 0 -179 0 *
-Ve
-1.00002087939323e-07
-0.238095238058691 0.952380952234763 -0.190476190446967
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  33 0 0 0.0333333333333333
-2  33 1 0 0 0.0333333333333333
-0
-
-0101000
-+179 0 -177 0 *
-Ve
-1.00002009305777e-07
-0.238788121217519 0.955152484870077 -0.175111288892861
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  34 0 0 0.0333333333333333
-2  34 1 0 0 0.0333333333333333
-0
-
-0101000
-+177 0 -175 0 *
-Ve
-1.00001922766637e-07
-0.239426065301861 0.957704261207443 -0.15961737686792
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  35 0 0 0.0333333333333333
-2  35 1 0 0 0.0333333333333333
-0
-
-0101000
-+175 0 -173 0 *
-Ve
-1.00001829678178e-07
-0.240007680329386 0.960030721317545 -0.144004608197644
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  36 0 0 0.0333333333333334
-2  36 1 0 0 0.0333333333333334
-0
-
-0101000
-+173 0 -171 0 *
-Ve
-1.0000173139781e-07
-0.240531681538795 0.962126726155178 -0.128283563487368
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  37 0 0 0.0333333333333333
-2  37 1 0 0 0.0333333333333333
-0
-
-0101000
-+171 0 -169 0 *
-Ve
-1.00001630758918e-07
-0.240996897010286 0.963987588041144 -0.11246521860481
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  38 0 0 0.0333333333333333
-2  38 1 0 0 0.0333333333333333
-0
-
-0101000
-+169 0 -167 0 *
-Ve
-1.00001529763631e-07
-0.24140227475126 0.965609099005039 -0.0965609099005125
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  39 0 0 0.0333333333333333
-2  39 1 0 0 0.0333333333333333
-0
-
-0101000
-+167 0 -165 0 *
-Ve
-1.00001432201015e-07
-0.241746889165706 0.966987556662824 -0.0805822963885759
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  40 0 0 0.0333333333333333
-2  40 1 0 0 0.0333333333333333
-0
-
-0101000
-+165 0 -163 0 *
-Ve
-1.00001342051931e-07
-0.242029946831059 0.968119787324237 -0.064541319154955
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  41 0 0 0.0333333333333333
-2  41 1 0 0 0.0333333333333333
-0
-
-0101000
-+163 0 -161 0 *
-Ve
-1.00001263949057e-07
-0.242250791513054 0.969003166052218 -0.0484501583026153
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  42 0 0 0.0333333333333334
-2  42 1 0 0 0.0333333333333334
-0
-
-0101000
-+161 0 -159 0 *
-Ve
-1.00001203023981e-07
-0.242408908357231 0.969635633428924 -0.0323211877809671
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  43 0 0 0.0333333333333333
-2  43 1 0 0 0.0333333333333333
-0
-
-0101000
-+159 0 -157 0 *
-Ve
-1.00001164097414e-07
-0.242503927205074 0.970015708820298 -0.0161669284803398
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  44 0 0 0.0333333333333333
-2  44 1 0 0 0.0333333333333333
-0
-
-0101000
-+157 0 -155 0 *
-Ve
-1.00001150680247e-07
-0.242535624993179 0.970142499972717 -6.53878600184282e-24
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  45 0 0 0.0333333333333333
-2  45 1 0 0 0.0333333333333333
-0
-
-0101000
-+155 0 -153 0 *
-Ve
-1.00001164104246e-07
-0.242503927205074 0.970015708820297 0.0161669284803398
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  46 0 0 0.0333333333333333
-2  46 1 0 0 0.0333333333333333
-0
-
-0101000
-+153 0 -151 0 *
-Ve
-1.00001203069221e-07
-0.242408908357231 0.969635633428924 0.0323211877809671
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  47 0 0 0.0333333333333333
-2  47 1 0 0 0.0333333333333333
-0
-
-0101000
-+151 0 -149 0 *
-Ve
-1.00001263921624e-07
-0.242250791513054 0.969003166052218 0.0484501583026153
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  48 0 0 0.0333333333333333
-2  48 1 0 0 0.0333333333333333
-0
-
-0101000
-+149 0 -147 0 *
-Ve
-1.0000134204636e-07
-0.242029946831059 0.968119787324237 0.064541319154955
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  49 0 0 0.0333333333333333
-2  49 1 0 0 0.0333333333333333
-0
-
-0101000
-+147 0 -145 0 *
-Ve
-1.0000143221107e-07
-0.241746889165706 0.966987556662824 0.0805822963885759
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  50 0 0 0.0333333333333333
-2  50 1 0 0 0.0333333333333333
-0
-
-0101000
-+145 0 -143 0 *
-Ve
-1.00001529802759e-07
-0.24140227475126 0.965609099005039 0.0965609099005125
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  51 0 0 0.0333333333333333
-2  51 1 0 0 0.0333333333333333
-0
-
-0101000
-+143 0 -141 0 *
-Ve
-1.00001630661203e-07
-0.240996897010286 0.963987588041144 0.11246521860481
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  52 0 0 0.0333333333333333
-2  52 1 0 0 0.0333333333333333
-0
-
-0101000
-+141 0 -139 0 *
-Ve
-1.00001731496574e-07
-0.240531681538795 0.962126726155178 0.128283563487368
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  53 0 0 0.0333333333333334
-2  53 1 0 0 0.0333333333333334
-0
-
-0101000
-+139 0 -137 0 *
-Ve
-1.00001829620714e-07
-0.240007680329386 0.960030721317545 0.144004608197644
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  54 0 0 0.0333333333333333
-2  54 1 0 0 0.0333333333333333
-0
-
-0101000
-+137 0 -135 0 *
-Ve
-1.00001922713794e-07
-0.239426065301861 0.957704261207443 0.15961737686792
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  55 0 0 0.0333333333333333
-2  55 1 0 0 0.0333333333333333
-0
-
-0101000
-+135 0 -133 0 *
-Ve
-1.00002009305777e-07
-0.238788121217519 0.955152484870077 0.175111288892861
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  56 0 0 0.0333333333333333
-2  56 1 0 0 0.0333333333333333
-0
-
-0101000
-+133 0 -131 0 *
-Ve
-1.00002087998138e-07
-0.238095238058691 0.952380952234763 0.190476190446967
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  57 0 0 0.0333333333333333
-2  57 1 0 0 0.0333333333333333
-0
-
-0101000
-+131 0 -129 0 *
-Ve
-1.00002157851081e-07
-0.237348902958836 0.949395611835345 0.20570238256434
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  58 0 0 0.0333333333333333
-2  58 1 0 0 0.0333333333333333
-0
-
-0101000
-+129 0 -127 0 *
-Ve
-1.00002218012511e-07
-0.236550691770868 0.946202767083471 0.220780645652826
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  59 0 0 0.0333333333333333
-2  59 1 0 0 0.0333333333333333
-0
-
-0101000
-+127 0 -125 0 *
-Ve
-1.00076180259827e-07
-0.235702260376798 0.942809041518919 0.235702260380183
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  60 0 0 0.0333333333333333
-2  60 1 0 0 0.0333333333333333
-0
-
-0101000
-+125 0 -123 0 *
-Ve
-1.00010414199228e-07
-0.220780645684503 0.946202767221298 0.236550691805324
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  61 0 0 0.0333333333333333
-2  61 1 0 0 0.0333333333333333
-0
-
-0101000
-+123 0 -121 0 *
-Ve
-1.0001068324256e-07
-0.205702382594637 0.949395611977367 0.237348902994342
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  62 0 0 0.0333333333333333
-2  62 1 0 0 0.0333333333333333
-0
-
-0101000
-+121 0 -119 0 *
-Ve
-1.00010951047469e-07
-0.190476190475715 0.95238095238081 0.238095238095203
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  63 0 0 0.0333333333333333
-2  63 1 0 0 0.0333333333333333
-0
-
-0101000
-+119 0 -117 0 *
-Ve
-1.00011214747447e-07
-0.175111288919893 0.955152485019948 0.238788121254987
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  64 0 0 0.0333333333333333
-2  64 1 0 0 0.0333333333333333
-0
-
-0101000
-+117 0 -115 0 *
-Ve
-1.00011471360379e-07
-0.159617376893076 0.957704261360912 0.239426065340228
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  65 0 0 0.0333333333333333
-2  65 1 0 0 0.0333333333333333
-0
-
-0101000
-+115 0 -113 0 *
-Ve
-1.00011717266216e-07
-0.14400460822077 0.96003072147436 0.24000768036859
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  66 0 0 0.0333333333333334
-2  66 1 0 0 0.0333333333333334
-0
-
-0101000
-+113 0 -111 0 *
-Ve
-1.00011949166002e-07
-0.128283563508321 0.962126726315062 0.240531681578766
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  67 0 0 0.0333333333333333
-2  67 1 0 0 0.0333333333333333
-0
-
-0101000
-+111 0 -109 0 *
-Ve
-1.00012163642223e-07
-0.112465218623456 0.963987588203796 0.240996897050949
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  68 0 0 0.0333333333333333
-2  68 1 0 0 0.0333333333333333
-0
-
-0101000
-+109 0 -107 0 *
-Ve
-1.00012357341227e-07
-0.0965609099167319 0.965609099170138 0.241402274792534
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  69 0 0 0.0333333333333333
-2  69 1 0 0 0.0333333333333333
-0
-
-0101000
-+107 0 -105 0 *
-Ve
-1.00012527070278e-07
-0.0805822964022618 0.966987556830027 0.241746889207507
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  70 0 0 0.0333333333333333
-2  70 1 0 0 0.0333333333333333
-0
-
-0101000
-+105 0 -103 0 *
-Ve
-1.00012670112958e-07
-0.0645413191660162 0.968119787493186 0.242029946873296
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  71 0 0 0.0333333333333333
-2  71 1 0 0 0.0333333333333333
-0
-
-0101000
-+103 0 -101 0 *
-Ve
-1.00012784040323e-07
-0.0484501583109777 0.96900316622254 0.242250791555635
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  72 0 0 0.0333333333333334
-2  72 1 0 0 0.0333333333333334
-0
-
-0101000
-+101 0 -99 0 *
-Ve
-1.00012866918536e-07
-0.032321187786574 0.969635633600236 0.242408908400059
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  73 0 0 0.0333333333333333
-2  73 1 0 0 0.0333333333333333
-0
-
-0101000
-+99 0 -97 0 *
-Ve
-1.00012917198655e-07
-0.0161669284831527 0.970015708992205 0.242503927248051
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  74 0 0 0.0333333333333333
-2  74 1 0 0 0.0333333333333333
-0
-
-0101000
-+97 0 -95 0 *
-Ve
-1.00012934052267e-07
-3.90312782094782e-17 0.970142500144824 0.242535625036206
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  75 0 0 0.0333333333333333
-2  75 1 0 0 0.0333333333333333
-0
-
-0101000
-+95 0 -93 0 *
-Ve
-1.00012917198926e-07
--0.0161669284831528 0.970015708992205 0.242503927248051
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  76 0 0 0.0333333333333333
-2  76 1 0 0 0.0333333333333333
-0
-
-0101000
-+93 0 -91 0 *
-Ve
-1.00012866884067e-07
--0.0323211877865739 0.969635633600236 0.242408908400059
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  77 0 0 0.0333333333333333
-2  77 1 0 0 0.0333333333333333
-0
-
-0101000
-+91 0 -89 0 *
-Ve
-1.00012784056647e-07
--0.0484501583109776 0.96900316622254 0.242250791555635
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  78 0 0 0.0333333333333333
-2  78 1 0 0 0.0333333333333333
-0
-
-0101000
-+89 0 -87 0 *
-Ve
-1.0001267015388e-07
--0.0645413191660161 0.968119787493185 0.242029946873296
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  79 0 0 0.0333333333333333
-2  79 1 0 0 0.0333333333333333
-0
-
-0101000
-+87 0 -85 0 *
-Ve
-1.00012527037202e-07
--0.0805822964022617 0.966987556830027 0.241746889207507
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  80 0 0 0.0333333333333333
-2  80 1 0 0 0.0333333333333333
-0
-
-0101000
-+85 0 -83 0 *
-Ve
-1.00012357282367e-07
--0.0965609099167318 0.965609099170137 0.241402274792534
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  81 0 0 0.0333333333333333
-2  81 1 0 0 0.0333333333333333
-0
-
-0101000
-+83 0 -81 0 *
-Ve
-1.0001216365972e-07
--0.112465218623456 0.963987588203796 0.240996897050949
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  82 0 0 0.0333333333333333
-2  82 1 0 0 0.0333333333333333
-0
-
-0101000
-+81 0 -79 0 *
-Ve
-1.00011949114029e-07
--0.128283563508321 0.962126726315062 0.240531681578766
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  83 0 0 0.0333333333333334
-2  83 1 0 0 0.0333333333333334
-0
-
-0101000
-+79 0 -77 0 *
-Ve
-1.00011717317363e-07
--0.14400460822077 0.96003072147436 0.24000768036859
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  84 0 0 0.0333333333333333
-2  84 1 0 0 0.0333333333333333
-0
-
-0101000
-+77 0 -75 0 *
-Ve
-1.00011471308876e-07
--0.159617376893076 0.957704261360912 0.239426065340228
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  85 0 0 0.0333333333333333
-2  85 1 0 0 0.0333333333333333
-0
-
-0101000
-+75 0 -73 0 *
-Ve
-1.00011214852817e-07
--0.175111288919893 0.955152485019948 0.238788121254987
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  86 0 0 0.0333333333333333
-2  86 1 0 0 0.0333333333333333
-0
-
-0101000
-+73 0 -71 0 *
-Ve
-1.00010951003145e-07
--0.190476190475715 0.95238095238081 0.238095238095202
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  87 0 0 0.0333333333333333
-2  87 1 0 0 0.0333333333333333
-0
-
-0101000
-+71 0 -69 0 *
-Ve
-1.00010683245542e-07
--0.205702382594637 0.949395611977367 0.237348902994342
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  88 0 0 0.0333333333333333
-2  88 1 0 0 0.0333333333333333
-0
-
-0101000
-+69 0 -67 0 *
-Ve
-1.00010414201445e-07
--0.220780645684503 0.946202767221298 0.236550691805324
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  89 0 0 0.0333333333333333
-2  89 1 0 0 0.0333333333333333
-0
-
-0101000
-+67 0 -65 0 *
-Ve
-1.00076180213871e-07
--0.235702260376798 0.94280904151892 0.235702260380183
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  90 0 0 0.0333333333333333
-2  90 1 0 0 0.0333333333333333
-0
-
-0101000
-+65 0 -63 0 *
-Ve
-1.00002218111477e-07
--0.236550691770868 0.946202767083471 0.220780645652826
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  91 0 0 0.0333333333333333
-2  91 1 0 0 0.0333333333333333
-0
-
-0101000
-+63 0 -61 0 *
-Ve
-1.00002157798718e-07
--0.237348902958836 0.949395611835345 0.20570238256434
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  92 0 0 0.0333333333333333
-2  92 1 0 0 0.0333333333333333
-0
-
-0101000
-+61 0 -59 0 *
-Ve
-1.00002087939323e-07
--0.238095238058691 0.952380952234763 0.190476190446967
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  93 0 0 0.0333333333333333
-2  93 1 0 0 0.0333333333333333
-0
-
-0101000
-+59 0 -57 0 *
-Ve
-1.00002009301198e-07
--0.238788121217519 0.955152484870077 0.175111288892861
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  94 0 0 0.0333333333333333
-2  94 1 0 0 0.0333333333333333
-0
-
-0101000
-+57 0 -55 0 *
-Ve
-1.00001922766637e-07
--0.239426065301861 0.957704261207443 0.15961737686792
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  95 0 0 0.0333333333333333
-2  95 1 0 0 0.0333333333333333
-0
-
-0101000
-+55 0 -53 0 *
-Ve
-1.00001829678178e-07
--0.240007680329386 0.960030721317545 0.144004608197644
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  96 0 0 0.0333333333333334
-2  96 1 0 0 0.0333333333333334
-0
-
-0101000
-+53 0 -51 0 *
-Ve
-1.0000173139781e-07
--0.240531681538795 0.962126726155178 0.128283563487368
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  97 0 0 0.0333333333333333
-2  97 1 0 0 0.0333333333333333
-0
-
-0101000
-+51 0 -49 0 *
-Ve
-1.00001630761675e-07
--0.240996897010286 0.963987588041144 0.11246521860481
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  98 0 0 0.0333333333333333
-2  98 1 0 0 0.0333333333333333
-0
-
-0101000
-+49 0 -47 0 *
-Ve
-1.00001529766197e-07
--0.24140227475126 0.965609099005039 0.0965609099005125
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  99 0 0 0.0333333333333333
-2  99 1 0 0 0.0333333333333333
-0
-
-0101000
-+47 0 -45 0 *
-Ve
-1.00001432201015e-07
--0.241746889165706 0.966987556662824 0.0805822963885759
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  100 0 0 0.0333333333333333
-2  100 1 0 0 0.0333333333333333
-0
-
-0101000
-+45 0 -43 0 *
-Ve
-1.00001342051931e-07
--0.242029946831059 0.968119787324237 0.064541319154955
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  101 0 0 0.0333333333333333
-2  101 1 0 0 0.0333333333333333
-0
-
-0101000
-+43 0 -41 0 *
-Ve
-1.00001263949057e-07
--0.242250791513054 0.969003166052218 0.0484501583026153
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  102 0 0 0.0333333333333334
-2  102 1 0 0 0.0333333333333334
-0
-
-0101000
-+41 0 -39 0 *
-Ve
-1.00001203023981e-07
--0.242408908357231 0.969635633428924 0.0323211877809671
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  103 0 0 0.0333333333333333
-2  103 1 0 0 0.0333333333333333
-0
-
-0101000
-+39 0 -37 0 *
-Ve
-1.00001164097414e-07
--0.242503927205074 0.970015708820298 0.0161669284803398
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  104 0 0 0.0333333333333333
-2  104 1 0 0 0.0333333333333333
-0
-
-0101000
-+37 0 -35 0 *
-Ve
-1.00001150680247e-07
--0.242535624993179 0.970142499972717 6.53878600184282e-24
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  105 0 0 0.0333333333333333
-2  105 1 0 0 0.0333333333333333
-0
-
-0101000
-+35 0 -33 0 *
-Ve
-1.00001164104246e-07
--0.242503927205074 0.970015708820297 -0.0161669284803398
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  106 0 0 0.0333333333333333
-2  106 1 0 0 0.0333333333333333
-0
-
-0101000
-+33 0 -31 0 *
-Ve
-1.00001203069221e-07
--0.242408908357231 0.969635633428924 -0.0323211877809671
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  107 0 0 0.0333333333333333
-2  107 1 0 0 0.0333333333333333
-0
-
-0101000
-+31 0 -29 0 *
-Ve
-1.00001263921624e-07
--0.242250791513054 0.969003166052218 -0.0484501583026153
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  108 0 0 0.0333333333333333
-2  108 1 0 0 0.0333333333333333
-0
-
-0101000
-+29 0 -27 0 *
-Ve
-1.0000134204636e-07
--0.242029946831059 0.968119787324237 -0.064541319154955
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  109 0 0 0.0333333333333333
-2  109 1 0 0 0.0333333333333333
-0
-
-0101000
-+27 0 -25 0 *
-Ve
-1.0000143221339e-07
--0.241746889165706 0.966987556662824 -0.0805822963885759
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  110 0 0 0.0333333333333333
-2  110 1 0 0 0.0333333333333333
-0
-
-0101000
-+25 0 -23 0 *
-Ve
-1.00001529805325e-07
--0.24140227475126 0.965609099005039 -0.0965609099005125
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  111 0 0 0.0333333333333333
-2  111 1 0 0 0.0333333333333333
-0
-
-0101000
-+23 0 -21 0 *
-Ve
-1.00001630661203e-07
--0.240996897010286 0.963987588041144 -0.11246521860481
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  112 0 0 0.0333333333333333
-2  112 1 0 0 0.0333333333333333
-0
-
-0101000
-+21 0 -19 0 *
-Ve
-1.00001731496574e-07
--0.240531681538795 0.962126726155178 -0.128283563487368
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  113 0 0 0.0333333333333334
-2  113 1 0 0 0.0333333333333334
-0
-
-0101000
-+19 0 -17 0 *
-Ve
-1.00001829620714e-07
--0.240007680329386 0.960030721317545 -0.144004608197644
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  114 0 0 0.0333333333333333
-2  114 1 0 0 0.0333333333333333
-0
-
-0101000
-+17 0 -15 0 *
-Ve
-1.00001922713794e-07
--0.239426065301861 0.957704261207443 -0.15961737686792
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  115 0 0 0.0333333333333333
-2  115 1 0 0 0.0333333333333333
-0
-
-0101000
-+15 0 -13 0 *
-Ve
-1.00002009310356e-07
--0.238788121217519 0.955152484870077 -0.175111288892861
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  116 0 0 0.0333333333333333
-2  116 1 0 0 0.0333333333333333
-0
-
-0101000
-+13 0 -11 0 *
-Ve
-1.00002088002031e-07
--0.238095238058691 0.952380952234763 -0.190476190446967
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  117 0 0 0.0333333333333333
-2  117 1 0 0 0.0333333333333333
-0
-
-0101000
-+11 0 -9 0 *
-Ve
-1.00002157851081e-07
--0.237348902958836 0.949395611835345 -0.20570238256434
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  118 0 0 0.0333333333333333
-2  118 1 0 0 0.0333333333333333
-0
-
-0101000
-+9 0 -7 0 *
-Ve
-1.00002218012511e-07
--0.236550691770868 0.946202767083471 -0.220780645652826
-0 0
-
-0101101
-*
-Ed
- 1e-07 1 1 0
-1  119 0 0 0.0333333333333333
-2  119 1 0 0 0.0333333333333333
-0
-
-0101000
-+7 0 -5 0 *
-Ed
- 1e-07 1 1 0
-1  120 0 0 0.0333333333333333
-2  120 1 0 0 0.0333333333333333
-0
-
-0101000
-+5 0 -242 0 *
-Wi
-
-0101100
-+240 0 +238 0 +236 0 +234 0 +232 0 +230 0 +228 0 +226 0 +224 0 +222 0 
-+220 0 +218 0 +216 0 +214 0 +212 0 +210 0 +208 0 +206 0 +204 0 +202 0 
-+200 0 +198 0 +196 0 +194 0 +192 0 +190 0 +188 0 +186 0 +184 0 +182 0 
-+180 0 +178 0 +176 0 +174 0 +172 0 +170 0 +168 0 +166 0 +164 0 +162 0 
-+160 0 +158 0 +156 0 +154 0 +152 0 +150 0 +148 0 +146 0 +144 0 +142 0 
-+140 0 +138 0 +136 0 +134 0 +132 0 +130 0 +128 0 +126 0 +124 0 +122 0 
-+120 0 +118 0 +116 0 +114 0 +112 0 +110 0 +108 0 +106 0 +104 0 +102 0 
-+100 0 +98 0 +96 0 +94 0 +92 0 +90 0 +88 0 +86 0 +84 0 +82 0 
-+80 0 +78 0 +76 0 +74 0 +72 0 +70 0 +68 0 +66 0 +64 0 +62 0 
-+60 0 +58 0 +56 0 +54 0 +52 0 +50 0 +48 0 +46 0 +44 0 +42 0 
-+40 0 +38 0 +36 0 +34 0 +32 0 +30 0 +28 0 +26 0 +24 0 +22 0 
-+20 0 +18 0 +16 0 +14 0 +12 0 +10 0 +8 0 +6 0 +4 0 +3 0 
-*
-Fa
-0  1e-07 1 0
-
-1101000
--2 0 *
-
-+1 0 
\ No newline at end of file
index c9039f0..d204356 100755 (executable)
@@ -1,5 +1,5 @@
 set TheFileName shading_014.brep
-if { [string compare $command "shading"] == 0 } {
-   set bug_freenodes "OCC22687"
-   set nbfreenodes(All) 1
-}
+###if { [string compare $command "shading"] == 0 } {
+###   set bug_freenodes "OCC22687"
+###   set nbfreenodes(All) 1
+###}
index 9be3e3f..8e35dc3 100755 (executable)
@@ -4,6 +4,11 @@ if { [string compare $command "shading"] == 0 } {
    set nbfreenodes(All) 1
 } else {
    set bug_freelinks "OCC23105"
-   set nbfree(ALL) 4
+###   set nbfree(ALL) 4
+   if { [string compare $command "mesh"] == 0 } {
+     set nbfree(ALL) 8
+   } else {
+     set nbfree(ALL) 2
+   }
    set nbfreenodes(All) 4
 }
index 0211718..e0afaf7 100755 (executable)
@@ -9,14 +9,15 @@ if {[array get env os_type] != ""} {
   set os $env(os_type)
 }
 if { [string compare $command "shading"] == 0 } {
-   set nbt 14
+###   set nbt 14
+   set nbt 9
    set nbn 83
    if {
           [string compare $os "Mandriva2008"] == 0
-       || [string compare $os "Debian40"] == 0
+       || [string compare $os "Debian60-64"] == 0
       } {
-      set nbl 19
-      set nbfree($os) $nbl
+###      set nbl 19
+###      set nbfree($os) $nbl
 ##    else
 ##      set nbl 17
    }
@@ -34,11 +35,12 @@ set nbfreenodes($os) $nbn
       set nbfreenodes($os) $nbn
    } else {
       set bug_withouttri "OCC23105"
-      set nbt 14
+###      set nbt 14
+      set nbt 8
       set nbn 60
-##      set nbl 2
+      set nbl 3
       set nbwithouttri($os) $nbt
-##      set nbfree($os) $nbl
+      set nbfree($os) $nbl
       set nbfreenodes($os) $nbn
    }
 }
index 7a39611..c270c7f 100755 (executable)
@@ -11,8 +11,8 @@ if { [string compare $command "shading"] == 0 } {
   set rel_tol 1.3
   set nbwithouttri(ALL) 6
   set nbfreenodes(ALL) 1
-  set bug_freelinks "OCC22687"
-  set nbfree(ALL) 2
+###  set bug_freelinks "OCC22687"
+###  set nbfree(ALL) 2
 } else {
   set nbfreenodes(ALL) 2
   set nbwithouttri(ALL) 5
@@ -30,7 +30,7 @@ if { [string compare $command "mesh"] == 0 } {
   }
   set nbfree($os) $nb
 }
-if { [string compare $command "shading"] == 0 } {
-  set bug_freelinks "OCC22687"
-  set nbfree(ALL) 2
-}
+###if { [string compare $command "shading"] == 0 } {
+###  set bug_freelinks "OCC22687"
+###  set nbfree(ALL) 2
+###}
index c08068c..023e17d 100755 (executable)
@@ -1,13 +1,13 @@
 set TheFileName shading_wrongshape_029.brep
-set bug_withouttri "OCC22687"
-set nbwithouttri(All) 1
-set bug_freelinks "OCC22687"
-if { [string compare $command "shading"] == 0 } {
-   set bug_freenodes "OCC23105"
-   set nbfreenodes(ALL) 2
-   set nbfree(ALL) 12
-} else {
-   set bug_freenodes "OCC23105"
-   set nbfreenodes(ALL) 2
-   set nbfree(ALL) 8
-}
+###set bug_withouttri "OCC22687"
+###set nbwithouttri(All) 1
+###set bug_freelinks "OCC22687"
+###if { [string compare $command "shading"] == 0 } {
+###   set bug_freenodes "OCC23105"
+###   set nbfreenodes(ALL) 2
+###   set nbfree(ALL) 12
+###} else {
+###   set bug_freenodes "OCC23105"
+###   set nbfreenodes(ALL) 2
+###   set nbfree(ALL) 8
+###}