1 // Created on: 1996-01-09
2 // Created by: Laurent PAINNOT
3 // Copyright (c) 1996-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
6 // This file is part of Open CASCADE Technology software library.
8 // This library is free software; you can redistribute it and / or modify it
9 // under the terms of the GNU Lesser General Public version 2.1 as published
10 // by the Free Software Foundation, with special exception defined in the file
11 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
12 // distribution for complete text of the license and disclaimer of any warranty.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
17 #include <Extrema_FuncExtCS.ixx>
19 #include <Standard_TypeMismatch.hxx>
20 #include <Precision.hxx>
22 /*-----------------------------------------------------------------------------
23 Fonction permettant de rechercher une distance extremale entre une courbe C
25 Cette classe herite de math_FunctionWithDerivative et est utilisee par
26 les algorithmes math_FunctionRoot et math_FunctionRoots.
28 { F1(t,u,v) = (C(t)-S(u,v)).Dtc(t) }
29 { F2(t,u,v) = (C(t)-S(u,v)).Dus(u,v) }
30 { F3(t,u,v) = (C(t)-S(u,v)).Dvs(u,v) }
32 { Dtf1(t,u,v) = Dtc(t).Dtc(t)+(C(t)-S(u,v)).Dttc(t)
33 = ||Dtc(t)||**2+(C(t)-S(u,v)).Dttc(t) }
34 { Duf1(t,u,v) = -Dus(u,v).Dtc(t) }
35 { Dvf1(t,u,v) = -Dvs(u,v).Dtc(t) }
37 { Dtf2(t,u,v) = Dtc(t).Dus(u,v) }
38 { Duf2(t,u,v) = -Dus(u,v).Dus(u,v)+(C(t)-S(u,v)).Duus(u,v)
39 = -||Dus(u,v)||**2+(C(t)-S(u,v)).Duus(u,v) }
40 { Dvf2(t,u,v) = -Dvs(u,v).Dus(u,v)+(C(t)-S(u,v)).Duvs(u,v) }
42 { Dtf3(t,u,v) = Dtc(t).Dvs(u,v) }
43 { Duf3(t,u,v) = -Dus(u,v).Dvs(u,v)+(C(t)-S(u,v)).Duvs(u,v) }
44 { Dvf3(t,u,v) = -Dvs(u,v).Dvs(u,v)+(C(t)-S(u,v)).Dvvs(u,v) }
46 ----------------------------------------------------------------------------*/
50 //=======================================================================
51 //function : Extrema_FuncExtCS
53 //=======================================================================
55 Extrema_FuncExtCS::Extrema_FuncExtCS()
57 myCinit = Standard_False;
58 mySinit = Standard_False;
61 //=======================================================================
62 //function : Extrema_FuncExtCS
64 //=======================================================================
66 Extrema_FuncExtCS::Extrema_FuncExtCS(const Adaptor3d_Curve& C,
67 const Adaptor3d_Surface& S)
72 //=======================================================================
73 //function : Initialize
75 //=======================================================================
77 void Extrema_FuncExtCS::Initialize(const Adaptor3d_Curve& C,
78 const Adaptor3d_Surface& S)
80 myC = (Adaptor3d_CurvePtr)&C;
81 myS = (Adaptor3d_SurfacePtr)&S;
82 myCinit = Standard_True;
83 mySinit = Standard_True;
89 //=======================================================================
90 //function : NbVariables
92 //=======================================================================
94 Standard_Integer Extrema_FuncExtCS::NbVariables() const
99 //=======================================================================
100 //function : NbEquations
102 //=======================================================================
104 Standard_Integer Extrema_FuncExtCS::NbEquations() const
109 //=======================================================================
112 //=======================================================================
114 Standard_Boolean Extrema_FuncExtCS::Value(const math_Vector& UV,
117 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
125 /// gp_Vec Dus, Dvs, Duvs, Duus, Dvvs;
127 myC->D1(myt, myP1, Dtc);
128 myS->D1(myU,myV,myP2,Dus,Dvs);
130 gp_Vec P1P2 (myP2,myP1);
132 F(1) = P1P2.Dot(Dtc);
133 F(2) = P1P2.Dot(Dus);
134 F(3) = P1P2.Dot(Dvs);
136 return Standard_True;
139 //=======================================================================
140 //function : Derivatives
142 //=======================================================================
144 Standard_Boolean Extrema_FuncExtCS::Derivatives(const math_Vector& UV,
148 return Values(UV,F,DF);
151 //=======================================================================
154 //=======================================================================
156 Standard_Boolean Extrema_FuncExtCS::Values(const math_Vector& UV,
160 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
167 gp_Vec Dus, Dvs, Duvs, Duus, Dvvs;
168 myC->D2(myt, myP1, Dtc, Dttc);
169 myS->D2(myU,myV,myP2,Dus,Dvs,Duus,Dvvs,Duvs);
171 gp_Vec P1P2 (myP2,myP1);
173 F(1) = P1P2.Dot(Dtc);
174 F(2) = P1P2.Dot(Dus);
175 F(3) = P1P2.Dot(Dvs);
177 Df(1,1) = Dtc.SquareMagnitude() + P1P2.Dot(Dttc);
178 Df(1,2) = -Dus.Dot(Dtc);
179 Df(1,3) = -Dvs.Dot(Dtc);
181 Df(2,1) = -Df(1, 2); // Dtc.Dot(Dus);
182 Df(2,2) = -Dus.SquareMagnitude()+P1P2.Dot(Duus);
183 Df(2,3) = -Dvs.Dot(Dus)+P1P2.Dot(Duvs);
185 Df(3,1) = -Df(1,3); // Dtc.Dot(Dvs);
186 Df(3,2) = Df(2,3); // -Dus.Dot(Dvs)+P1P2.Dot(Duvs);
187 Df(3,3) = -Dvs.SquareMagnitude()+P1P2.Dot(Dvvs);
189 return Standard_True;
193 //=======================================================================
194 //function : GetStateNumber
196 //=======================================================================
198 Standard_Integer Extrema_FuncExtCS::GetStateNumber()
200 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
202 math_Vector Sol(1, 3), UVSol(1, 3);
203 UVSol(1) = myt; UVSol(2) = myU; UVSol(3) = myV;
205 cout <<"F(1)= "<<Sol(1)<<" F(2)= "<<Sol(2)<<" F(3)= "<<Sol(3)<<endl;
207 //comparison of solution with previous solutions
208 Standard_Real tol2d = Precision::PConfusion() * Precision::PConfusion();
209 Standard_Integer i = 1, nbSol = mySqDist.Length();
210 for( ; i <= nbSol; i++)
212 Standard_Real aU = myPoint1(i).Parameter();
213 if( (myU - aU) * (myU - aU) <= tol2d )
218 mySqDist.Append(myP1.SquareDistance(myP2));
219 myPoint1.Append(Extrema_POnCurv(myt,myP1));
220 myPoint2.Append(Extrema_POnSurf(myU,myV,myP2));
224 //=======================================================================
227 //=======================================================================
229 Standard_Integer Extrema_FuncExtCS::NbExt() const
231 return mySqDist.Length();
234 //=======================================================================
235 //function : SquareDistance
237 //=======================================================================
239 Standard_Real Extrema_FuncExtCS::SquareDistance(const Standard_Integer N) const
241 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
242 return mySqDist.Value(N);
245 //=======================================================================
246 //function : PointOnCurve
248 //=======================================================================
250 const Extrema_POnCurv& Extrema_FuncExtCS::PointOnCurve(const Standard_Integer N) const
252 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
253 return myPoint1.Value(N);
256 //=======================================================================
257 //function : PointOnSurface
259 //=======================================================================
261 const Extrema_POnSurf& Extrema_FuncExtCS::PointOnSurface(const Standard_Integer N) const
263 if (!myCinit || !mySinit) Standard_TypeMismatch::Raise();
264 return myPoint2.Value(N);
267 //=======================================================================
270 //=======================================================================
272 Adaptor3d_SurfacePtr Extrema_FuncExtCS::Bidon1() const
274 return (Adaptor3d_SurfacePtr)0L;
277 //=======================================================================
280 //=======================================================================
282 Adaptor3d_CurvePtr Extrema_FuncExtCS::Bidon2() const
284 return (Adaptor3d_CurvePtr)0L;