From a4eda038a8b27d9d55a193ebe1d230776b8591aa Mon Sep 17 00:00:00 2001 From: maxsson Date: Wed, 27 Feb 2019 13:39:26 +0300 Subject: [PATCH] 0030217: Intersection between a circle and a line not detected WHEN TANGENT * 2D intersector takes into account the given tolerance when intersects line with circle. * Extrema curve-curve executes parametric branch in case of analytical has given zero solutions. * Command 'intersect' has been improved to show additional information about the area of tangency (start and end parameters on each curve). --- src/Extrema/Extrema_ExtCC.cxx | 9 ++++-- .../GeomliteTest_API2dCommands.cxx | 2 ++ src/IntCurve/IntCurve_IntConicConic_1.cxx | 5 ++-- tests/bugs/modalg_7/bug30217_1 | 29 +++++++++++++++++++ tests/bugs/modalg_7/bug30217_2 | 27 +++++++++++++++++ 5 files changed, 67 insertions(+), 5 deletions(-) create mode 100644 tests/bugs/modalg_7/bug30217_1 create mode 100644 tests/bugs/modalg_7/bug30217_2 diff --git a/src/Extrema/Extrema_ExtCC.cxx b/src/Extrema/Extrema_ExtCC.cxx index da1d0007be..7ee612f23c 100644 --- a/src/Extrema/Extrema_ExtCC.cxx +++ b/src/Extrema/Extrema_ExtCC.cxx @@ -249,6 +249,9 @@ void Extrema_ExtCC::Perform() } default: break; } + if (mypoints.Size() == 0) { + myDone = Standard_False; + } } else if (type1 == GeomAbs_Circle && type2 == GeomAbs_Circle) { //analytical case - two circles Standard_Boolean bIsDone; @@ -258,10 +261,10 @@ void Extrema_ExtCC::Perform() PrepareResults(CCXtrem, Standard_False, U11, U12, U21, U22); } else { - myECC.Perform(); - PrepareResults(myECC, U11, U12, U21, U22); + myDone = Standard_False; } - } else { + } + if(!myDone){ myECC.Perform(); PrepareResults(myECC, U11, U12, U21, U22); } diff --git a/src/GeomliteTest/GeomliteTest_API2dCommands.cxx b/src/GeomliteTest/GeomliteTest_API2dCommands.cxx index 89e5f30bea..829bc60432 100644 --- a/src/GeomliteTest/GeomliteTest_API2dCommands.cxx +++ b/src/GeomliteTest/GeomliteTest_API2dCommands.cxx @@ -385,6 +385,8 @@ static Standard_Integer intersect(Draw_Interpretor& di, Standard_Integer n, cons for (Standard_Integer i = 1; i <= aNbSegments; i++) { di << "Segment #" << i << " found.\n"; + di << "Curve 1 first parameter:" << S1->FirstParameter() << " last parameter: " << S1->LastParameter() <<"\n"; + di << "Curve 2 first parameter:" << S2->FirstParameter() << " last parameter: " << S2->LastParameter() << "\n"; Intersector.Segment(i,S1,S2); CD = new DrawTrSurf_Curve2d(S1, Draw_bleu, 30); dout << CD; diff --git a/src/IntCurve/IntCurve_IntConicConic_1.cxx b/src/IntCurve/IntCurve_IntConicConic_1.cxx index c5734ae2b8..4852ae1e7e 100644 --- a/src/IntCurve/IntCurve_IntConicConic_1.cxx +++ b/src/IntCurve/IntCurve_IntConicConic_1.cxx @@ -397,6 +397,7 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line, Standard_Real dO1O2=Line.Distance(Circle.Location()); Standard_Real R=Circle.Radius(); Standard_Real RmTol=R-Tol; + Standard_Real RpTol = R + Tol; Standard_Real binf1,binf2=0,bsup1,bsup2=0; //---------------------------------------------------------------- @@ -430,7 +431,7 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line, if(dO1O2 > RmTol && !b2Sol) { //if(dO1O2 > RmTol) { Standard_Real dx=dO1O2; - Standard_Real dy=0.0; //(RpTol*RpTol-dx*dx); //Patch !!! + Standard_Real dy = RpTol*RpTol - dx*dx;; //(RpTol*RpTol-dx*dx); //Patch !!! dy=(dy>=0.0)? Sqrt(dy) : 0.0; dAlpha1=ATan2(dy,dx); @@ -444,7 +445,7 @@ void LineCircleGeometricIntersection(const gp_Lin2d& Line, else { //------------------- Intersection Line Circle+ -------------------------- Standard_Real dx=dO1O2; - Standard_Real dy=R*R-dx*dx; //(RpTol*RpTol-dx*dx); //Patch !!! + Standard_Real dy = RpTol*RpTol - dx*dx; //(RpTol*RpTol-dx*dx); //Patch !!! dy=(dy>=0.0)? Sqrt(dy) : 0.0; dAlpha1=ATan2(dy,dx); diff --git a/tests/bugs/modalg_7/bug30217_1 b/tests/bugs/modalg_7/bug30217_1 new file mode 100644 index 0000000000..3786d25900 --- /dev/null +++ b/tests/bugs/modalg_7/bug30217_1 @@ -0,0 +1,29 @@ +puts "============" +puts "OCC30217" +puts "============" +puts "" +######################################################################### +# Intersection between a circle and a line not detected (2d) +######################################################################### + +2ddrseg s2 -80.461134694338 53.07587187722 -31.501464018476 67.029737602069 +circle c2 -18.339655323916 20.849340929486 48.019394466707 +# Set tolerance. +set tol_abs 1.0e-7 +set tol_rel 1.0e-2 + +# Set reference data. +set param11 1.8484218380721342 +set param12 1.8484627151687805 +set param21 50.908401295062035 +set param22 1.8484627151687805 + +set info [2dintersect c2 s2 -tol 1e-8] +regexp {Curve 1 first parameter: +([-0-9.+eE]+) last parameter: +([-0-9.+eE]+)} ${info} full curve1p1 curve1p2 +regexp {Curve 2 first parameter: +([-0-9.+eE]+) last parameter: +([-0-9.+eE]+)} ${info} full curve2p1 curve2p2 + +checkreal "Curve 1 param 1" ${curve1p1} ${param11} ${tol_abs} ${tol_rel} +checkreal "Curve 1 param 2" ${curve1p2} ${param12} ${tol_abs} ${tol_rel} + +checkreal "Curve 2 param 1" ${curve2p1} ${param21} ${tol_abs} ${tol_rel} +checkreal "Curve 2 param 2" ${curve2p2} ${param22} ${tol_abs} ${tol_rel} \ No newline at end of file diff --git a/tests/bugs/modalg_7/bug30217_2 b/tests/bugs/modalg_7/bug30217_2 new file mode 100644 index 0000000000..de0be97d93 --- /dev/null +++ b/tests/bugs/modalg_7/bug30217_2 @@ -0,0 +1,27 @@ +puts "============" +puts "OCC30217_1" +puts "============" +puts "" +######################################################################### +# Intersection between a circle and a line not detected (3d) +######################################################################### +set tol_abs 2.e-7 + +drseg s -80.461134694338 53.07587187722 0.0 -31.501464018476 67.029737602069 0.0 +circle c -18.339655323916 20.849340929486 0.0 48.019394466707 +set info1 [extrema c s] + +if {[regexp "ext" ${info1}] != 1} { + puts "Error : No intersection detected" +} else { + puts "OK: Intersection are detected" +} + +# Distance check +set info2 [dump ext_1] +regexp "Parameters : 0 +(\[-0-9*\.+eE\]+)" $info2 full extLength +if { ${extLength} > $tol_abs } { + puts "Error: bad distance poins obtained" +} else { + puts "OK: good distance between obtained points" +} \ No newline at end of file -- 2.39.5