From 3922a2ec0f2e990d6f7175032c1700dc806d2398 Mon Sep 17 00:00:00 2001 From: azv Date: Thu, 11 Dec 2014 16:06:35 +0300 Subject: [PATCH] 0025555: Wrong result of classification of a point relative to solid Implemented additional verification that the point found by Extrema is placed inside the face. This way turns off searching the additional inner point. Test case for issue CR25555 --- src/BRepClass3d/BRepClass3d_SClassifier.cxx | 2 +- src/BRepClass3d/BRepClass3d_SolidExplorer.cxx | 16 ++++++++++++++ tests/bugs/modalg_5/bug25555 | 21 +++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100755 tests/bugs/modalg_5/bug25555 diff --git a/src/BRepClass3d/BRepClass3d_SClassifier.cxx b/src/BRepClass3d/BRepClass3d_SClassifier.cxx index b205ac4c39..a53020fd8b 100644 --- a/src/BRepClass3d/BRepClass3d_SClassifier.cxx +++ b/src/BRepClass3d/BRepClass3d_SClassifier.cxx @@ -309,7 +309,7 @@ void BRepClass3d_SClassifier::Perform(BRepClass3d_SolidExplorer& SolidExplorer, if(Intersector3d.IsDone()) { Standard_Integer i; for (i=1; i <= Intersector3d.NbPnt(); i++) { - if(Abs(Intersector3d.WParameter(i)) < Abs(parmin)) { + if(Abs(Intersector3d.WParameter(i)) < Abs(parmin) - Precision::PConfusion()) { parmin = Intersector3d.WParameter(i); // Modified by skv - Thu Sep 4 12:46:32 2003 OCC578 Begin diff --git a/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx b/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx index 5043721532..b9e132c92f 100644 --- a/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx +++ b/src/BRepClass3d/BRepClass3d_SolidExplorer.cxx @@ -251,6 +251,14 @@ Standard_Boolean BRepClass3d_SolidExplorer::PointInTheFace void *ptr = (void*)(myMapOfInter.Find(Face)); if(ptr) { const IntCurvesFace_Intersector& TheIntersector = (*((IntCurvesFace_Intersector *)ptr)); + // Check if the point is already in the face + if(TheIntersector.ClassifyUVPoint(gp_Pnt2d(u_,v_))==TopAbs_IN) { + gp_Pnt aPnt; + surf->D1(u_, v_, aPnt, theVecD1U, theVecD1V); + if (aPnt.SquareDistance(APoint_) < Precision::Confusion() * Precision::Confusion()) + return Standard_True; + } + //-- Take 4 points in each Quarter of surface //-- -> Index : 1 -> 16 //-- @@ -451,6 +459,9 @@ Standard_Integer BRepClass3d_SolidExplorer::OtherSegment(const gp_Pnt& P, // // Check if the point is on the face or the face is infinite. Standard_Integer anInfFlag = IsInfiniteUV(U1,V1,U2,V2); + // default values + _u = (U1 + U2) * 0.5; + _v = (V1 + V2) * 0.5; GeomAdaptor_Surface GA(BRep_Tool::Surface(face)); Extrema_ExtPS Ext(P, GA, TolU, TolV); @@ -510,6 +521,11 @@ Standard_Integer BRepClass3d_SolidExplorer::OtherSegment(const gp_Pnt& P, ptfound=Standard_True; return 0; } + + // set the parameters found by extrema + aPx = Ext.Point(iNear); + aPx.Parameter(_u, _v); + APoint = aPx.Value(); } //The point is not ON the face or surface. The face is restricted. // find point in a face not too far from a projection of P on face diff --git a/tests/bugs/modalg_5/bug25555 b/tests/bugs/modalg_5/bug25555 new file mode 100755 index 0000000000..96ef6b1f44 --- /dev/null +++ b/tests/bugs/modalg_5/bug25555 @@ -0,0 +1,21 @@ +puts "============" +puts "OCC25555" +puts "============" +puts "" +############################################################################ +# Wrong result of classification of a point relative to solid +############################################################################ + +restore [locate_data_file bug25555_p] p +restore [locate_data_file bug25555_z] z + +set cls1 [bclassify z p] +if { [regexp {OUT} $cls1] } { + puts "OK : Good result of classification of a point relative to solid" +} else { + puts "Error : Wrong result of classification of a point relative to solid" +} + +smallview +fit +set only_screen_axo 1