0027441: The method IntTools_Context::IsVertexOnLine incorrectly computes parameter...
authoremv <emv@opencascade.com>
Wed, 27 Apr 2016 13:28:52 +0000 (16:28 +0300)
committerapn <apn@opencascade.com>
Thu, 3 Nov 2016 11:15:39 +0000 (14:15 +0300)
Choosing the closest bound to the checking point.

src/IntTools/IntTools_Context.cxx
tests/bugs/modalg_6/bug27441 [new file with mode: 0644]

index 66e66cb..03250f8 100644 (file)
@@ -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 (file)
index 0000000..1489df5
--- /dev/null
@@ -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"
+}