1 // Created on: 1994-03-17
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_ExtPS.hxx>
19 #include <Geom_Surface.hxx>
20 #include <GeomAdaptor_Surface.hxx>
21 #include <GeomAPI_ProjectPointOnSurf.hxx>
23 #include <Precision.hxx>
24 #include <Standard_OutOfRange.hxx>
25 #include <StdFail_NotDone.hxx>
27 //=======================================================================
28 //function : GeomAPI_ProjectPointOnSurf
30 //=======================================================================
31 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf()
32 : myIsDone (Standard_False) { }
35 //=======================================================================
36 //function : GeomAPI_ProjectPointOnSurf
38 //=======================================================================
39 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
40 const Handle(Geom_Surface)& Surface,
41 const Extrema_ExtAlgo theProjAlgo)
43 Init (P, Surface, theProjAlgo);
45 //=======================================================================
46 //function : GeomAPI_ProjectPointOnSurf
48 //=======================================================================
49 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
50 const Handle(Geom_Surface)& Surface,
51 const Standard_Real Tolerance,
52 const Extrema_ExtAlgo theProjAlgo)
54 Init (P, Surface, Tolerance, theProjAlgo);
56 //=======================================================================
57 //function : GeomAPI_ProjectPointOnSurf
59 //=======================================================================
60 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf(const gp_Pnt& P,
61 const Handle(Geom_Surface)& Surface,
62 const Standard_Real Umin,
63 const Standard_Real Usup,
64 const Standard_Real Vmin,
65 const Standard_Real Vsup,
66 const Extrema_ExtAlgo theProjAlgo)
69 Init (P, Surface, Umin, Usup, Vmin, Vsup, theProjAlgo);
71 //=======================================================================
72 //function : GeomAPI_ProjectPointOnSurf
74 //=======================================================================
75 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
76 const Handle(Geom_Surface)& Surface,
77 const Standard_Real Umin,
78 const Standard_Real Usup,
79 const Standard_Real Vmin,
80 const Standard_Real Vsup,
81 const Standard_Real Tolerance,
82 const Extrema_ExtAlgo theProjAlgo)
85 Init (P, Surface, Umin, Usup, Vmin, Vsup, Tolerance, theProjAlgo);
87 //=======================================================================
90 //=======================================================================
91 void GeomAPI_ProjectPointOnSurf::Init ()
93 myIsDone = myExtPS.IsDone() && ( myExtPS.NbExt() > 0);
96 // evaluate the lower distance and its index;
97 Standard_Real Dist2, Dist2Min = myExtPS.SquareDistance(1);
100 for ( Standard_Integer i = 2; i <= myExtPS.NbExt(); i++) {
101 Dist2 = myExtPS.SquareDistance(i);
102 if (Dist2 < Dist2Min) {
109 //=======================================================================
112 //=======================================================================
113 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
114 const Handle(Geom_Surface)& Surface,
115 const Extrema_ExtAlgo theProjAlgo)
118 Init (P, Surface, Precision::Confusion(), theProjAlgo);
120 //=======================================================================
123 //=======================================================================
124 void GeomAPI_ProjectPointOnSurf::Init(const gp_Pnt& P,
125 const Handle(Geom_Surface)& Surface,
126 const Standard_Real Tolerance,
127 const Extrema_ExtAlgo theProjAlgo)
130 //modified by NIZNHY-PKV Thu Apr 4 10:37:55 2002 f
131 //GeomAdaptor_Surface TheSurface (Surface);
132 //myExtPS = Extrema_ExtPS (P, TheSurface, Tolerance, Tolerance);
134 //modified by NIZNHY-PKV Mon Apr 8 11:13:37 2002 f XXX
135 Standard_Real Umin, Usup, Vmin, Vsup;
136 Surface->Bounds(Umin, Usup, Vmin, Vsup);
137 myGeomAdaptor.Load(Surface, Umin, Usup, Vmin, Vsup);
139 //myExtPS = Extrema_ExtPS();
140 myExtPS.SetAlgo(theProjAlgo);
141 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
143 //XXXmyExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tolerance, Tolerance);
144 //modified by NIZNHY-PKV Mon Apr 8 11:13:44 2002 t XXX
146 //modified by NIZNHY-PKV Thu Apr 4 10:37:58 2002 t
151 //=======================================================================
154 //=======================================================================
155 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
156 const Handle(Geom_Surface)& Surface,
157 const Standard_Real Umin,
158 const Standard_Real Usup,
159 const Standard_Real Vmin,
160 const Standard_Real Vsup,
161 const Extrema_ExtAlgo theProjAlgo)
163 Standard_Real Tolerance = Precision::PConfusion();
164 //modified by NIZNHY-PKV Thu Apr 4 10:38:23 2002 f
165 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
166 //myExtPS = Extrema_ExtPS (P, TheSurface, Tol, Tol);
167 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
168 //myExtPS = Extrema_ExtPS();
169 myExtPS.SetAlgo(theProjAlgo);
170 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
172 //XXX myExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tol, Tol);
173 //modified by NIZNHY-PKV Thu Apr 4 10:38:30 2002 t
177 //=======================================================================
180 //=======================================================================
181 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
182 const Handle(Geom_Surface)& Surface,
183 const Standard_Real Umin,
184 const Standard_Real Usup,
185 const Standard_Real Vmin,
186 const Standard_Real Vsup,
187 const Standard_Real Tolerance,
188 const Extrema_ExtAlgo theProjAlgo)
190 //modified by NIZNHY-PKV Thu Apr 4 10:39:10 2002 f
191 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
192 //myExtPS = Extrema_ExtPS (P, TheSurface, Tolerance, Tolerance);
193 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
194 //myExtPS = Extrema_ExtPS();
195 myExtPS.SetAlgo(theProjAlgo);
196 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
198 //XXX myExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tolerance, Tolerance);
199 //modified by NIZNHY-PKV Thu Apr 4 10:39:14 2002 t
202 //=======================================================================
205 //=======================================================================
206 void GeomAPI_ProjectPointOnSurf::Init (const Handle(Geom_Surface)& Surface,
207 const Standard_Real Umin,
208 const Standard_Real Usup,
209 const Standard_Real Vmin,
210 const Standard_Real Vsup,
211 const Extrema_ExtAlgo theProjAlgo)
213 Standard_Real Tolerance = Precision::PConfusion();
214 //modified by NIZNHY-PKV Thu Apr 4 10:41:50 2002 f
215 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
216 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
217 //modified by NIZNHY-PKV Thu Apr 4 10:42:29 2002 t
218 //myExtPS = Extrema_ExtPS();
219 //modified by NIZNHY-PKV Thu Apr 4 10:42:32 2002 f
220 //myExtPS.Initialize(TheSurface, Umin, Usup, Vmin, Vsup, Tol, Tol);
221 myExtPS.SetAlgo(theProjAlgo);
222 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
223 //modified by NIZNHY-PKV Thu Apr 4 10:42:39 2002 t
224 myIsDone = Standard_False;
226 //=======================================================================
229 //=======================================================================
230 void GeomAPI_ProjectPointOnSurf::Init (const Handle(Geom_Surface)& Surface,
231 const Standard_Real Umin,
232 const Standard_Real Usup,
233 const Standard_Real Vmin,
234 const Standard_Real Vsup,
235 const Standard_Real Tolerance,
236 const Extrema_ExtAlgo theProjAlgo)
238 //modified by NIZNHY-PKV Thu Apr 4 10:43:00 2002 f
239 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
240 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
241 //modified by NIZNHY-PKV Thu Apr 4 10:43:16 2002 t
242 //myExtPS = Extrema_ExtPS();
243 //modified by NIZNHY-PKV Thu Apr 4 10:43:18 2002 f
244 //myExtPS.Initialize(TheSurface, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
245 myExtPS.SetAlgo(theProjAlgo);
246 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
247 //modified by NIZNHY-PKV Thu Apr 4 10:43:26 2002 t
248 myIsDone = Standard_False;
250 //=======================================================================
253 //=======================================================================
254 void GeomAPI_ProjectPointOnSurf::Perform(const gp_Pnt& P)
259 //=======================================================================
262 //=======================================================================
263 Standard_Boolean GeomAPI_ProjectPointOnSurf::IsDone () const
267 //=======================================================================
268 //function : NbPoints
270 //=======================================================================
271 Standard_Integer GeomAPI_ProjectPointOnSurf::NbPoints() const
274 return myExtPS.NbExt();
280 //=======================================================================
283 //=======================================================================
284 gp_Pnt GeomAPI_ProjectPointOnSurf::Point(const Standard_Integer Index) const
286 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
287 "GeomAPI_ProjectPointOnSurf::Point");
288 return (myExtPS.Point(Index)).Value();
290 //=======================================================================
291 //function : Parameters
293 //=======================================================================
294 void GeomAPI_ProjectPointOnSurf::Parameters(const Standard_Integer Index,
296 Standard_Real& V) const
298 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
299 "GeomAPI_ProjectPointOnSurf::Parameter");
300 (myExtPS.Point(Index)).Parameter(U,V);
302 //=======================================================================
303 //function : Distance
305 //=======================================================================
306 Standard_Real GeomAPI_ProjectPointOnSurf::Distance (const Standard_Integer Index) const
308 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
309 "GeomAPI_ProjectPointOnSurf::Distance");
310 return sqrt (myExtPS.SquareDistance(Index));
312 //=======================================================================
313 //function : NearestPoint
315 //=======================================================================
316 gp_Pnt GeomAPI_ProjectPointOnSurf::NearestPoint() const
318 StdFail_NotDone_Raise_if
319 (!myIsDone, "GeomAPI_ProjectPointOnSurf::NearestPoint");
321 return (myExtPS.Point(myIndex)).Value();
323 //=======================================================================
324 //function : Standard_Integer
326 //=======================================================================
327 GeomAPI_ProjectPointOnSurf::operator Standard_Integer() const
331 //=======================================================================
334 //=======================================================================
335 GeomAPI_ProjectPointOnSurf::operator gp_Pnt() const
337 return NearestPoint();
339 //=======================================================================
340 //function : LowerDistanceParameters
342 //=======================================================================
343 void GeomAPI_ProjectPointOnSurf::LowerDistanceParameters (Standard_Real& U,
344 Standard_Real& V ) const
346 StdFail_NotDone_Raise_if
347 (!myIsDone, "GeomAPI_ProjectPointOnSurf::LowerDistanceParameters");
349 (myExtPS.Point(myIndex)).Parameter(U,V);
351 //=======================================================================
352 //function : LowerDistance
354 //=======================================================================
355 Standard_Real GeomAPI_ProjectPointOnSurf::LowerDistance() const
357 StdFail_NotDone_Raise_if
358 (!myIsDone, "GeomAPI_ProjectPointOnSurf::LowerDistance");
360 return sqrt (myExtPS.SquareDistance(myIndex));
362 //=======================================================================
363 //function : Standard_Real
365 //=======================================================================
366 GeomAPI_ProjectPointOnSurf::operator Standard_Real() const
368 return LowerDistance();