1 // File: AppParCurves_Variational_3.gxx
2 // Created: Tue Dec 8 09:08:54 1998
3 // Author: Igor FEOKTISTOV
4 // <ifv@paradox.nnov.matra-dtv.fr>
8 void AppParCurves_Variational::Project(const Handle(FEmTool_Curve)& C,
9 const TColStd_Array1OfReal& Ti,
10 TColStd_Array1OfReal& ProjTi,
11 TColStd_Array1OfReal& Distance,
12 Standard_Integer& NumPoints,
13 Standard_Real& MaxErr,
14 Standard_Real& QuaErr,
15 Standard_Real& AveErr,
16 const Standard_Integer NbIterations) const
21 const Standard_Real Seuil = 1.e-9, Eps = 1.e-12;
23 MaxErr = QuaErr = AveErr = 0.;
25 Standard_Integer Ipnt, NItCv, Iter, i, i0 = -myDimension, d0 = Distance.Lower() - 1;
27 Standard_Real TNew, Dist, T0, Dist0, F1, F2, Aux, DF, Ecart;
29 Standard_Boolean EnCour;
31 TColStd_Array1OfReal ValOfC(1, myDimension), FirstDerOfC(1, myDimension),
32 SecndDerOfC(1, myDimension);
34 for(Ipnt = 1; Ipnt <= ProjTi.Length(); Ipnt++) {
40 EnCour = Standard_True;
46 for(i = 1; i <= myDimension; i++) {
47 Aux = ValOfC(i) - myTabPoints->Value(i0 + i);
52 // ------- Newton's method for solving (C'(t),C(t) - P) = 0
60 C->D2(TNew, SecndDerOfC);
61 C->D1(TNew, FirstDerOfC);
64 for(i = 1; i <= myDimension; i++) {
65 Aux = ValOfC(i) - myTabPoints->Value(i0 + i);
67 F1 += Aux*DF; // (C'(t),C(t) - P)
68 F2 += DF*DF + Aux * SecndDerOfC(i); // ((C'(t),C(t) - P))'
72 EnCour = Standard_False;
74 // Formula of Newton x(k+1) = x(k) - F(x(k))/F'(x(k))
76 if(TNew < 0.) TNew = 0.;
77 if(TNew > 1.) TNew = 1.;
85 for(i = 1; i <= myDimension; i++) {
86 Aux = ValOfC(i) - myTabPoints->Value(i0 + i);
94 // Pas d'amelioration on s'arrete
95 EnCour = Standard_False;
99 else if(Ecart <= Seuil)
105 if((NItCv >= 2) || (Iter >= NbIterations)) EnCour = Standard_False;
112 Distance(d0 + Ipnt) = Dist;
117 QuaErr += Dist * Dist;
121 NumPoints = NumPoints + myFirstPoint - 1;// Setting NumPoints to interval [myFirstPoint, myLastPoint]