mirror of
https://git.dev.opencascade.org/repos/occt.git
synced 2025-04-05 18:16:23 +03:00
0023218: Wrong value of tolerance for the intersection curve.
This commit is contained in:
parent
60be1f9b1d
commit
37b6f43954
@ -308,6 +308,19 @@ static
|
|||||||
const TopoDS_Face& aF2,
|
const TopoDS_Face& aF2,
|
||||||
const Handle(IntTools_Context)& aCtx);
|
const Handle(IntTools_Context)& aCtx);
|
||||||
//
|
//
|
||||||
|
static
|
||||||
|
Standard_Real FindMaxSquareDistance (const Standard_Real aA,
|
||||||
|
const Standard_Real aB,
|
||||||
|
const Standard_Real aEps,
|
||||||
|
const Handle(Geom_Curve)& aC3D,
|
||||||
|
const Handle(Geom2d_Curve)& aC2D1,
|
||||||
|
const Handle(Geom2d_Curve)& aC2D2,
|
||||||
|
const Handle(GeomAdaptor_HSurface) myHS1,
|
||||||
|
const Handle(GeomAdaptor_HSurface) myHS2,
|
||||||
|
const TopoDS_Face& aF1,
|
||||||
|
const TopoDS_Face& aF2,
|
||||||
|
const Handle(IntTools_Context)& aCtx);
|
||||||
|
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function :
|
//function :
|
||||||
//purpose :
|
//purpose :
|
||||||
@ -731,6 +744,10 @@ void IntTools_FaceFace::SetList(IntSurf_ListOfPntOn2S& aListOfPnts)
|
|||||||
GeomAbs_SurfaceType aType1, aType2;
|
GeomAbs_SurfaceType aType1, aType2;
|
||||||
//
|
//
|
||||||
aNbLin=myIntersector.NbLines();
|
aNbLin=myIntersector.NbLines();
|
||||||
|
if (!aNbLin) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
//
|
||||||
aType1=myHS1->Surface().GetType();
|
aType1=myHS1->Surface().GetType();
|
||||||
aType2=myHS2->Surface().GetType();
|
aType2=myHS2->Surface().GetType();
|
||||||
//
|
//
|
||||||
@ -761,13 +778,11 @@ void IntTools_FaceFace::SetList(IntSurf_ListOfPntOn2S& aListOfPnts)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
//ZZ
|
//ZZ
|
||||||
|
if (aNbLin) {// Check the distances
|
||||||
{// Check the distances
|
Standard_Integer i, aNbP, j ;
|
||||||
Standard_Integer i, j, aNbP;
|
Standard_Real aT, aT1, aT2, dT, aD2, aD2Max, aEps, aT11, aT12;
|
||||||
Standard_Real aT, aT1, aT2, dT, aD2, aD2Max;
|
|
||||||
//
|
//
|
||||||
aD2Max=0.;
|
aD2Max=0.;
|
||||||
aNbP=11;
|
|
||||||
aNbLin=mySeqOfCurve.Length();
|
aNbLin=mySeqOfCurve.Length();
|
||||||
//
|
//
|
||||||
for (i=1; i<=aNbLin; ++i) {
|
for (i=1; i<=aNbLin; ++i) {
|
||||||
@ -788,22 +803,22 @@ void IntTools_FaceFace::SetList(IntSurf_ListOfPntOn2S& aListOfPnts)
|
|||||||
aT1=aBC->FirstParameter();
|
aT1=aBC->FirstParameter();
|
||||||
aT2=aBC->LastParameter();
|
aT2=aBC->LastParameter();
|
||||||
//
|
//
|
||||||
aNbP--;
|
aEps=0.01*(aT2-aT1);
|
||||||
|
aNbP=10;
|
||||||
dT=(aT2-aT1)/aNbP;
|
dT=(aT2-aT1)/aNbP;
|
||||||
//modified by NIZNHY-PKV Tue Apr 17 14:36:33 2012f
|
|
||||||
for (j=1; j<aNbP; ++j) {
|
for (j=1; j<aNbP; ++j) {
|
||||||
aT=aT1+j*dT;
|
aT11=aT1+j*dT;
|
||||||
aD2=MaxSquareDistance(aT, aC3D, aC2D1, aC2D2,
|
aT12=aT11+dT;
|
||||||
myHS1, myHS2, myFace1, myFace2, myContext);
|
aD2=FindMaxSquareDistance(aT11, aT12, aEps, aC3D, aC2D1, aC2D2,
|
||||||
|
myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
if (aD2>aD2Max) {
|
if (aD2>aD2Max) {
|
||||||
aD2Max=aD2;
|
aD2Max=aD2;
|
||||||
}
|
}
|
||||||
}//for (j=0; j<aNbP; ++j) {
|
}
|
||||||
}//for (i=1; i<=aNbLin; ++i) {
|
}//for (i=1; i<=aNbLin; ++i) {
|
||||||
//
|
//
|
||||||
myTolReached3d=sqrt(aD2Max);
|
myTolReached3d=sqrt(aD2Max);
|
||||||
}
|
}// if (aNbLin)
|
||||||
|
|
||||||
}// if (aType1==GeomAbs_Cylinder && aType2==GeomAbs_Cylinder) {
|
}// if (aType1==GeomAbs_Cylinder && aType2==GeomAbs_Cylinder) {
|
||||||
//
|
//
|
||||||
//904/G3 f
|
//904/G3 f
|
||||||
@ -955,6 +970,7 @@ void IntTools_FaceFace::SetList(IntSurf_ListOfPntOn2S& aListOfPnts)
|
|||||||
aD2max=aD2;
|
aD2max=aD2;
|
||||||
}
|
}
|
||||||
}//for (j=0; j<aNbP; ++j) {
|
}//for (j=0; j<aNbP; ++j) {
|
||||||
|
|
||||||
}//for (i=1; i<=aNbLin; ++i) {
|
}//for (i=1; i<=aNbLin; ++i) {
|
||||||
//
|
//
|
||||||
aD2=myTolReached3d*myTolReached3d;
|
aD2=myTolReached3d*myTolReached3d;
|
||||||
@ -4650,7 +4666,63 @@ void RefineVector(gp_Vec2d& aV2D)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
aV2D.SetCoord(aC[0], aC[1]);
|
aV2D.SetCoord(aC[0], aC[1]);
|
||||||
}
|
}
|
||||||
|
//=======================================================================
|
||||||
|
//function : FindMaxSquareDistance
|
||||||
|
//purpose :
|
||||||
|
//=======================================================================
|
||||||
|
Standard_Real FindMaxSquareDistance (const Standard_Real aT1,
|
||||||
|
const Standard_Real aT2,
|
||||||
|
const Standard_Real aEps,
|
||||||
|
const Handle(Geom_Curve)& aC3D,
|
||||||
|
const Handle(Geom2d_Curve)& aC2D1,
|
||||||
|
const Handle(Geom2d_Curve)& aC2D2,
|
||||||
|
const Handle(GeomAdaptor_HSurface) myHS1,
|
||||||
|
const Handle(GeomAdaptor_HSurface) myHS2,
|
||||||
|
const TopoDS_Face& myFace1,
|
||||||
|
const TopoDS_Face& myFace2,
|
||||||
|
const Handle(IntTools_Context)& myContext)
|
||||||
|
{
|
||||||
|
Standard_Real aA, aB, aCf, aX1, aX2, aF1, aF2, aX, aF;
|
||||||
|
//
|
||||||
|
aCf=1.6180339887498948482045868343656;// =0.5*(1.+sqrt(5.));
|
||||||
|
aA=aT1;
|
||||||
|
aB=aT2;
|
||||||
|
aX1=aB-(aB-aA)/aCf;
|
||||||
|
aF1=MaxSquareDistance(aX1,
|
||||||
|
aC3D, aC2D1, aC2D2, myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
|
aX2=aA+(aB-aA)/aCf;
|
||||||
|
aF2=MaxSquareDistance(aX2,
|
||||||
|
aC3D, aC2D1, aC2D2, myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
|
//
|
||||||
|
while(1) {
|
||||||
|
//
|
||||||
|
if (fabs(aA-aB)<aEps) {
|
||||||
|
aX=0.5*(aA+aB);
|
||||||
|
aF=MaxSquareDistance(aX,
|
||||||
|
aC3D, aC2D1, aC2D2, myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (aF1<aF2){
|
||||||
|
aA=aX1;
|
||||||
|
aX1=aX2;
|
||||||
|
aF1=aF2;
|
||||||
|
aX2=aA+(aB-aA)/aCf;
|
||||||
|
aF2=MaxSquareDistance(aX2,
|
||||||
|
aC3D, aC2D1, aC2D2, myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
|
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
aB=aX2;
|
||||||
|
aX2=aX1;
|
||||||
|
aF2=aF1;
|
||||||
|
aX1=aB-(aB-aA)/aCf;
|
||||||
|
aF1=MaxSquareDistance(aX1,
|
||||||
|
aC3D, aC2D1, aC2D2, myHS1, myHS2, myFace1, myFace2, myContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return aF;
|
||||||
|
}
|
||||||
//=======================================================================
|
//=======================================================================
|
||||||
//function : MaxSquareDistance
|
//function : MaxSquareDistance
|
||||||
//purpose :
|
//purpose :
|
||||||
|
Loading…
x
Reference in New Issue
Block a user