Warning, /include/opencascade/Extrema_GenExtPC.gxx is written in an unsupported language. File is not indexed.
0001 // Created on: 1995-07-18
0002 // Created by: Modelistation
0003 // Copyright (c) 1995-1999 Matra Datavision
0004 // Copyright (c) 1999-2014 OPEN CASCADE SAS
0005 //
0006 // This file is part of Open CASCADE Technology software library.
0007 //
0008 // This library is free software; you can redistribute it and/or modify it under
0009 // the terms of the GNU Lesser General Public License version 2.1 as published
0010 // by the Free Software Foundation, with special exception defined in the file
0011 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0012 // distribution for complete text of the license and disclaimer of any warranty.
0013 //
0014 // Alternatively, this file may be used under the terms of Open CASCADE
0015 // commercial license or contractual agreement.
0016
0017 #include <StdFail_NotDone.hxx>
0018 #include <math_DirectPolynomialRoots.hxx>
0019 #include <math_FunctionRoots.hxx>
0020 #include <Standard_OutOfRange.hxx>
0021 #include <Standard_NotImplemented.hxx>
0022
0023
0024 //=======================================================================
0025 //function : Extrema_GenExtPC
0026 //purpose :
0027 //=======================================================================
0028
0029 Extrema_GenExtPC::Extrema_GenExtPC ()
0030 : myDone(Standard_False),
0031 myInit(Standard_False),
0032 mynbsample(0),
0033 myumin(0.0),
0034 myusup(0.0),
0035 mytolu(0.0),
0036 mytolF(0.0)
0037 {
0038 }
0039
0040
0041
0042 //=======================================================================
0043 //function : Extrema_GenExtPC
0044 //purpose :
0045 //=======================================================================
0046
0047 Extrema_GenExtPC::Extrema_GenExtPC (const Pnt& P,
0048 const Curve& C,
0049 const Standard_Integer NbSample,
0050 const Standard_Real TolU,
0051 const Standard_Real TolF) : myF (P,C)
0052 {
0053 Initialize(C, NbSample, TolU, TolF);
0054 Perform(P);
0055 }
0056
0057
0058 //=======================================================================
0059 //function : Extrema_GenExtPC
0060 //purpose :
0061 //=======================================================================
0062
0063 Extrema_GenExtPC::Extrema_GenExtPC (const Pnt& P,
0064 const Curve& C,
0065 const Standard_Integer NbSample,
0066 const Standard_Real Umin,
0067 const Standard_Real Usup,
0068 const Standard_Real TolU,
0069 const Standard_Real TolF) : myF (P,C)
0070 {
0071 Initialize(C, NbSample, Umin, Usup, TolU, TolF);
0072 Perform(P);
0073 }
0074
0075
0076 //=======================================================================
0077 //function : Initialize
0078 //purpose :
0079 //=======================================================================
0080
0081 void Extrema_GenExtPC::Initialize(const Curve& C,
0082 const Standard_Integer NbU,
0083 const Standard_Real TolU,
0084 const Standard_Real TolF)
0085 {
0086 myInit = Standard_True;
0087 mynbsample = NbU;
0088 mytolu = TolU;
0089 mytolF = TolF;
0090 myF.Initialize(C);
0091 myumin = Tool::FirstParameter(C);
0092 myusup = Tool::LastParameter(C);
0093 }
0094
0095 //=======================================================================
0096 //function : Initialize
0097 //purpose :
0098 //=======================================================================
0099
0100 void Extrema_GenExtPC::Initialize(const Curve& C,
0101 const Standard_Integer NbU,
0102 const Standard_Real Umin,
0103 const Standard_Real Usup,
0104 const Standard_Real TolU,
0105 const Standard_Real TolF)
0106 {
0107 myInit = Standard_True;
0108 mynbsample = NbU;
0109 mytolu = TolU;
0110 mytolF = TolF;
0111 myF.Initialize(C);
0112 myumin = Umin;
0113 myusup = Usup;
0114 }
0115
0116
0117 //=======================================================================
0118 //function : Initialize
0119 //purpose :
0120 //=======================================================================
0121
0122 void Extrema_GenExtPC::Initialize(const Standard_Integer NbU,
0123 const Standard_Real Umin,
0124 const Standard_Real Usup,
0125 const Standard_Real TolU,
0126 const Standard_Real TolF)
0127 {
0128 mynbsample = NbU;
0129 mytolu = TolU;
0130 mytolF = TolF;
0131 myumin = Umin;
0132 myusup = Usup;
0133 }
0134
0135 //=======================================================================
0136 //function : Initialize
0137 //purpose :
0138 //=======================================================================
0139
0140 void Extrema_GenExtPC::Initialize(const Curve& C)
0141 {
0142 myF.Initialize(C);
0143 }
0144
0145
0146
0147 //=======================================================================
0148 //function : Perform
0149 //purpose :
0150 //=======================================================================
0151
0152 void Extrema_GenExtPC::Perform(const Pnt& P)
0153 /*-----------------------------------------------------------------------------
0154 Fonction:
0155 Recherche des valeurs de parametre u telle que dist(P,C(u)) passe
0156 par un extremum.
0157
0158 Methode:
0159 Si U est solution, alors (C(U)-P).C'(U) = 0.
0160 Le probleme consiste a rechercher les racines de cette fonction
0161 dans l'intervalle de definition de la courbe.
0162 On utilise la classe math_FunctionRoots avec les arguments de
0163 construction suivant:
0164 - F: Extrema_FuncExtPC cree a partir de P et C,
0165 - Uinf: borne inferieure de l'intervalle de definition,
0166 - Usup: borne superieure de l'intervalle de definition,
0167 - NbSample,
0168 - TolU,
0169 - TolF,
0170 - TolF.
0171 -----------------------------------------------------------------------------*/
0172 {
0173 myF.SetPoint(P);
0174 myF.SubIntervalInitialize(myumin,myusup);
0175 myDone = Standard_False;
0176
0177 math_FunctionRoots S (myF, myumin, myusup, mynbsample, mytolu, mytolF, mytolF);
0178 if (!S.IsDone() ||
0179 S.IsAllNull()) { return; }
0180
0181 myDone = Standard_True;
0182 }
0183
0184
0185
0186 //=======================================================================
0187 //function : IsDone
0188 //purpose :
0189 //=======================================================================
0190
0191 Standard_Boolean Extrema_GenExtPC::IsDone () const {
0192
0193 return myDone;
0194 }
0195
0196
0197 //=======================================================================
0198 //function : NbExt
0199 //purpose :
0200 //=======================================================================
0201
0202 Standard_Integer Extrema_GenExtPC::NbExt () const {
0203
0204 if (!IsDone()) { throw StdFail_NotDone(); }
0205 return myF.NbExt();
0206 }
0207
0208
0209 //=======================================================================
0210 //function : Value
0211 //purpose :
0212 //=======================================================================
0213
0214 Standard_Real Extrema_GenExtPC::SquareDistance (const Standard_Integer N) const
0215 {
0216 if ((N < 1) || (N > NbExt()))
0217 {
0218 throw Standard_OutOfRange();
0219 }
0220
0221 return myF.SquareDistance(N);
0222 }
0223
0224
0225 //=======================================================================
0226 //function : IsMin
0227 //purpose :
0228 //=======================================================================
0229
0230 Standard_Boolean Extrema_GenExtPC::IsMin (const Standard_Integer N) const {
0231
0232 if ((N < 1) || (N > NbExt()))
0233 {
0234 throw Standard_OutOfRange();
0235 }
0236
0237 return myF.IsMin(N);
0238 }
0239
0240
0241 //=======================================================================
0242 //function : Point
0243 //purpose :
0244 //=======================================================================
0245
0246 const POnC & Extrema_GenExtPC::Point (const Standard_Integer N) const
0247 {
0248 if ((N < 1) || (N > NbExt()))
0249 {
0250 throw Standard_OutOfRange();
0251 }
0252
0253 return myF.Point(N);
0254 }
0255 //=============================================================================