From 01a6e62bc2a126427ecc05443219f7464c5efc69 Mon Sep 17 00:00:00 2001 From: oan Date: Thu, 10 Jul 2014 14:40:36 +0400 Subject: [PATCH] 0024968: Impove BRepMesh_Classifier to cope with intersection of huge number of wires 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 --- src/BRepMesh/BRepMesh.cdl | 9 +- src/BRepMesh/BRepMesh_BiPoint.cdl | 44 - src/BRepMesh/BRepMesh_BiPoint.cxx | 46 - src/BRepMesh/BRepMesh_BiPoint.lxx | 41 - src/BRepMesh/BRepMesh_Classifier.cdl | 74 - src/BRepMesh/BRepMesh_Classifier.cxx | 620 +---- src/BRepMesh/BRepMesh_Classifier.hxx | 79 + src/BRepMesh/BRepMesh_Classifier.lxx | 24 - src/BRepMesh/BRepMesh_ClassifierPtr.hxx | 2 +- src/BRepMesh/BRepMesh_Delaun.cxx | 192 +- src/BRepMesh/BRepMesh_Delaun.hxx | 31 +- src/BRepMesh/BRepMesh_FastDiscret.cdl | 32 +- src/BRepMesh/BRepMesh_FastDiscret.cxx | 108 +- src/BRepMesh/BRepMesh_FastDiscretFace.cxx | 1 + src/BRepMesh/BRepMesh_IncrementalMesh.cxx | 21 +- src/BRepMesh/BRepMesh_WireChecker.cxx | 423 +++ src/BRepMesh/BRepMesh_WireChecker.hxx | 167 ++ .../BRepMesh_WireInterferenceChecker.cxx | 345 +++ .../BRepMesh_WireInterferenceChecker.hxx | 114 + src/BRepMesh/FILES | 6 + src/NCollection/NCollection_EBTree.hxx | 2 +- tests/bugs/mesh/bug24968_1 | 45 + tests/bugs/mesh/bug24968_2 | 45 + tests/bugs/mesh/data/bug22778_square.brep | 2376 ----------------- tests/mesh/data/standard/B5 | 8 +- tests/mesh/data/standard/C7 | 7 +- tests/mesh/data/standard/U7 | 16 +- tests/mesh/data/standard/W4 | 12 +- tests/mesh/data/standard/W9 | 24 +- 29 files changed, 1454 insertions(+), 3460 deletions(-) delete mode 100644 src/BRepMesh/BRepMesh_BiPoint.cdl delete mode 100644 src/BRepMesh/BRepMesh_BiPoint.cxx delete mode 100644 src/BRepMesh/BRepMesh_BiPoint.lxx delete mode 100644 src/BRepMesh/BRepMesh_Classifier.cdl create mode 100644 src/BRepMesh/BRepMesh_Classifier.hxx delete mode 100644 src/BRepMesh/BRepMesh_Classifier.lxx create mode 100644 src/BRepMesh/BRepMesh_WireChecker.cxx create mode 100644 src/BRepMesh/BRepMesh_WireChecker.hxx create mode 100644 src/BRepMesh/BRepMesh_WireInterferenceChecker.cxx create mode 100644 src/BRepMesh/BRepMesh_WireInterferenceChecker.hxx create mode 100644 tests/bugs/mesh/bug24968_1 create mode 100644 tests/bugs/mesh/bug24968_2 delete mode 100644 tests/bugs/mesh/data/bug22778_square.brep diff --git a/src/BRepMesh/BRepMesh.cdl b/src/BRepMesh/BRepMesh.cdl index 52fe7b3b61..7c55409293 100644 --- a/src/BRepMesh/BRepMesh.cdl +++ b/src/BRepMesh/BRepMesh.cdl @@ -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 index bb838c441b..0000000000 --- a/src/BRepMesh/BRepMesh_BiPoint.cdl +++ /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 index 7cd6569aaa..0000000000 --- a/src/BRepMesh/BRepMesh_BiPoint.cxx +++ /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 - -#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 index 7a48f1d74d..0000000000 --- a/src/BRepMesh/BRepMesh_BiPoint.lxx +++ /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 index 88b45b90b3..0000000000 --- a/src/BRepMesh/BRepMesh_Classifier.cdl +++ /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 . - -- 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; diff --git a/src/BRepMesh/BRepMesh_Classifier.cxx b/src/BRepMesh/BRepMesh_Classifier.cxx index 2c64b046b1..09545b49ed 100644 --- a/src/BRepMesh/BRepMesh_Classifier.cxx +++ b/src/BRepMesh/BRepMesh_Classifier.cxx @@ -14,565 +14,21 @@ // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. -#include +#include -// Kernel #include -#include -#include -#include -#include -#include -// Geometry -#include #include -#include -#include -#include -#include -#include -#include -#include -#include -// Topology -#include -#include -#include -#include -#include -#include -#include -#include -#include #include -#include -// BRepMesh -#include -#include -#include - -static const Standard_Real PARALL_COND = Sin(M_PI/3.0); -static const Standard_Real RESOLUTION = 1.0E-16; - -// 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; +#include //======================================================================= -//function : AnalizeWire +//function : Constructor //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) +BRepMesh_Classifier::BRepMesh_Classifier() { - const Standard_Integer aNbPnts = theSeqPnt2d.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; - aPClass(1) = p1; - aPClass(2) = p2; - for (Standard_Integer i = 1; i <= aNbPnts; i++) - { - Standard_Integer ii = i + 2; - if (ii > aNbPnts) - { - p3 = aPClass(ii - aNbPnts); - } - else - { - p3 = theSeqPnt2d.Value(ii); - aPClass(ii) = p3; - } - - gp_Vec2d A(p1,p2), B(p2,p3); - if (A.SquareMagnitude() > 1.e-16 && B.SquareMagnitude() > 1.e-16) - { - 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()) - { - anAngle += aCurAngle; - p1 = p2; - } - } - p2 = p3; - } - // Check for zero angle - treat self intersecting wire as outer - if (Abs(anAngle) < Precision::Angular()) - anAngle = 0.0; - - myTabClass.Append( (void *)new CSLib_Class2d(aPClass, myTolUV, myTolUV, - theUmin, theVmin, theUmax, theVmax) ); - myTabOrient.Append( ((anAngle < 0.0) ? 0 : 1) ); } -//======================================================================= -//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 - 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 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 : @@ -591,7 +47,7 @@ TopAbs_State BRepMesh_Classifier::Perform(const gp_Pnt2d& thePoint) const isOut = Standard_True; } else - isOut = myTabOrient(i)? (aCur == -1) : (aCur == 1); + isOut = myTabOrient(i) ? (aCur == -1) : (aCur == 1); if (isOut) return TopAbs_OUT; @@ -600,6 +56,69 @@ TopAbs_State BRepMesh_Classifier::Perform(const gp_Pnt2d& thePoint) const return TopAbs_IN; } +//======================================================================= +//function : RegisterWire +//purpose : +//======================================================================= +void BRepMesh_Classifier::RegisterWire( + const NCollection_Sequence& 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 = theWire.Length(); + if (aNbPnts < 2) + return; + + // Accumulate angle + TColgp_Array1OfPnt2d aPClass(1, aNbPnts); + Standard_Real anAngle = 0.0; + 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; + if (ii > aNbPnts) + { + p3 = aPClass(ii - aNbPnts); + } + else + { + p3 = theWire.Value(ii); + aPClass(ii) = p3; + } + + gp_Vec2d A(p1,p2), B(p2,p3); + 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 > aAngTol && (M_PI - aCurAngleAbs) > aAngTol) + { + anAngle += aCurAngle; + p1 = p2; + } + } + p2 = p3; + } + // Check for zero angle - treat self intersecting wire as outer + if (Abs(anAngle) < aAngTol) + anAngle = 0.0; + + myTabClass.Append( (void *)new CSLib_Class2d(aPClass, + theTolUV, theTolUV, theUmin, theVmin, theUmax, theVmax) ); + myTabOrient.Append( !(anAngle < 0.0) ); +} //======================================================================= //function : Destroy @@ -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 index 0000000000..42c266dc67 --- /dev/null +++ b/src/BRepMesh/BRepMesh_Classifier.hxx @@ -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 +#include +#include +#include +#include +#include +#include + +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& 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 index 0fc660504c..0000000000 --- a/src/BRepMesh/BRepMesh_Classifier.lxx +++ /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; -} diff --git a/src/BRepMesh/BRepMesh_ClassifierPtr.hxx b/src/BRepMesh/BRepMesh_ClassifierPtr.hxx index ed9e4d150f..6d8ec6f019 100644 --- a/src/BRepMesh/BRepMesh_ClassifierPtr.hxx +++ b/src/BRepMesh/BRepMesh_ClassifierPtr.hxx @@ -16,9 +16,9 @@ #ifndef BRepMesh_ClassifierPtr_HeaderFile #define BRepMesh_ClassifierPtr_HeaderFile -#include #include +class BRepMesh_Classifier; typedef NCollection_Handle BRepMesh_ClassifierPtr; #endif diff --git a/src/BRepMesh/BRepMesh_Delaun.cxx b/src/BRepMesh/BRepMesh_Delaun.cxx index c833f9c7a8..a536814e2a 100644 --- a/src/BRepMesh/BRepMesh_Delaun.cxx +++ b/src/BRepMesh/BRepMesh_Delaun.cxx @@ -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); } //============================================================================= diff --git a/src/BRepMesh/BRepMesh_Delaun.hxx b/src/BRepMesh/BRepMesh_Delaun.hxx index f4cfc78b75..71c2faba11 100755 --- a/src/BRepMesh/BRepMesh_Delaun.hxx +++ b/src/BRepMesh/BRepMesh_Delaun.hxx @@ -25,6 +25,7 @@ #include #include #include +#include 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, diff --git a/src/BRepMesh/BRepMesh_FastDiscret.cdl b/src/BRepMesh/BRepMesh_FastDiscret.cdl index e7a12b0f15..340eddc242 100644 --- a/src/BRepMesh/BRepMesh_FastDiscret.cdl +++ b/src/BRepMesh/BRepMesh_FastDiscret.cdl @@ -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 is True, the -- deflection used for the polygonalisation of -- each edge will be * Size of Edge. diff --git a/src/BRepMesh/BRepMesh_FastDiscret.cxx b/src/BRepMesh/BRepMesh_FastDiscret.cxx index d65e8ebd87..9ef681817e 100644 --- a/src/BRepMesh/BRepMesh_FastDiscret.cxx +++ b/src/BRepMesh/BRepMesh_FastDiscret.cxx @@ -20,6 +20,8 @@ #include #include #include +#include +#include #include #include #include @@ -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(); } } diff --git a/src/BRepMesh/BRepMesh_FastDiscretFace.cxx b/src/BRepMesh/BRepMesh_FastDiscretFace.cxx index b453e12320..f8890172e7 100644 --- a/src/BRepMesh/BRepMesh_FastDiscretFace.cxx +++ b/src/BRepMesh/BRepMesh_FastDiscretFace.cxx @@ -25,6 +25,7 @@ #include #include #include +#include #include #include #include diff --git a/src/BRepMesh/BRepMesh_IncrementalMesh.cxx b/src/BRepMesh/BRepMesh_IncrementalMesh.cxx index 09cca193d7..b08023c05e 100644 --- a/src/BRepMesh/BRepMesh_IncrementalMesh.cxx +++ b/src/BRepMesh/BRepMesh_IncrementalMesh.cxx @@ -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" < + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef HAVE_TBB + // paralleling using Intel TBB + #include + #include +#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 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(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& 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 index 0000000000..57c4b8fe2a --- /dev/null +++ b/src/BRepMesh/BRepMesh_WireChecker.hxx @@ -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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +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 BndBox2dTree; + typedef NCollection_UBTreeFiller BndBox2dTreeFiller; + typedef NCollection_Array1 ArrayOfInteger; + typedef std::vector ArrayOfSegments; + typedef NCollection_Handle HArrayOfSegments; + typedef NCollection_Handle HBndBox2dTree; + typedef std::pair 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 ListOfEdges; + typedef std::vector SeqOfWireEdges; + typedef NCollection_Sequence SeqOfPnt2d; + typedef std::vector SeqOfDWires; + typedef NCollection_DataMap DataMapIntInt; + typedef std::pair 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& 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 index 0000000000..78604a955b --- /dev/null +++ b/src/BRepMesh/BRepMesh_WireInterferenceChecker.cxx @@ -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 +#include + +// 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& 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& 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& 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 index 0000000000..430e83c9b9 --- /dev/null +++ b/src/BRepMesh/BRepMesh_WireInterferenceChecker.hxx @@ -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 +#include +#include +#include + +#ifdef HAVE_TBB + // paralleling using Intel TBB + #include +#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& theWires, + BRepMesh_Status* theStatus, + Standard_Mutex* theMutex); + + //! Checker's body. + //! \param theWireRange range of wires to be checked. + void operator ()(const tbb::blocked_range& 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& 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 diff --git a/src/BRepMesh/FILES b/src/BRepMesh/FILES index 9d80a5dfab..43aeb4833b 100755 --- a/src/BRepMesh/FILES +++ b/src/BRepMesh/FILES @@ -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 diff --git a/src/NCollection/NCollection_EBTree.hxx b/src/NCollection/NCollection_EBTree.hxx index f10a7c1c23..3f224d8b64 100644 --- a/src/NCollection/NCollection_EBTree.hxx +++ b/src/NCollection/NCollection_EBTree.hxx @@ -117,7 +117,7 @@ Standard_Boolean NCollection_EBTree::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 index 0000000000..4e1ad86617 --- /dev/null +++ b/tests/bugs/mesh/bug24968_1 @@ -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 index 0000000000..4a21d20c81 --- /dev/null +++ b/tests/bugs/mesh/bug24968_2 @@ -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 index 0232809820..0000000000 --- a/tests/bugs/mesh/data/bug22778_square.brep +++ /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 diff --git a/tests/mesh/data/standard/B5 b/tests/mesh/data/standard/B5 index c9039f0243..d20435603f 100755 --- a/tests/mesh/data/standard/B5 +++ b/tests/mesh/data/standard/B5 @@ -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 +###} diff --git a/tests/mesh/data/standard/C7 b/tests/mesh/data/standard/C7 index 9be3e3f8c8..8e35dc3894 100755 --- a/tests/mesh/data/standard/C7 +++ b/tests/mesh/data/standard/C7 @@ -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 } diff --git a/tests/mesh/data/standard/U7 b/tests/mesh/data/standard/U7 index 021171892d..e0afaf760a 100755 --- a/tests/mesh/data/standard/U7 +++ b/tests/mesh/data/standard/U7 @@ -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 } } diff --git a/tests/mesh/data/standard/W4 b/tests/mesh/data/standard/W4 index 7a396117f8..c270c7f18a 100755 --- a/tests/mesh/data/standard/W4 +++ b/tests/mesh/data/standard/W4 @@ -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 +###} diff --git a/tests/mesh/data/standard/W9 b/tests/mesh/data/standard/W9 index c08068c645..023e17d3a7 100755 --- a/tests/mesh/data/standard/W9 +++ b/tests/mesh/data/standard/W9 @@ -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 +###}