From 416022a12ff2315850442a0244f59d61888e17e0 Mon Sep 17 00:00:00 2001 From: emv Date: Wed, 27 Apr 2016 16:28:52 +0300 Subject: [PATCH] 0027441: The method IntTools_Context::IsVertexOnLine incorrectly computes parameter of the point on the curve Choosing the closest bound to the checking point. --- src/IntTools/IntTools_Context.cxx | 23 ++++++++++++++++------- tests/bugs/modalg_6/bug27441 | 16 ++++++++++++++++ 2 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 tests/bugs/modalg_6/bug27441 diff --git a/src/IntTools/IntTools_Context.cxx b/src/IntTools/IntTools_Context.cxx index 66e66cb1b1..03250f8336 100644 --- a/src/IntTools/IntTools_Context.cxx +++ b/src/IntTools/IntTools_Context.cxx @@ -840,14 +840,19 @@ Standard_Boolean IntTools_Context::IsVertexOnLine aFirst=aC3D->FirstParameter(); aLast =aC3D->LastParameter(); // - //Checking extermities first + // Checking extermities first + // It is necessary to chose the closest bound to the point + Standard_Boolean bFirstValid = Standard_False; + Standard_Real aFirstDist = Precision::Infinite(); + // if (!Precision::IsInfinite(aFirst)) { gp_Pnt aPCFirst=aC3D->Value(aFirst); - aDist=aPv.Distance(aPCFirst); - if (aDist < aTolSum) { + aFirstDist = aPv.Distance(aPCFirst); + if (aFirstDist < aTolSum) { + bFirstValid = Standard_True; aT=aFirst; // - if(aDist > aTolV) { + if (aFirstDist > aTolV) { Extrema_LocateExtPC anExt(aPv, aGAC, aFirst, 1.e-10); if(anExt.IsDone()) { @@ -889,15 +894,16 @@ Standard_Boolean IntTools_Context::IsVertexOnLine } } - // - return Standard_True; } } // - //if (!Precision::IsInfinite(aFirst)) { if (!Precision::IsInfinite(aLast)) { gp_Pnt aPCLast=aC3D->Value(aLast); aDist=aPv.Distance(aPCLast); + if (bFirstValid && (aFirstDist < aDist)) { + return Standard_True; + } + // if (aDist < aTolSum) { aT=aLast; // @@ -946,6 +952,9 @@ Standard_Boolean IntTools_Context::IsVertexOnLine return Standard_True; } } + else if (bFirstValid) { + return Standard_True; + } // GeomAPI_ProjectPointOnCurve& aProjector=ProjPT(aC3D); aProjector.Perform(aPv); diff --git a/tests/bugs/modalg_6/bug27441 b/tests/bugs/modalg_6/bug27441 new file mode 100644 index 0000000000..1489df5d68 --- /dev/null +++ b/tests/bugs/modalg_6/bug27441 @@ -0,0 +1,16 @@ +puts "============" +puts "OCC27441" +puts "============" +puts "" +############################### +## The method IntTools_ContextIsVertexOnLine incorrectly computes parameter of the point on the curve +############################### + +restore [locate_data_file bug27428_shapes.brep] b +explode b +bsection result b_1 b_2 +set bcheck [bopcheck result] +puts $bcheck +if {![regexp {This shape seems to be OK.} $bcheck]} { + puts "Error: bopcheck failed" +} -- 2.20.1