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
6 // This file is part of Open CASCADE Technology software library.
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.
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
18 #include <Extrema_ExtCS.hxx>
19 #include <Extrema_POnCurv.hxx>
20 #include <Extrema_POnSurf.hxx>
21 #include <Geom_Curve.hxx>
22 #include <Geom_Surface.hxx>
23 #include <GeomAdaptor_Curve.hxx>
24 #include <GeomAdaptor_Surface.hxx>
25 #include <GeomAPI_ExtremaCurveSurface.hxx>
27 #include <Precision.hxx>
28 #include <Standard_OutOfRange.hxx>
29 #include <StdFail_NotDone.hxx>
31 //=======================================================================
32 //function : GeomAPI_ExtremaCurveSurface
34 //=======================================================================
35 GeomAPI_ExtremaCurveSurface::GeomAPI_ExtremaCurveSurface()
37 myIsDone = Standard_False;
41 //=======================================================================
42 //function : GeomAPI_ExtremaCurveSurface
44 //=======================================================================
46 GeomAPI_ExtremaCurveSurface::GeomAPI_ExtremaCurveSurface
47 (const Handle(Geom_Curve)& Curve,
48 const Handle(Geom_Surface)& Surface)
54 //=======================================================================
55 //function : GeomAPI_ExtremaCurveSurface
57 //=======================================================================
59 GeomAPI_ExtremaCurveSurface::GeomAPI_ExtremaCurveSurface
60 (const Handle(Geom_Curve)& Curve,
61 const Handle(Geom_Surface)& Surface,
62 const Standard_Real Wmin,
63 const Standard_Real Wmax,
64 const Standard_Real Umin,
65 const Standard_Real Umax,
66 const Standard_Real Vmin,
67 const Standard_Real Vmax)
69 Init(Curve,Surface,Wmin,Wmax,Umin,Umax,Vmin,Vmax);
73 //=======================================================================
76 //=======================================================================
78 void GeomAPI_ExtremaCurveSurface::Init
79 (const Handle(Geom_Curve)& Curve,
80 const Handle(Geom_Surface)& Surface)
82 GeomAdaptor_Curve TheCurve (Curve);
83 GeomAdaptor_Surface TheSurface (Surface);
85 Standard_Real Tol = Precision::PConfusion();
86 Extrema_ExtCS theExtCS(TheCurve,TheSurface,Tol,Tol);
89 myIsDone = myExtCS.IsDone() && (myExtCS.IsParallel() || myExtCS.NbExt() > 0);
93 // evaluate the lower distance and its index;
95 Standard_Real Dist2, Dist2Min = myExtCS.SquareDistance(1);
98 for ( Standard_Integer i = 2; i <= myExtCS.NbExt(); i++) {
99 Dist2 = myExtCS.SquareDistance(i);
100 if ( Dist2 < Dist2Min) {
109 //=======================================================================
112 //=======================================================================
114 void GeomAPI_ExtremaCurveSurface::Init
115 (const Handle(Geom_Curve)& Curve,
116 const Handle(Geom_Surface)& Surface,
117 const Standard_Real Wmin,
118 const Standard_Real Wmax,
119 const Standard_Real Umin,
120 const Standard_Real Umax,
121 const Standard_Real Vmin,
122 const Standard_Real Vmax)
124 GeomAdaptor_Curve TheCurve (Curve, Wmin, Wmax);
125 GeomAdaptor_Surface TheSurface (Surface, Umin, Umax, Vmin, Vmax);
127 Standard_Real Tol = Precision::PConfusion();
128 Extrema_ExtCS theExtCS(TheCurve,TheSurface,
129 Wmin,Wmax,Umin,Umax,Vmin,Vmax,Tol,Tol);
132 myIsDone = myExtCS.IsDone() && (myExtCS.IsParallel() || myExtCS.NbExt() > 0);
136 // evaluate the lower distance and its index;
138 Standard_Real Dist2, Dist2Min = myExtCS.SquareDistance(1);
141 for ( Standard_Integer i = 2; i <= myExtCS.NbExt(); i++) {
142 Dist2 = myExtCS.SquareDistance(i);
143 if ( Dist2 < Dist2Min) {
152 //=======================================================================
153 //function : NbExtrema
155 //=======================================================================
157 Standard_Integer GeomAPI_ExtremaCurveSurface::NbExtrema() const
160 return myExtCS.NbExt();
166 //=======================================================================
169 //=======================================================================
171 void GeomAPI_ExtremaCurveSurface::Points
172 (const Standard_Integer Index,
176 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
177 "GeomAPI_ExtremaCurveCurve::Points");
181 myExtCS.Points(Index,PC,PS);
188 //=======================================================================
189 //function : Parameters
191 //=======================================================================
193 void GeomAPI_ExtremaCurveSurface::Parameters
194 (const Standard_Integer Index,
197 Standard_Real& V) const
199 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
200 "GeomAPI_ExtremaCurveCurve::Parameters");
204 myExtCS.Points(Index,PC,PS);
211 //=======================================================================
212 //function : Distance
214 //=======================================================================
216 Standard_Real GeomAPI_ExtremaCurveSurface::Distance
217 (const Standard_Integer Index) const
219 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbExtrema(),
220 "GeomAPI_ExtremaCurveCurve::Distance");
222 return sqrt (myExtCS.SquareDistance(Index));
226 //=======================================================================
227 //function : NearestPoints
229 //=======================================================================
231 void GeomAPI_ExtremaCurveSurface::NearestPoints(gp_Pnt& PC, gp_Pnt& PS) const
233 StdFail_NotDone_Raise_if
234 (!myIsDone, "GeomAPI_ExtremaCurveSurface::NearestPoints");
236 Points(myIndex,PC,PS);
240 //=======================================================================
241 //function : LowerDistanceParameters
243 //=======================================================================
245 void GeomAPI_ExtremaCurveSurface::LowerDistanceParameters
248 Standard_Real& V) const
250 StdFail_NotDone_Raise_if
251 (!myIsDone, "GeomAPI_ExtremaCurveSurface::LowerDistanceParameters");
253 Parameters(myIndex,W,U,V);
257 //=======================================================================
258 //function : LowerDistance
260 //=======================================================================
262 Standard_Real GeomAPI_ExtremaCurveSurface::LowerDistance() const
264 StdFail_NotDone_Raise_if
265 (!myIsDone, "GeomAPI_ExtremaCurveSurface::LowerDistance");
267 return sqrt (myExtCS.SquareDistance(myIndex));
271 //=======================================================================
272 //function : Standard_Integer
274 //=======================================================================
276 GeomAPI_ExtremaCurveSurface::operator Standard_Integer() const
282 //=======================================================================
283 //function : Standard_Real
285 //=======================================================================
287 GeomAPI_ExtremaCurveSurface::operator Standard_Real() const
289 return LowerDistance();