]> OCCT Git - occt-copy.git/commitdiff
0025380: Intersection curve cannot reach boundary of surface
authoraml <aml@opencascade.com>
Thu, 23 Oct 2014 11:43:31 +0000 (15:43 +0400)
committeraml <aml@opencascade.com>
Thu, 23 Oct 2014 11:43:31 +0000 (15:43 +0400)
Changed next point computation in point walker. Now trying to walk over another isoline if new point is too close to previous.

src/IntWalk/IntWalk_PWalking_1.gxx

index 85e62228f8eccfa58e2bf5a6b5567477fd027647..ab35ac3f7370f76f6c9c5e8b52fb435113ec3965 100644 (file)
@@ -774,7 +774,43 @@ void IntWalk_PWalking::Perform(const TColStd_Array1OfReal& ParDep,
     SvParam[2]=Param(3);
     SvParam[3]=Param(4);
     //
-    ChoixIso= myIntersectionOn2S.Perform(Param, Rsnld, ChoixIso);                  
+    Standard_Integer aTryNumber = 0;
+    Standard_Real    isBadPoint = Standard_False;
+    IntImp_ConstIsoparametric aBestIso = ChoixIso;
+    do
+    {
+      isBadPoint = Standard_False;
+
+      ChoixIso= myIntersectionOn2S.Perform(Param, Rsnld, aBestIso);
+
+      if (myIntersectionOn2S.IsDone() && !myIntersectionOn2S.IsEmpty())
+      {
+        Standard_Real aNewPnt[4], anAbsParamDist[4];
+        myIntersectionOn2S.Point().Parameters(aNewPnt[0], aNewPnt[1], aNewPnt[2], aNewPnt[3]);
+
+        if (aNewPnt[0] < u1min || aNewPnt[0] > u1max ||
+            aNewPnt[1] < v1min || aNewPnt[1] > v1max ||
+            aNewPnt[2] < u2min || aNewPnt[2] > u2max ||
+            aNewPnt[3] < v2min || aNewPnt[3] > v2max)
+        {
+          break; // Out of borders, handle this later.
+        }
+
+        anAbsParamDist[0] = Abs(Param(1) - dP1 - aNewPnt[0]);
+        anAbsParamDist[1] = Abs(Param(2) - dP2 - aNewPnt[1]);
+        anAbsParamDist[2] = Abs(Param(3) - dP3 - aNewPnt[2]);
+        anAbsParamDist[3] = Abs(Param(4) - dP4 - aNewPnt[3]);
+        if (anAbsParamDist[0] < ResoU1 &&
+            anAbsParamDist[1] < ResoV1 &&
+            anAbsParamDist[2] < ResoU2 &&
+            anAbsParamDist[3] < ResoV2 &&
+            Status != IntWalk_PasTropGrand)
+        {
+          isBadPoint = Standard_True;
+          aBestIso = IntImp_ConstIsoparametric((aBestIso + 1) % 4);
+        }
+      }
+    } while (isBadPoint && ++aTryNumber <= 4);
     //
     if (!myIntersectionOn2S.IsDone())
     {