1 // File: Extrema_FuncExtCS.cxx
2 // Created: Tue Jan 9 10:13:04 1996
3 // Author: Laurent PAINNOT
7 #include <Extrema_FuncExtCS.ixx>
9 #include <Standard_TypeMismatch.hxx>
11 /*-----------------------------------------------------------------------------
12 Fonction permettant de rechercher une distance extremale entre une courbe C
14 Cette classe herite de math_FunctionWithDerivative et est utilisee par
15 les algorithmes math_FunctionRoot et math_FunctionRoots.
17 { F1(t,u,v) = (C(t)-S(u,v)).Dtc(t) }
18 { F2(t,u,v) = (C(t)-S(u,v)).Dus(u,v) }
19 { F3(t,u,v) = (C(t)-S(u,v)).Dvs(u,v) }
21 { Dtf1(t,u,v) = Dtc(t).Dtc(t)+(C(t)-S(u,v)).Dttc(t)
22 = ||Dtc(t)||**2+(C(t)-S(u,v)).Dttc(t) }
23 { Duf1(t,u,v) = -Dus(u,v).Dtc(t) }
24 { Dvf1(t,u,v) = -Dvs(u,v).Dtc(t) }
26 { Dtf2(t,u,v) = Dtc(t).Dus(u,v) }
27 { Duf2(t,u,v) = -Dus(u,v).Dus(u,v)+(C(t)-S(u,v)).Duus(u,v)
28 = -||Dus(u,v)||**2+(C(t)-S(u,v)).Duus(u,v) }
29 { Dvf2(t,u,v) = -Dvs(u,v).Dus(u,v)+(C(t)-S(u,v)).Duvs(u,v) }
31 { Dtf3(t,u,v) = Dtc(t).Dvs(u,v) }
32 { Duf3(t,u,v) = -Dus(u,v).Dvs(u,v)+(C(t)-S(u,v)).Duvs(u,v) }
33 { Dvf3(t,u,v) = -Dvs(u,v).Dvs(u,v)+(C(t)-S(u,v)).Dvvs(u,v) }
35 ----------------------------------------------------------------------------*/
39 //=======================================================================
40 //function : Extrema_FuncExtCS
42 //=======================================================================
44 Extrema_FuncExtCS::Extrema_FuncExtCS()
46 myCinit = Standard_False;
47 mySinit = Standard_False;
50 //=======================================================================
51 //function : Extrema_FuncExtCS
53 //=======================================================================
55 Extrema_FuncExtCS::Extrema_FuncExtCS(const Adaptor3d_Curve& C,
56 const Adaptor3d_Surface& S)
61 //=======================================================================
62 //function : Initialize
64 //=======================================================================
66 void Extrema_FuncExtCS::Initialize(const Adaptor3d_Curve& C,
67 const Adaptor3d_Surface& S)
69 myC = (Adaptor3d_CurvePtr)&C;
70 myS = (Adaptor3d_SurfacePtr)&S;
71 myCinit = Standard_True;
72 mySinit = Standard_True;
78 //=======================================================================
79 //function : NbVariables
81 //=======================================================================
83 Standard_Integer Extrema_FuncExtCS::NbVariables() const
88 //=======================================================================
89 //function : NbEquations
91 //=======================================================================
93 Standard_Integer Extrema_FuncExtCS::NbEquations() const
98 //=======================================================================
101 //=======================================================================
103 Standard_Boolean Extrema_FuncExtCS::Value(const math_Vector& UV,
106 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
114 /// gp_Vec Dus, Dvs, Duvs, Duus, Dvvs;
116 myC->D1(myt, myP1, Dtc);
117 myS->D1(myU,myV,myP2,Dus,Dvs);
119 gp_Vec P1P2 (myP2,myP1);
121 F(1) = P1P2.Dot(Dtc);
122 F(2) = P1P2.Dot(Dus);
123 F(3) = P1P2.Dot(Dvs);
125 return Standard_True;
128 //=======================================================================
129 //function : Derivatives
131 //=======================================================================
133 Standard_Boolean Extrema_FuncExtCS::Derivatives(const math_Vector& UV,
137 return Values(UV,F,DF);
140 //=======================================================================
143 //=======================================================================
145 Standard_Boolean Extrema_FuncExtCS::Values(const math_Vector& UV,
149 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
156 gp_Vec Dus, Dvs, Duvs, Duus, Dvvs;
157 myC->D2(myt, myP1, Dtc, Dttc);
158 myS->D2(myU,myV,myP2,Dus,Dvs,Duus,Dvvs,Duvs);
160 gp_Vec P1P2 (myP2,myP1);
162 F(1) = P1P2.Dot(Dtc);
163 F(2) = P1P2.Dot(Dus);
164 F(3) = P1P2.Dot(Dvs);
166 Df(1,1) = Dtc.SquareMagnitude() + P1P2.Dot(Dttc);
167 Df(1,2) = -Dus.Dot(Dtc);
168 Df(1,3) = -Dvs.Dot(Dtc);
170 Df(2,1) = -Df(1, 2); // Dtc.Dot(Dus);
171 Df(2,2) = -Dus.SquareMagnitude()+P1P2.Dot(Duus);
172 Df(2,3) = -Dvs.Dot(Dus)+P1P2.Dot(Duvs);
174 Df(3,1) = -Df(1,3); // Dtc.Dot(Dvs);
175 Df(3,2) = Df(2,3); // -Dus.Dot(Dvs)+P1P2.Dot(Duvs);
176 Df(3,3) = -Dvs.SquareMagnitude()+P1P2.Dot(Dvvs);
178 return Standard_True;
182 //=======================================================================
183 //function : GetStateNumber
185 //=======================================================================
187 Standard_Integer Extrema_FuncExtCS::GetStateNumber()
189 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
191 math_Vector Sol(1, 3), UVSol(1, 3);
192 UVSol(1) = myt; UVSol(2) = myU; UVSol(3) = myV;
194 cout <<"F(1)= "<<Sol(1)<<" F(2)= "<<Sol(2)<<" F(3)= "<<Sol(3)<<endl;
197 mySqDist.Append(myP1.SquareDistance(myP2));
198 myPoint1.Append(Extrema_POnCurv(myt,myP1));
199 myPoint2.Append(Extrema_POnSurf(myU,myV,myP2));
203 //=======================================================================
206 //=======================================================================
208 Standard_Integer Extrema_FuncExtCS::NbExt() const
210 return mySqDist.Length();
213 //=======================================================================
214 //function : SquareDistance
216 //=======================================================================
218 Standard_Real Extrema_FuncExtCS::SquareDistance(const Standard_Integer N) const
220 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
221 return mySqDist.Value(N);
224 //=======================================================================
225 //function : PointOnCurve
227 //=======================================================================
229 const Extrema_POnCurv& Extrema_FuncExtCS::PointOnCurve(const Standard_Integer N) const
231 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
232 return myPoint1.Value(N);
235 //=======================================================================
236 //function : PointOnSurface
238 //=======================================================================
240 const Extrema_POnSurf& Extrema_FuncExtCS::PointOnSurface(const Standard_Integer N) const
242 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
243 return myPoint2.Value(N);
246 //=======================================================================
249 //=======================================================================
251 Adaptor3d_SurfacePtr Extrema_FuncExtCS::Bidon1() const
253 return (Adaptor3d_SurfacePtr)0L;
256 //=======================================================================
259 //=======================================================================
261 Adaptor3d_CurvePtr Extrema_FuncExtCS::Bidon2() const
263 return (Adaptor3d_CurvePtr)0L;