// File: AppParCurves_Variational_4.gxx // Created: Tue Dec 8 12:31:51 1998 // Author: Igor FEOKTISTOV // void AppParCurves_Variational::ACR(Handle(FEmTool_Curve)& Curve, TColStd_Array1OfReal& Ti, const Standard_Integer Decima) const { const Standard_Real Eps = 1.e-8; TColStd_Array1OfReal& Knots = Curve->Knots(); Standard_Integer NbrPnt = Ti.Length(), TiFirst = Ti.Lower(), TiLast = Ti.Upper(), KFirst = Knots.Lower(), KLast = Knots.Upper(); Standard_Real CbLong, DeltaT, VTest, UNew, UOld, DU, TPara, TOld, DTInv, Ratio; Standard_Integer ipnt, ii, IElm, IOld, POld, PCnt, ICnt=0; Standard_Integer NbCntr = myNbPassPoints + myNbTangPoints + myNbCurvPoints; // (1) Calcul de la longueur de courbe Curve->Length(Ti(TiFirst), Ti(TiLast), CbLong); // (2) Mise de l'acr dans Ti if(NbrPnt >= 2) { // (2.0) Initialisation DeltaT = (Ti(TiLast) - Ti(TiFirst)) / Decima; VTest = Ti(TiFirst) + DeltaT; if(NbCntr > 0) { PCnt = myTypConstraints->Value(1) - myFirstPoint + TiFirst; ICnt = 1; } else PCnt = TiLast + 1; UOld = 0.; TOld = Ti(TiFirst); POld = TiFirst; IElm = KFirst; IOld = IElm; Ti(TiFirst) = 0.; for(ipnt = TiFirst + 1; ipnt <= TiLast; ipnt++) { while((ICnt <= NbCntr) && (PCnt < ipnt)) { ICnt++; PCnt = myTypConstraints->Value(2*ICnt-1) - myFirstPoint + TiFirst; } TPara = Ti(ipnt); if(TPara >= VTest || PCnt == ipnt) { if ( Ti(TiLast) - TPara <= 1.e-2*DeltaT) { ipnt = TiLast; TPara = Ti(ipnt); } // (2.2), (2.3) Cacul la longueur de courbe Curve->Length(Ti(TiFirst), TPara, UNew); UNew /= CbLong; while(Knots(IElm + 1) < TPara && IElm < KLast - 1) IElm++; // (2.4) Mise a jours des parametres de decoupe DTInv = 1. / (TPara - TOld); DU = UNew - UOld; for(ii = IOld+1; ii <= IElm; ii++) { Ratio = (Knots(ii) - TOld) * DTInv; Knots(ii) = UOld + Ratio * DU; } // (2.5) Mise a jours des parametres de points. //Very strange loop, because it never works (POld+1 > ipnt-1) for(ii = POld+1; ii <= ipnt-1; ii++) { Ratio = ( Ti(ii) - TOld ) * DTInv; Ti(ii) = UOld + Ratio * DU; } Ti(ipnt) = UNew; UOld = UNew; IOld = IElm; TOld = TPara; POld = ipnt; } // --> Nouveau seuil parametrique pour le decimage if(TPara >= VTest) { // ii = RealToInt((TPara - VTest + Eps) / DeltaT); // VTest += (ii + 1) * DeltaT; VTest += Ceiling((TPara - VTest + Eps) / DeltaT) * DeltaT; if(VTest > 1. - Eps) VTest = 1.; } } } // --- On ajuste les valeurs extremes Ti(TiFirst) = 0.; Ti(TiLast) = 1.; ii = TiLast - 1; while ( Ti(ii) > Knots(KLast) ) { Ti(ii) = 1.; --ii; } Knots(KFirst) = 0.; Knots(KLast) = 1.; }