1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-09-13 14:27:08 +03:00

SENR-22-088

This commit is contained in:
ifv
2021-09-28 09:37:13 +03:00
parent c8ccbfd045
commit 0d99c9a67d

View File

@@ -480,7 +480,77 @@ void Recadre(const Standard_Boolean ,
} }
pt.SetParameters(U1,V1,U2,V2); 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 //function : Perform
//purpose : //purpose :
@@ -587,35 +657,39 @@ void IntPatch_ImpPrmIntersection::Perform (const Handle(Adaptor3d_Surface)& Surf
} }
// //
Standard_Real aLocalPas = Pas; Standard_Real aLocalPas = Pas;
GeomAbs_SurfaceType aSType = reversed ? Surf1->GetType() : Surf2->GetType(); //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) //if (aSType == GeomAbs_BezierSurface || aSType == GeomAbs_BSplineSurface)
{ //{
Standard_Real aMinRes = Precision::Infinite(); // Standard_Real aMinRes = Precision::Infinite();
GeomAbs_Shape aCont = GeomAbs_C0; // GeomAbs_Shape aCont = GeomAbs_C0;
Standard_Integer aMaxDeg = 0; // Standard_Integer aMaxDeg = 0;
const Standard_Real aLimRes = 1.e-10; // const Standard_Real aLimRes = 1.e-10;
if (reversed) // if (reversed)
{ // {
aMinRes = Min(Surf1->UResolution(Precision::Confusion()), // aMinRes = Min(Surf1->UResolution(Precision::Confusion()),
Surf1->VResolution(Precision::Confusion())); // Surf1->VResolution(Precision::Confusion()));
aCont = (GeomAbs_Shape)Min(Surf1->UContinuity(), Surf1->VContinuity()); // aCont = (GeomAbs_Shape)Min(Surf1->UContinuity(), Surf1->VContinuity());
aMaxDeg = Max(Surf1->UDegree(), Surf1->VDegree()); // aMaxDeg = Max(Surf1->UDegree(), Surf1->VDegree());
} // }
else // else
{ // {
aMinRes = Min(Surf2->UResolution(Precision::Confusion()), // aMinRes = Min(Surf2->UResolution(Precision::Confusion()),
Surf2->VResolution(Precision::Confusion())); // Surf2->VResolution(Precision::Confusion()));
aCont = (GeomAbs_Shape)Min(Surf2->UContinuity(), Surf2->VContinuity()); // aCont = (GeomAbs_Shape)Min(Surf2->UContinuity(), Surf2->VContinuity());
aMaxDeg = Max(Surf2->UDegree(), Surf2->VDegree()); // aMaxDeg = Max(Surf2->UDegree(), Surf2->VDegree());
} // }
if (aMinRes < aLimRes && aCont > GeomAbs_C0 && aMaxDeg > 3) // if (aMinRes < aLimRes && aCont > GeomAbs_C0 && aMaxDeg > 3)
{ // {
aLocalPas = Min(Pas, 0.0001); // aLocalPas = Min(Pas, 0.0001);
} // }
} //}
Func.SetImplicitSurface(Quad); Func.SetImplicitSurface(Quad);
Func.Set(IntSurf_QuadricTool::Tolerance(Quad)); Func.Set(IntSurf_QuadricTool::Tolerance(Quad));