Warning, /include/opencascade/Extrema_GenLocateExtPC.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 <Standard_DomainError.hxx>
0019 #include <math_FunctionRoot.hxx>
0020
0021 //=======================================================================
0022 //function : Extrema_GenLocateExtPC
0023 //purpose :
0024 //=======================================================================
0025
0026 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC()
0027 : myDone(Standard_False),
0028 mytolU(0.0),
0029 myumin(0.0),
0030 myusup(0.0)
0031 {
0032 }
0033
0034
0035 //=======================================================================
0036 //function : Extrema_GenLocateExtPC
0037 //purpose :
0038 //=======================================================================
0039
0040 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC (const Pnt& P,
0041 const Curve& C,
0042 const Standard_Real U0,
0043 const Standard_Real TolU)
0044 {
0045 Initialize(C, Tool::FirstParameter(C), Tool::LastParameter(C), TolU);
0046 Perform(P, U0);
0047 }
0048
0049
0050 //=======================================================================
0051 //function : Extrema_GenLocateExtPC
0052 //purpose :
0053 //=======================================================================
0054
0055 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC (const Pnt& P,
0056 const Curve& C,
0057 const Standard_Real U0,
0058 const Standard_Real Umin,
0059 const Standard_Real Usup,
0060 const Standard_Real TolU)
0061 {
0062 Initialize(C, Umin, Usup, TolU);
0063 Perform(P, U0);
0064 }
0065
0066
0067 //=======================================================================
0068 //function : Initialize
0069 //purpose :
0070 //=======================================================================
0071
0072 void Extrema_GenLocateExtPC::Initialize(const Curve& C,
0073 const Standard_Real Umin,
0074 const Standard_Real Usup,
0075 const Standard_Real TolU)
0076 {
0077 myDone = Standard_False;
0078 myF.Initialize(C);
0079 myumin = Umin;
0080 myusup = Usup;
0081 mytolU = TolU;
0082 }
0083
0084
0085 //=======================================================================
0086 //function : Perform
0087 //purpose :
0088 //=======================================================================
0089
0090 void Extrema_GenLocateExtPC::Perform(const Pnt& P,
0091 const Standard_Real U0)
0092
0093 /*-----------------------------------------------------------------------------
0094 Fonction:
0095 Recherche de la valeur de parametre U telle que:
0096 - dist(P,C(u)) passe par un extremum,
0097 - U soit la solution la plus proche de U0.
0098
0099 Methode:
0100 Si U est solution, alors F(U)=(C(U)-P).C'(U) = 0.
0101 Le probleme consiste a rechercher, dans l'intervalle de definition
0102 de la courbe, la racine de F la plus proche de U0.
0103 On utilise la classe math_FunctionRoot avec les arguments de
0104 construction suivants:
0105 - F: Extrema_FuncExtPC cree a partir de P et C,
0106 - U0,
0107 - TolU,
0108 - Uinf: borne inferieure de l'intervalle de definition,
0109 - Ulast: borne superieure de l'intervalle de definition,
0110 - 100. .
0111 -----------------------------------------------------------------------------*/
0112 {
0113 myF.SetPoint(P);
0114 math_FunctionRoot S (myF, U0, mytolU, myumin, myusup);
0115 myDone = S.IsDone();
0116 if (myDone) {
0117 Standard_Real uu, ff;
0118 POnC PP = Point();
0119 uu = PP.Parameter();
0120 if(myF.Value(uu, ff)) {
0121 if (Abs(ff) >= 1.e-07) myDone = Standard_False;
0122 }
0123 else myDone = Standard_False;
0124 }
0125 }
0126
0127 //=======================================================================
0128 //function : IsDone
0129 //purpose :
0130 //=======================================================================
0131
0132 Standard_Boolean Extrema_GenLocateExtPC::IsDone () const
0133 {
0134 return myDone;
0135 }
0136
0137
0138 //=======================================================================
0139 //function : Value
0140 //purpose :
0141 //=======================================================================
0142
0143 Standard_Real Extrema_GenLocateExtPC::SquareDistance() const
0144 {
0145 if (!IsDone())
0146 {
0147 throw StdFail_NotDone();
0148 }
0149 return myF.SquareDistance(1);
0150 }
0151
0152
0153 //=======================================================================
0154 //function : IsMin
0155 //purpose :
0156 //=======================================================================
0157
0158 Standard_Boolean Extrema_GenLocateExtPC::IsMin () const
0159 {
0160 if (!IsDone())
0161 {
0162 throw StdFail_NotDone();
0163 }
0164 return myF.IsMin(1);
0165 }
0166
0167
0168 //=======================================================================
0169 //function : Point
0170 //purpose :
0171 //=======================================================================
0172
0173 const POnC & Extrema_GenLocateExtPC::Point () const
0174 {
0175 if (!IsDone())
0176 {
0177 throw StdFail_NotDone();
0178 }
0179 return myF.Point(1);
0180 }
0181