1 #include <Standard_TypeMismatch.hxx>
6 /*-----------------------------------------------------------------------------
7 Fonction permettant de rechercher une distance extremale entre un point P et
8 une courbe C (en partant d'un point approche C(u0)).
9 Cette classe herite de math_FunctionWithDerivative et est utilisee par
10 les algorithmes math_FunctionRoot et math_FunctionRoots.
11 Si on note D1c et D2c les derivees premiere et seconde:
12 { F(u) = (C(u)-P).D1c(u)/ ||Du||}
13 { DF(u) = ||Du|| + (C(u)-P).D2c(u)/||Du|| - F(u)*Duu*Du/||Du||**2
16 { F(u) = (C(u)-P).D1c(u) }
17 { DF(u) = D1c(u).D1c(u) + (C(u)-P).D2c(u)
18 = ||D1c(u)|| ** 2 + (C(u)-P).D2c(u) }
19 ----------------------------------------------------------------------------*/
22 Extrema_FuncExtPC::Extrema_FuncExtPC():
26 myPinit = Standard_False;
27 myCinit = Standard_False;
28 myD1Init = Standard_False;
31 //=============================================================================
33 Extrema_FuncExtPC::Extrema_FuncExtPC (const Pnt& P,
39 myC = (Standard_Address)&C;
40 myPinit = Standard_True;
41 myCinit = Standard_True;
42 myD1Init = Standard_False;
44 //=============================================================================
46 void Extrema_FuncExtPC::Initialize(const Curve& C)
48 myC = (Standard_Address)&C;
49 myCinit = Standard_True;
55 //=============================================================================
57 void Extrema_FuncExtPC::SetPoint(const Pnt& P)
60 myPinit = Standard_True;
66 //=============================================================================
68 Standard_Boolean Extrema_FuncExtPC::Value (const Standard_Real U, Standard_Real& F)
70 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
73 Tool::D1(*((Curve*)myC),myU,myPc,D1c);
74 Standard_Real Ndu = D1c.Magnitude();
75 if (Ndu <= Tol) { // Cas Singulier (PMN 22/04/1998)
77 P2 = Tool::Value(*((Curve*)myC),myU+delta);
78 P1 = Tool::Value(*((Curve*)myC),myU-delta);
81 Ndu = D1c.Magnitude();
83 return Standard_False;
91 //=============================================================================
93 Standard_Boolean Extrema_FuncExtPC::Derivative (const Standard_Real U, Standard_Real& D1f)
95 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
97 return Values(U,F,D1f); /* on fait appel a Values pour simplifier la
98 sauvegarde de l'etat. */
100 //=============================================================================
102 Standard_Boolean Extrema_FuncExtPC::Values (const Standard_Real U, Standard_Real& F, Standard_Real& D1f)
104 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
107 Tool::D2(*((Curve*)myC),myU,myPc,D1c,D2c);
109 Standard_Real Ndu = D1c.Magnitude();
110 if (Ndu <= Tol) {// Cas Singulier (PMN 22/04/1998)
113 Tool::D1(*((Curve*)myC),myU+delta, P2, V1);
114 Tool::D1(*((Curve*)myC),myU-delta, P1, D2c);
118 Ndu = D1c.Magnitude();
120 myD1Init = Standard_False;
121 return Standard_False;
126 F = PPc.Dot(D1c)/Ndu;
127 D1f = Ndu + (PPc.Dot(D2c)/Ndu) - F*(D1c.Dot(D2c))/(Ndu*Ndu);
130 myD1Init = Standard_True;
131 return Standard_True;
133 //=============================================================================
135 Standard_Integer Extrema_FuncExtPC::GetStateNumber ()
137 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
138 mySqDist.Append(myPc.SquareDistance(myP));
139 Standard_Integer IntVal;
141 myD1Init = Standard_True;
142 Standard_Real FF, DD;
145 if (!myD1Init) IntVal = 0;
147 if (myD1f > 0.) { IntVal = 1; }
150 myIsMin.Append(IntVal);
151 myPoint.Append(POnC(myU,myPc));
154 //=============================================================================
156 Standard_Integer Extrema_FuncExtPC::NbExt () const { return mySqDist.Length(); }
157 //=============================================================================
159 Standard_Real Extrema_FuncExtPC::SquareDistance (const Standard_Integer N) const
161 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
162 return mySqDist.Value(N);
164 //=============================================================================
165 Standard_Boolean Extrema_FuncExtPC::IsMin (const Standard_Integer N) const
167 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
168 return (myIsMin.Value(N) == 1);
170 //=============================================================================
171 POnC Extrema_FuncExtPC::Point (const Standard_Integer N) const
173 if (!myPinit || !myCinit) Standard_TypeMismatch::Raise();
174 return myPoint.Value(N);
176 //=============================================================================