1 //Modified by MPS : 21-05-97 PRO 7598
2 // Le nombre de solutions rendu est mySqDist.Length() et non
4 // ajout des valeurs absolues dans le test d'orthogonalite de
7 /*-----------------------------------------------------------------------------
8 Fonctions permettant de rechercher une distance extremale entre 2 courbes
9 C1 et C2 (en partant de points approches C1(u0) et C2(v0)).
10 Cette classe herite de math_FunctionSetWithDerivatives et est utilisee par
11 l'algorithme math_FunctionSetRoot.
12 Si on note Du et Dv, les derivees en u et v, les 2 fonctions a annuler sont:
13 { F1(u,v) = (C2(v)-C1(u)).Du(u)/||Du|| }
14 { F2(u,v) = (C2(v)-C1(u)).Dv(v)||Dv|| }
15 Si on note Duu et Dvv, les derivees secondes de C1 et C2, les derivees de F1
17 { Duf1(u,v) = -||Du|| + C1C2.Duu/||Du||- F1(u,v)*Duu*Du/||Du||**2
18 { Dvf1(u,v) = Dv.Du/||Du||
19 { Duf2(u,v) = -Du.Dv/||Dv||
20 { Dvf2(u,v) = ||Dv|| + C2C1.Dvv/||Dv||- F2(u,v)*Dv*Dvv/||Dv||**2
22 ----------------------------------------------------------------------------*/
23 //=============================================================================
28 Extrema_FuncExtCC::Extrema_FuncExtCC(const Standard_Real thetol) : myC1 (0), myC2 (0), myTol (thetol)
32 Extrema_FuncExtCC::Extrema_FuncExtCC (const Curve1& C1,
34 const Standard_Real thetol) :
35 myC1 ((Standard_Address)&C1), myC2 ((Standard_Address)&C2),
40 Standard_Boolean Extrema_FuncExtCC::Value (const math_Vector& UV,
48 Tool1::D1(*((Curve1*)myC1), myU,myP1,Du);
49 Tool2::D1(*((Curve2*)myC2), myV,myP2,Dv);
52 Standard_Real Ndu = Du.Magnitude();
55 P1 = Tool1::Value(*((Curve1*)myC1), myU-delta);
56 P2 = Tool1::Value(*((Curve1*)myC1), myU+delta);
61 return Standard_False;
65 Standard_Real Ndv = Dv.Magnitude();
67 // Traitement des singularite, on approche la Tangente
70 P1 = Tool2::Value(*((Curve2*)myC2), myV-delta);
71 P2 = Tool2::Value(*((Curve2*)myC2), myV+delta);
76 return Standard_False;
80 F(1) = P1P2.Dot(Du)/Ndu;
81 F(2) = P1P2.Dot(Dv)/Ndv;
84 //=============================================================================
86 Standard_Boolean Extrema_FuncExtCC::Derivatives (const math_Vector& UV,
90 return Values(UV,F,Df);
92 //=============================================================================
94 Standard_Boolean Extrema_FuncExtCC::Values (const math_Vector& UV,
100 Vec Du, Dv, Duu, Dvv;
101 Tool1::D2(*((Curve1*)myC1), myU,myP1,Du,Duu);
102 Tool2::D2(*((Curve2*)myC2), myV,myP2,Dv,Dvv);
104 Vec P1P2 (myP1,myP2);
106 Standard_Real Ndu = Du.Magnitude();
110 Tool1::D1(*((Curve1*)myC1),myU+delta, P2, Duu);
111 Tool1::D1(*((Curve1*)myC1),myU-delta, P1, V1);
115 Ndu = Du.Magnitude();
117 return Standard_False;
121 Standard_Real Ndv = Dv.Magnitude();
125 Tool2::D1(*((Curve2*)myC2),myV+delta, P2, Dvv);
126 Tool2::D1(*((Curve2*)myC2),myV-delta, P1, V1);
130 Ndv = Dv.Magnitude();
132 return Standard_False;
136 F(1) = P1P2.Dot(Du)/Ndu;
137 F(2) = P1P2.Dot(Dv)/Ndv;
139 Df(1,1) = - Ndu + (P1P2.Dot(Duu)/Ndu) - F(1)*(Du.Dot(Duu)/(Ndu*Ndu));
140 Df(1,2) = Dv.Dot(Du)/Ndu;
141 Df(2,1) = -Du.Dot(Dv)/Ndv;
142 Df(2,2) = Ndv + (P1P2.Dot(Dvv)/Ndv) - F(2)*(Dv.Dot(Dvv)/(Ndv*Ndv));
143 return Standard_True;
146 //=============================================================================
148 Standard_Integer Extrema_FuncExtCC::GetStateNumber ()
152 Tool1::D1(*((Curve1*)myC1), myU, P1, Du);
153 Tool2::D1(*((Curve2*)myC2), myV, P2, Dv);
155 Standard_Real mod = Du.Magnitude();
159 mod = Dv.Magnitude();
164 if (Abs(P1P2.Dot(Du)) <= myTol && Abs(P1P2.Dot(Dv)) <= myTol) {
165 mySqDist.Append(myP1.SquareDistance(myP2));
166 myPoints.Append(POnC(myU, myP1));
167 myPoints.Append(POnC(myV, myP2));
171 //=============================================================================
173 void Extrema_FuncExtCC::Points (const Standard_Integer N,
177 P1 = myPoints.Value(2*N-1);
178 P2 = myPoints.Value(2*N);
180 //=============================================================================