0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / Extrema / Extrema_GenLocateExtPC.gxx
1 // Created on: 1995-07-18
2 // Created by: Modelistation
3 // Copyright (c) 1995-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
8 // This library is free software; you can redistribute it and/or modify it under
9 // the terms of the GNU Lesser General Public License 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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <StdFail_NotDone.hxx>
18 #include <Standard_DomainError.hxx>
19 #include <math_FunctionRoot.hxx>
20
21 //=======================================================================
22 //function : Extrema_GenLocateExtPC
23 //purpose  : 
24 //=======================================================================
25
26 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC()
27 : myDone(Standard_False),
28   mytolU(0.0),
29   myumin(0.0),
30   myusup(0.0)
31 {
32 }
33
34
35 //=======================================================================
36 //function : Extrema_GenLocateExtPC
37 //purpose  : 
38 //=======================================================================
39
40 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC (const Pnt&          P,
41                                                 const Curve&        C,
42                                                 const Standard_Real U0, 
43                                                 const Standard_Real TolU)
44 {
45   Initialize(C, Tool::FirstParameter(C), Tool::LastParameter(C), TolU);
46   Perform(P, U0);
47 }
48
49
50 //=======================================================================
51 //function : Extrema_GenLocateExtPC
52 //purpose  : 
53 //=======================================================================
54
55 Extrema_GenLocateExtPC::Extrema_GenLocateExtPC (const Pnt&          P,
56                                                 const Curve&        C,
57                                                 const Standard_Real U0, 
58                                                 const Standard_Real Umin,
59                                                 const Standard_Real Usup,
60                                                 const Standard_Real TolU)
61 {
62   Initialize(C, Umin, Usup, TolU);
63   Perform(P, U0);
64 }
65
66
67 //=======================================================================
68 //function : Initialize
69 //purpose  : 
70 //=======================================================================
71
72 void Extrema_GenLocateExtPC::Initialize(const Curve&        C,
73                                         const Standard_Real Umin,
74                                         const Standard_Real Usup,
75                                         const Standard_Real TolU)
76 {
77   myDone = Standard_False;
78   myF.Initialize(C);
79   myumin = Umin;
80   myusup = Usup;
81   mytolU = TolU;
82 }
83
84
85 //=======================================================================
86 //function : Perform
87 //purpose  : 
88 //=======================================================================
89
90 void Extrema_GenLocateExtPC::Perform(const Pnt&          P,
91                                      const Standard_Real U0)
92
93 /*-----------------------------------------------------------------------------
94 Fonction:
95   Recherche de la valeur de parametre U telle que:
96   - dist(P,C(u)) passe par un extremum,
97   - U soit la solution la plus proche de U0.
98
99 Methode:
100   Si U est solution, alors F(U)=(C(U)-P).C'(U) = 0.
101   Le probleme consiste a rechercher, dans l'intervalle de definition
102   de la courbe, la racine de F la plus proche de U0.
103   On utilise la classe math_FunctionRoot avec les arguments de
104   construction suivants:
105   - F: Extrema_FuncExtPC cree a partir de P et C,
106   - U0,
107   - TolU,
108   - Uinf: borne inferieure de l'intervalle de definition,
109   - Ulast: borne superieure de l'intervalle de definition,
110   - 100. .
111 -----------------------------------------------------------------------------*/
112 {
113   myF.SetPoint(P);
114   math_FunctionRoot S (myF, U0, mytolU, myumin, myusup);
115   myDone = S.IsDone();
116   if (myDone) {
117     Standard_Real uu, ff;
118     POnC PP = Point();
119     uu = PP.Parameter();
120     if(myF.Value(uu, ff)) {
121       if (Abs(ff) >= 1.e-07) myDone = Standard_False;
122     }
123     else myDone = Standard_False;
124   }
125 }
126
127 //=======================================================================
128 //function : IsDone
129 //purpose  : 
130 //=======================================================================
131
132 Standard_Boolean Extrema_GenLocateExtPC::IsDone () const 
133 {
134   return myDone;
135 }
136
137
138 //=======================================================================
139 //function : Value
140 //purpose  : 
141 //=======================================================================
142
143 Standard_Real Extrema_GenLocateExtPC::SquareDistance() const 
144 {
145   if (!IsDone())
146   {
147     throw StdFail_NotDone();
148   }
149   return myF.SquareDistance(1);
150 }
151
152
153 //=======================================================================
154 //function : IsMin
155 //purpose  : 
156 //=======================================================================
157
158 Standard_Boolean Extrema_GenLocateExtPC::IsMin () const 
159 {
160   if (!IsDone())
161   {
162     throw StdFail_NotDone();
163   }
164   return myF.IsMin(1);
165 }
166
167
168 //=======================================================================
169 //function : Point
170 //purpose  : 
171 //=======================================================================
172
173 const POnC & Extrema_GenLocateExtPC::Point () const 
174 {
175   if (!IsDone())
176   {
177     throw StdFail_NotDone();
178   }
179   return myF.Point(1);
180 }
181