0031035: Coding - uninitialized class fields reported by Visual Studio Code Analysis
[occt.git] / src / GeomAPI / GeomAPI_ExtremaSurfaceSurface.cxx
1 // Created on: 1994-03-18
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1994-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
18 #include <Extrema_ExtSS.hxx>
19 #include <Extrema_POnSurf.hxx>
20 #include <Geom_Surface.hxx>
21 #include <GeomAdaptor_Surface.hxx>
22 #include <GeomAPI_ExtremaSurfaceSurface.hxx>
23 #include <gp_Pnt.hxx>
24 #include <Precision.hxx>
25 #include <Standard_OutOfRange.hxx>
26 #include <StdFail_NotDone.hxx>
27
28 //=======================================================================
29 //function : GeomAPI_ExtremaSurfaceSurface
30 //purpose  : 
31 //=======================================================================
32 GeomAPI_ExtremaSurfaceSurface::GeomAPI_ExtremaSurfaceSurface()
33 : myIsDone(Standard_False),
34   myIndex(0)
35 {
36 }
37
38
39 //=======================================================================
40 //function : GeomAPI_ExtremaSurfaceSurface
41 //purpose  : 
42 //=======================================================================
43
44 GeomAPI_ExtremaSurfaceSurface::GeomAPI_ExtremaSurfaceSurface
45   (const Handle(Geom_Surface)& S1,
46    const Handle(Geom_Surface)& S2)
47 {
48   Init(S1,S2);
49 }
50
51
52 //=======================================================================
53 //function : GeomAPI_ExtremaSurfaceSurface
54 //purpose  : 
55 //=======================================================================
56
57 GeomAPI_ExtremaSurfaceSurface::GeomAPI_ExtremaSurfaceSurface
58   (const Handle(Geom_Surface)& S1,
59    const Handle(Geom_Surface)& S2,
60    const Standard_Real         U1min,
61    const Standard_Real         U1max,
62    const Standard_Real         V1min,
63    const Standard_Real         V1max,
64    const Standard_Real         U2min,
65    const Standard_Real         U2max,
66    const Standard_Real         V2min,
67    const Standard_Real         V2max)
68 {
69   Init(S1,S2,U1min,U1max,V1min,V1max,U2min,U2max,V2min,V2max);
70 }
71
72
73 //=======================================================================
74 //function : Init
75 //purpose  : 
76 //=======================================================================
77
78 void GeomAPI_ExtremaSurfaceSurface::Init
79   (const Handle(Geom_Surface)& S1,
80    const Handle(Geom_Surface)& S2)
81 {
82   GeomAdaptor_Surface TheSurface1 (S1);
83   GeomAdaptor_Surface TheSurface2 (S2);
84
85   Standard_Real Tol = Precision::PConfusion();
86   
87   Extrema_ExtSS theExtSS(TheSurface1, TheSurface2,Tol,Tol);
88   myExtSS = theExtSS;
89
90   myIsDone = myExtSS.IsDone() && ( myExtSS.NbExt() > 0);
91
92   if ( myIsDone) {
93
94     // evaluate the lower distance and its index;
95     
96     Standard_Real Dist2, Dist2Min = myExtSS.SquareDistance(1);
97     myIndex = 1;
98     
99     for ( Standard_Integer i = 2; i <= myExtSS.NbExt(); i++) {
100       Dist2 = myExtSS.SquareDistance(i);
101       if ( Dist2 < Dist2Min) {
102         Dist2Min = Dist2;
103         myIndex = i;
104       }
105     }
106   }
107 }
108
109
110 //=======================================================================
111 //function : Init
112 //purpose  : 
113 //=======================================================================
114
115 void GeomAPI_ExtremaSurfaceSurface::Init
116   (const Handle(Geom_Surface)& S1,
117    const Handle(Geom_Surface)& S2, 
118    const Standard_Real         U1min,
119    const Standard_Real         U1max,
120    const Standard_Real         V1min,
121    const Standard_Real         V1max,
122    const Standard_Real         U2min,
123    const Standard_Real         U2max,
124    const Standard_Real         V2min,
125    const Standard_Real         V2max)
126 {
127   GeomAdaptor_Surface TheSurface1 (S1,U1min,U1max,V1min,V1max);
128   GeomAdaptor_Surface TheSurface2 (S2,U2min,U2max,V2min,V2max);
129
130   Standard_Real Tol = Precision::PConfusion();
131   Extrema_ExtSS theExtSS(TheSurface1, TheSurface2,
132                           U1min,U1max,V1min,V1max,
133                           U2min,U2max,V2min,V2max,
134                           Tol,Tol);
135
136   myExtSS = theExtSS;
137   myIsDone = myExtSS.IsDone() && ( myExtSS.NbExt() > 0);
138
139   if ( myIsDone) {
140
141     // evaluate the lower distance and its index;
142     
143     Standard_Real Dist2, Dist2Min = myExtSS.SquareDistance(1);
144     myIndex = 1;
145     
146     for ( Standard_Integer i = 2; i <= myExtSS.NbExt(); i++) {
147       Dist2 = myExtSS.SquareDistance(i);
148       if ( Dist2 < Dist2Min) {
149         Dist2Min = Dist2;
150         myIndex = i;
151       }
152     }
153   }
154 }
155
156
157 //=======================================================================
158 //function : NbExtrema
159 //purpose  : 
160 //=======================================================================
161
162 Standard_Integer GeomAPI_ExtremaSurfaceSurface::NbExtrema() const 
163 {
164   if ( myIsDone) 
165     return myExtSS.NbExt();
166   else
167     return 0;
168 }
169
170
171 //=======================================================================
172 //function : Points
173 //purpose  : 
174 //=======================================================================
175
176 void GeomAPI_ExtremaSurfaceSurface::Points
177   (const Standard_Integer Index,
178          gp_Pnt&          P1,
179          gp_Pnt&          P2) const 
180 {
181   Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
182                                "GeomAPI_ExtremaCurveCurve::Points");
183
184   Extrema_POnSurf PS1,PS2;
185   myExtSS.Points(Index,PS1,PS2);
186
187   P1 = PS1.Value();
188   P2 = PS2.Value();
189 }
190
191
192 //=======================================================================
193 //function : Parameters
194 //purpose  : 
195 //=======================================================================
196
197 void GeomAPI_ExtremaSurfaceSurface::Parameters
198   (const Standard_Integer Index,
199          Standard_Real&   U1,
200          Standard_Real&   V1,
201          Standard_Real&   U2,
202          Standard_Real&   V2) const 
203 {
204   Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
205                                "GeomAPI_ExtremaCurveCurve::Parameters");
206
207   Extrema_POnSurf PS1,PS2;
208   myExtSS.Points(Index,PS1,PS2);
209
210   PS1.Parameter(U1,V1);
211   PS2.Parameter(U2,V2);
212 }
213
214
215 //=======================================================================
216 //function : Distance
217 //purpose  : 
218 //=======================================================================
219
220 Standard_Real GeomAPI_ExtremaSurfaceSurface::Distance
221   (const Standard_Integer Index) const 
222 {
223   Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
224                                "GeomAPI_ExtremaCurveCurve::Distance");
225
226   return sqrt (myExtSS.SquareDistance(Index));
227 }
228
229
230 //=======================================================================
231 //function : NearestPoints
232 //purpose  : 
233 //=======================================================================
234
235 void GeomAPI_ExtremaSurfaceSurface::NearestPoints
236   (gp_Pnt& P1, 
237    gp_Pnt& P2) const 
238 {
239   StdFail_NotDone_Raise_if
240     ( !myIsDone, "GeomAPI_ExtremaSurfaceSurface::NearestPoints");
241
242   Points(myIndex,P1,P2);
243 }
244
245
246 //=======================================================================
247 //function : LowerDistanceParameters
248 //purpose  : 
249 //=======================================================================
250
251 void GeomAPI_ExtremaSurfaceSurface::LowerDistanceParameters
252   (Standard_Real& U1,
253    Standard_Real& V1,
254    Standard_Real& U2,
255    Standard_Real& V2) const 
256 {
257   StdFail_NotDone_Raise_if
258     ( !myIsDone, "GeomAPI_ExtremaSurfaceSurface::LowerDistanceParameters");
259
260   Parameters(myIndex,U1,V1,U2,V2);
261 }
262
263
264 //=======================================================================
265 //function : LowerDistance
266 //purpose  : 
267 //=======================================================================
268
269 Standard_Real GeomAPI_ExtremaSurfaceSurface::LowerDistance() const 
270 {
271   StdFail_NotDone_Raise_if
272     ( !myIsDone, "GeomAPI_ExtremaSurfaceSurface::LowerDistance");
273
274   return sqrt (myExtSS.SquareDistance(myIndex));
275 }
276
277
278 //=======================================================================
279 //function : Standard_Real
280 //purpose  : 
281 //=======================================================================
282
283 GeomAPI_ExtremaSurfaceSurface::operator Standard_Real() const
284 {
285   return LowerDistance();
286 }
287
288
289 //=======================================================================
290 //function : Standard_Integer
291 //purpose  : 
292 //=======================================================================
293
294 GeomAPI_ExtremaSurfaceSurface::operator Standard_Integer() const
295 {
296   return NbExtrema();
297 }
298
299
300