From: PKV <> Date: Mon, 29 Aug 2011 14:01:39 +0000 (+0000) Subject: 0022241: The bug is appendix to the Salome Bug 0021148 X-Git-Tag: V6_5_2~45 X-Git-Url: http://git.dev.opencascade.org/gitweb/?p=occt.git;a=commitdiff_plain;h=093fdf5ffce77ed51286aac372933ea843ea65fe 0022241: The bug is appendix to the Salome Bug 0021148 --- diff --git a/src/Extrema/Extrema_ExtElC.cxx b/src/Extrema/Extrema_ExtElC.cxx index 2fcbc1e3de..a00a0dcc0d 100755 --- a/src/Extrema/Extrema_ExtElC.cxx +++ b/src/Extrema/Extrema_ExtElC.cxx @@ -21,16 +21,14 @@ #include #include - - -//====================================================================== +//======================================================================= +//class : ExtremaExtElC_TrigonometricRoots +//purpose : //== Classe Interne (Donne des racines classees d un polynome trigo) //== Code duplique avec IntAna_IntQuadQuad.cxx (lbr le 26 mars 98) //== Solution fiable aux problemes de coefficients proches de 0 //== avec essai de rattrapage si coeff<1.e-10 (jct le 27 avril 98) -//====================================================================== -static const Standard_Real PIpPI=Standard_PI+Standard_PI; - +//======================================================================= class ExtremaExtElC_TrigonometricRoots { private: Standard_Real Roots[4]; @@ -38,132 +36,188 @@ class ExtremaExtElC_TrigonometricRoots { Standard_Integer NbRoots; Standard_Boolean infinite_roots; public: - ExtremaExtElC_TrigonometricRoots(const Standard_Real CC - ,const Standard_Real SC - ,const Standard_Real C - ,const Standard_Real S - ,const Standard_Real Cte - ,const Standard_Real Binf - ,const Standard_Real Bsup); - - Standard_Boolean IsDone() { return(done); } - + ExtremaExtElC_TrigonometricRoots(const Standard_Real CC, + const Standard_Real SC, + const Standard_Real C, + const Standard_Real S, + const Standard_Real Cte, + const Standard_Real Binf, + const Standard_Real Bsup); + // + Standard_Boolean IsDone() { + return done; + } + // Standard_Boolean IsARoot(Standard_Real u) { + Standard_Integer i; + Standard_Real PIpPI, aEps; + // + aEps=RealEpsilon(); + PIpPI=Standard_PI+Standard_PI; for(Standard_Integer i=0 ; iNbRoots)) StdFail_NotDone::Raise(); - return(Roots[n-1]); + // + Standard_Real Value(const Standard_Integer& n) { + if((!done)||(n>NbRoots)) { + StdFail_NotDone::Raise(); + } + return Roots[n-1]; } }; -//---------------------------------------------------------------------- -ExtremaExtElC_TrigonometricRoots::ExtremaExtElC_TrigonometricRoots(const Standard_Real CC - ,const Standard_Real SC - ,const Standard_Real C - ,const Standard_Real S - ,const Standard_Real Cte - ,const Standard_Real Binf - ,const Standard_Real Bsup) { - - Standard_Integer i ; - Standard_Integer nbessai = 1; - Standard_Real cc = CC, sc = SC, c = C, s = S, cte = Cte; +//======================================================================= +//function : ExtremaExtElC_TrigonometricRoots +//purpose : +//======================================================================= +ExtremaExtElC_TrigonometricRoots:: + ExtremaExtElC_TrigonometricRoots(const Standard_Real CC, + const Standard_Real SC, + const Standard_Real C, + const Standard_Real S, + const Standard_Real Cte, + const Standard_Real Binf, + const Standard_Real Bsup) +{ + Standard_Integer i, nbessai; + Standard_Real cc ,sc, c, s, cte; + // + nbessai = 1; + cc = CC; + sc = SC; + c = C; + s = S; + cte = Cte; done=Standard_False; while (nbessai<=2 && !done) { //-- F= AA*CN*CN+2*BB*CN*SN+CC*CN+DD*SN+EE; math_TrigonometricFunctionRoots MTFR(cc,sc,c,s,cte,Binf,Bsup); + // if(MTFR.IsDone()) { done=Standard_True; if(MTFR.InfiniteRoots()) { infinite_roots=Standard_True; } - else { + else { //else #1 + Standard_Boolean Triee; + Standard_Integer j, SvNbRoots; + Standard_Real aTwoPI, aMaxCoef, aPrecision; + // + aTwoPI=PI+PI; NbRoots=MTFR.NbSolutions(); - for( i=0;i(PI+PI)) Roots[i]-=PI+PI; + if(Roots[i]<0.) { + Roots[i]=Roots[i]+aTwoPI; + } + if(Roots[i]>aTwoPI) { + Roots[i]=Roots[i]-aTwoPI; + } } - Standard_Boolean Triee; - Standard_Integer j; - //-- La recherche directe donne n importe quoi. // modified by OCC Tue Oct 3 18:41:27 2006.BEGIN - Standard_Real aMaxCoef = Max(CC,SC); + aMaxCoef = Max(CC,SC); aMaxCoef = Max(aMaxCoef,C); aMaxCoef = Max(aMaxCoef,S); aMaxCoef = Max(aMaxCoef,Cte); - const Standard_Real aPrecision = Max(1.e-8,1.e-12*aMaxCoef); + aPrecision = Max(1.e-8, 1.e-12*aMaxCoef); // modified by OCC Tue Oct 3 18:41:33 2006.END - Standard_Integer SvNbRoots=NbRoots; - for(i=0;iaPrecision) { -#ifdef DEB - printf("\n**IntAna_IntQuadQuad** Solution : %g ( %g cos2 + 2 %g cos sin + %g cos + %g sin + %g) = %g\n", - Roots[i],CC,SC,C,S,Cte,y); -#endif NbRoots--; Roots[i]=1000.0; } } - + // do { + Standard_Real t; + // Triee=Standard_True; - for(i=1,j=0;i 2) { Standard_OutOfRange::Raise(); } - } - else { - if (N < 1 || N > NbExt()) { Standard_OutOfRange::Raise(); } - } - return mySqDist[N-1]; -} -//============================================================================= - -void Extrema_ExtElC::Points (const Standard_Integer N, - Extrema_POnCurv& P1, Extrema_POnCurv& P2) const -{ - if (N < 1 || N > NbExt()) { Standard_OutOfRange::Raise(); } - P1 = myPoint[N-1][0]; - P2 = myPoint[N-1][1]; -} -//============================================================================= -//============================================================================= -// -//modified by NIZNHY-PKV Fri Nov 21 10:48:46 2008f //======================================================================= //function : Extrema_ExtElC //purpose : //======================================================================= -Extrema_ExtElC::Extrema_ExtElC (const gp_Circ& C1, const gp_Circ& C2) +Extrema_ExtElC::Extrema_ExtElC (const gp_Circ& C1, + const gp_Circ& C2) { Standard_Boolean bIsSamePlane, bIsSameAxe; Standard_Real aTolD, aTolD2, aTolA, aD2, aDC2; @@ -865,4 +846,135 @@ Extrema_ExtElC::Extrema_ExtElC (const gp_Circ& C1, const gp_Circ& C2) }// if (!bOut || !bIn) { }// else } -//modified by NIZNHY-PKV Fri Nov 21 10:48:56 2008t +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Circ&, const gp_Elips&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Circ&, const gp_Hypr&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Circ&, const gp_Parab&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Elips&, const gp_Elips&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Elips&, const gp_Hypr&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Elips&, const gp_Parab&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Hypr&, const gp_Hypr&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Hypr&, const gp_Parab&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : Extrema_ExtElC +//purpose : +//======================================================================= +Extrema_ExtElC::Extrema_ExtElC (const gp_Parab&, const gp_Parab&) +{ + Standard_NotImplemented::Raise(); +} +//======================================================================= +//function : IsDone +//purpose : +//======================================================================= +Standard_Boolean Extrema_ExtElC::IsDone () const { + return myDone; +} +//======================================================================= +//function : IsParallel +//purpose : +//======================================================================= +Standard_Boolean Extrema_ExtElC::IsParallel () const +{ + if (!IsDone()) { + StdFail_NotDone::Raise(); + } + return myIsPar; +} +//======================================================================= +//function : NbExt +//purpose : +//======================================================================= +Standard_Integer Extrema_ExtElC::NbExt () const +{ + if (IsParallel()) { + StdFail_InfiniteSolutions::Raise(); + } + return myNbExt; +} +//======================================================================= +//function : SquareDistance +//purpose : +//======================================================================= +Standard_Real Extrema_ExtElC::SquareDistance (const Standard_Integer N) const +{ + if (!myDone) { + StdFail_NotDone::Raise(); + } + if (myIsPar) { + if (N < 1 || N > 2) { + Standard_OutOfRange::Raise(); + } + } + else { + if (N < 1 || N > NbExt()) { + Standard_OutOfRange::Raise(); + } + } + return mySqDist[N-1]; +} +void Extrema_ExtElC::Points (const Standard_Integer N, + Extrema_POnCurv& P1, + Extrema_POnCurv& P2) const +{ + if (N < 1 || N > NbExt()) { + Standard_OutOfRange::Raise(); + } + P1 = myPoint[N-1][0]; + P2 = myPoint[N-1][1]; +}