1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-14 13:30:48 +03:00

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
This commit is contained in:
oan
2014-07-10 14:40:36 +04:00
committed by apn
parent 0e9d3b83b8
commit 01a6e62bc2
29 changed files with 1454 additions and 3460 deletions

View File

@@ -25,6 +25,7 @@
#include <BRepMesh_MapOfIntegerInteger.hxx>
#include <BRepMesh_DataStructureOfDelaun.hxx>
#include <NCollection_Sequence.hxx>
#include <BRepMesh_WireInterferenceChecker.hxx>
class Bnd_B2d;
class Bnd_Box2d;
@@ -119,16 +120,6 @@ public:
private:
enum IntFlag
{
NoIntersection,
Cross,
EndPointTouch,
PointOnEdge,
Glued,
Same
};
enum ReplaceFlag
{
Replace,
@@ -305,21 +296,13 @@ private:
Standard_Real theSqModulus[3],
Standard_Integer& theEdgeOn) const;
//! Classifies the point in case of coincidence of two vectors.
//! @param thePoint1 the start point of a segment (base point)
//! @param thePoint2 the end point of a segment
//! @param thePointToCheck the point to classify
//! @returns zero value if point is out of segment and non zero value if point is between the first and the second point of segment
Standard_Integer classifyPoint (const gp_XY& thePoint1,
const gp_XY& thePoint2,
const gp_XY& thePointToCheck) const;
//! Checks intersection between the two segments.
IntFlag intSegSeg (const BRepMesh_Edge& theEdge1,
const BRepMesh_Edge& theEdge2,
const Standard_Boolean isConsiderEndPointTouch,
const Standard_Boolean isConsiderPointOnEdge,
gp_Pnt2d& theIntPnt) const;
BRepMesh_WireInterferenceChecker::IntFlag intSegSeg (
const BRepMesh_Edge& theEdge1,
const BRepMesh_Edge& theEdge2,
const Standard_Boolean isConsiderEndPointTouch,
const Standard_Boolean isConsiderPointOnEdge,
gp_Pnt2d& theIntPnt) const;
//! Returns area of the loop of the given polygon defined by indices of its start and end links.
Standard_Real polyArea (const TColStd_SequenceOfInteger& thePolygon,