From: ifv Date: Tue, 28 Sep 2021 06:37:13 +0000 (+0300) Subject: SENR-22-088 X-Git-Url: http://git.dev.opencascade.org/gitweb/?a=commitdiff_plain;h=0d99c9a67d6d3710af9e2170c38d3346f0df3928;p=occt.git SENR-22-088 --- diff --git a/src/IntPatch/IntPatch_ImpPrmIntersection.cxx b/src/IntPatch/IntPatch_ImpPrmIntersection.cxx index 320af323b3..285a7e598c 100644 --- a/src/IntPatch/IntPatch_ImpPrmIntersection.cxx +++ b/src/IntPatch/IntPatch_ImpPrmIntersection.cxx @@ -480,7 +480,77 @@ void Recadre(const Standard_Boolean , } pt.SetParameters(U1,V1,U2,V2); } +static Standard_Real GetLocalStep(const Handle(Adaptor3d_Surface)& theSurf, + const Standard_Real theStep) +{ + Standard_Real aLocalStep = theStep; + if (theSurf->UContinuity() > GeomAbs_C0 && theSurf->VContinuity() > GeomAbs_C0) + { + GeomAbs_SurfaceType aSType = theSurf->GetType(); + + if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface) + { + Standard_Real aMinRes = Precision::Infinite(); + Standard_Integer aMaxDeg = 0; + const Standard_Real aLimRes = 1.e-10; + + aMinRes = Min(theSurf->UResolution(Precision::Confusion()), + theSurf->VResolution(Precision::Confusion())); + aMaxDeg = Max(theSurf->UDegree(), theSurf->VDegree()); + if (aMinRes < aLimRes && aMaxDeg > 3) + { + aLocalStep = 0.0001; + } + } + } + if (theSurf->UContinuity() == GeomAbs_C0) + { + Standard_Integer aNbInt = theSurf->NbUIntervals(GeomAbs_C1); + if (aNbInt > 1) + { + TColStd_Array1OfReal anInts(1, aNbInt + 1); + theSurf->UIntervals(anInts, GeomAbs_C1); + Standard_Integer i; + Standard_Real aMinInt = Precision::Infinite(); + for (i = 1; i <= aNbInt; ++i) + { + aMinInt = Min(aMinInt, anInts(i + 1) - anInts(i)); + } + + aMinInt /= theSurf->LastUParameter() - theSurf->FirstUParameter(); + if (aMinInt < 0.002) + { + aLocalStep = 0.0001; + } + } + + } + + if (theSurf->VContinuity() == GeomAbs_C0) + { + Standard_Integer aNbInt = theSurf->NbVIntervals(GeomAbs_C1); + if (aNbInt > 1) + { + TColStd_Array1OfReal anInts(1, aNbInt + 1); + theSurf->VIntervals(anInts, GeomAbs_C1); + Standard_Integer i; + Standard_Real aMinInt = Precision::Infinite(); + for (i = 1; i <= aNbInt; ++i) + { + aMinInt = Min(aMinInt, anInts(i + 1) - anInts(i)); + } + aMinInt /= theSurf->LastVParameter() - theSurf->FirstVParameter(); + if (aMinInt < 0.002) + { + aLocalStep = 0.0001; + } + } + } + + aLocalStep = Min(theStep, aLocalStep); + return aLocalStep; +} //======================================================================= //function : Perform //purpose : @@ -587,35 +657,39 @@ void IntPatch_ImpPrmIntersection::Perform (const Handle(Adaptor3d_Surface)& Surf } // Standard_Real aLocalPas = Pas; - GeomAbs_SurfaceType aSType = reversed ? Surf1->GetType() : Surf2->GetType(); - - if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface) - { - Standard_Real aMinRes = Precision::Infinite(); - GeomAbs_Shape aCont = GeomAbs_C0; - Standard_Integer aMaxDeg = 0; - const Standard_Real aLimRes = 1.e-10; - - if (reversed) - { - aMinRes = Min(Surf1->UResolution(Precision::Confusion()), - Surf1->VResolution(Precision::Confusion())); - aCont = (GeomAbs_Shape)Min(Surf1->UContinuity(), Surf1->VContinuity()); - aMaxDeg = Max(Surf1->UDegree(), Surf1->VDegree()); - } - else - { - aMinRes = Min(Surf2->UResolution(Precision::Confusion()), - Surf2->VResolution(Precision::Confusion())); - aCont = (GeomAbs_Shape)Min(Surf2->UContinuity(), Surf2->VContinuity()); - aMaxDeg = Max(Surf2->UDegree(), Surf2->VDegree()); - } - - if (aMinRes < aLimRes && aCont > GeomAbs_C0 && aMaxDeg > 3) - { - aLocalPas = Min(Pas, 0.0001); - } - } + //GeomAbs_SurfaceType aSType = reversed ? Surf1->GetType() : Surf2->GetType(); + if (reversed) + aLocalPas = GetLocalStep(Surf1, Pas); + else + aLocalPas = GetLocalStep(Surf2, Pas); + + //if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface) + //{ + // Standard_Real aMinRes = Precision::Infinite(); + // GeomAbs_Shape aCont = GeomAbs_C0; + // Standard_Integer aMaxDeg = 0; + // const Standard_Real aLimRes = 1.e-10; + + // if (reversed) + // { + // aMinRes = Min(Surf1->UResolution(Precision::Confusion()), + // Surf1->VResolution(Precision::Confusion())); + // aCont = (GeomAbs_Shape)Min(Surf1->UContinuity(), Surf1->VContinuity()); + // aMaxDeg = Max(Surf1->UDegree(), Surf1->VDegree()); + // } + // else + // { + // aMinRes = Min(Surf2->UResolution(Precision::Confusion()), + // Surf2->VResolution(Precision::Confusion())); + // aCont = (GeomAbs_Shape)Min(Surf2->UContinuity(), Surf2->VContinuity()); + // aMaxDeg = Max(Surf2->UDegree(), Surf2->VDegree()); + // } + + // if (aMinRes < aLimRes && aCont > GeomAbs_C0 && aMaxDeg > 3) + // { + // aLocalPas = Min(Pas, 0.0001); + // } + //} Func.SetImplicitSurface(Quad); Func.Set(IntSurf_QuadricTool::Tolerance(Quad));