0025285: Wrong result of General Fuse operation for an edge and a face.
[occt.git] / src / BOPTools / BOPTools_AlgoTools2D.cxx
index 4c6d976..2c700a9 100644 (file)
@@ -323,10 +323,21 @@ void BOPTools_AlgoTools2D::AdjustPCurveOnFace
   // du
   du = 0.;
   if (aBAS.IsUPeriodic()) {
-    Standard_Real newu;
+    Standard_Real u2x;
     aUPeriod = aBAS.UPeriod(); 
     //
-    GeomInt::AdjustPeriodic(u2, UMin, UMax, aUPeriod, newu, du);
+    // A. drive u2 into the stall [Umin, Umin+aUPeriod] -> u2x
+    GeomInt::AdjustPeriodic(u2, UMin, UMax, aUPeriod, u2x, du, 0.);
+    //
+    // b. try to clarify u2 using the precision (aDelta)
+    if (fabs(u2x-UMin) < aDelta) {
+        u2=UMin;
+      }
+    else if (fabs(u2x-UMin-aUPeriod) < aDelta) {
+      u2=UMin+aUPeriod;
+    }
+    // C. compute du again using clarified value of u2
+    GeomInt::AdjustPeriodic(u2, UMin, UMax, aUPeriod, u2x, du, 0.);
     //
     if (du==0.) {
       if (aBAS.GetType()==GeomAbs_Cylinder) {