1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-05-21 10:55:33 +03:00

0025321: Test case bugs/modalg_5(010)/bug24981 hangs in Debug mode on Debian60-64 platform

Eliminated possible inifite loop when projecting curve on surface.
This commit is contained in:
aml 2014-10-31 15:23:24 +03:00 committed by bugmaster
parent eb7404bf16
commit 7da00517d4

View File

@ -95,9 +95,11 @@ void Approx_ComputeCLine::Perform(const MultiLine& Line)
Standard_Real myfirstU = UFirst; Standard_Real myfirstU = UFirst;
Standard_Real mylastU = ULast; Standard_Real mylastU = ULast;
if (!mycut) { if (!mycut)
{
alldone = Compute(Line, UFirst, ULast, thetol3d, thetol2d); alldone = Compute(Line, UFirst, ULast, thetol3d, thetol2d);
if (!alldone) { if (!alldone)
{
tolreached = Standard_False; tolreached = Standard_False;
myfirstparam.Append(UFirst); myfirstparam.Append(UFirst);
mylastparam.Append(ULast); mylastparam.Append(ULast);
@ -106,70 +108,69 @@ void Approx_ComputeCLine::Perform(const MultiLine& Line)
Tolers2d.Append(currenttol2d); Tolers2d.Append(currenttol2d);
} }
} }
else { else
{
// previous decision to be taken if we get worse with next cut (eap) // previous decision to be taken if we get worse with next cut (eap)
AppParCurves_MultiCurve KeptMultiCurve; AppParCurves_MultiCurve KeptMultiCurve;
Standard_Real KeptUfirst = 0., KeptUlast = 0., KeptT3d = RealLast(), KeptT2d = 0.; Standard_Real KeptUfirst = 0., KeptUlast = 0., KeptT3d = RealLast(), KeptT2d = 0.;
Standard_Integer NbWorseDecis = 0, NbAllowedBadDecis = 10;
while (!Finish) { while (!Finish)
{
// Gestion du decoupage de la multiline pour approximer: // Gestion du decoupage de la multiline pour approximer:
if (!begin) { if (!begin)
if (Ok) { {
// Calcul de la partie a approximer. if (Ok)
myfirstU = mylastU; {
mylastU = ULast; // Calcul de la partie a approximer.
if (Abs(ULast-myfirstU) <= RealEpsilon()) { myfirstU = mylastU;
Finish = Standard_True; mylastU = ULast;
alldone = Standard_True; if (Abs(ULast-myfirstU) <= RealEpsilon())
return; {
} Finish = Standard_True;
KeptT3d = RealLast(); KeptT2d = 0; alldone = Standard_True;
NbWorseDecis = 0; return;
} }
else { KeptT3d = RealLast(); KeptT2d = 0;
// keep best decison KeptUfirst = myfirstU;
if ((thetol3d + thetol2d) < (KeptT3d + KeptT2d)) { KeptUlast = mylastU;
KeptMultiCurve = TheMultiCurve; }
KeptUfirst = myfirstU; else
KeptUlast = mylastU; {
KeptT3d = thetol3d; // keep best decison
KeptT2d = thetol2d; if ((thetol3d + thetol2d) < (KeptT3d + KeptT2d))
} {
KeptMultiCurve = TheMultiCurve;
// cut an interval KeptUfirst = myfirstU;
mylastU = (myfirstU + mylastU)/2; KeptUlast = mylastU;
} KeptT3d = thetol3d;
KeptT2d = thetol2d;
}
// cut an interval
mylastU = (myfirstU + mylastU)/2;
}
} }
if (Abs(myfirstU-mylastU) <= TolU) /*break;*/ // pour ne pas planter
NbAllowedBadDecis /= 2; // la station.
// Calcul des parametres sur ce nouvel intervalle. // Calcul des parametres sur ce nouvel intervalle.
Ok = Compute(Line, myfirstU, mylastU, thetol3d, thetol2d); Ok = Compute(Line, myfirstU, mylastU, thetol3d, thetol2d);
//cout << myfirstU << " - " << mylastU << " tol : " << thetol3d << " " << thetol2d << endl; //cout << myfirstU << " - " << mylastU << " tol : " << thetol3d << " " << thetol2d << endl;
// is new decision better? // is new decision better?
if ( !Ok && (thetol3d + thetol2d) > (KeptT3d + KeptT2d) ) if (!Ok && Abs(myfirstU-mylastU) <= TolU)
{ {
NbWorseDecis++; Ok = Standard_True; // stop interval cutting, approx the rest part
mylastU = KeptUlast;
if (NbWorseDecis > NbAllowedBadDecis) { tolreached = Standard_False; // helas
myMultiCurves.Append(KeptMultiCurve);
Ok = Standard_True; // stop interval cutting, approx the rest part Tolers3d.Append (KeptT3d);
mylastU = KeptUlast; Tolers2d.Append (KeptT2d);
myfirstparam.Append (KeptUfirst);
tolreached = Standard_False; // helas mylastparam.Append (KeptUlast);
myMultiCurves.Append(KeptMultiCurve); }
Tolers3d.Append (KeptT3d);
Tolers2d.Append (KeptT2d);
myfirstparam.Append (KeptUfirst);
mylastparam.Append (KeptUlast);
}
}
begin = Standard_False; begin = Standard_False;
} // while (!Finish) } // while (!Finish)