1 // Created on: 1994-03-17
2 // Created by: Bruno DUMORTIER
3 // Copyright (c) 1994-1999 Matra Datavision
4 // Copyright (c) 1999-2012 OPEN CASCADE SAS
6 // The content of this file is subject to the Open CASCADE Technology Public
7 // License Version 6.5 (the "License"). You may not use the content of this file
8 // except in compliance with the License. Please obtain a copy of the License
9 // at http://www.opencascade.org and read it completely before using this file.
11 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
12 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
14 // The Original Code and all software distributed under the License is
15 // distributed on an "AS IS" basis, without warranty of any kind, and the
16 // Initial Developer hereby disclaims all such warranties, including without
17 // limitation, any warranties of merchantability, fitness for a particular
18 // purpose or non-infringement. Please see the License for the specific terms
19 // and conditions governing the rights and limitations under the License.
23 #include <GeomAPI_ProjectPointOnSurf.ixx>
25 #include <GeomAdaptor_Surface.hxx>
27 #include <Precision.hxx>
29 //=======================================================================
30 //function : GeomAPI_ProjectPointOnSurf
32 //=======================================================================
33 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf()
34 : myIsDone (Standard_False) { }
37 //=======================================================================
38 //function : GeomAPI_ProjectPointOnSurf
40 //=======================================================================
41 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
42 const Handle(Geom_Surface)& Surface)
46 //=======================================================================
47 //function : GeomAPI_ProjectPointOnSurf
49 //=======================================================================
50 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
51 const Handle(Geom_Surface)& Surface,
52 const Standard_Real Tolerance)
54 Init (P, Surface, Tolerance);
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)
68 Init (P, Surface, Umin, Usup, Vmin, Vsup);
70 //=======================================================================
71 //function : GeomAPI_ProjectPointOnSurf
73 //=======================================================================
74 GeomAPI_ProjectPointOnSurf::GeomAPI_ProjectPointOnSurf (const gp_Pnt& P,
75 const Handle(Geom_Surface)& Surface,
76 const Standard_Real Umin,
77 const Standard_Real Usup,
78 const Standard_Real Vmin,
79 const Standard_Real Vsup,
80 const Standard_Real Tolerance)
83 Init (P, Surface, Umin, Usup, Vmin, Vsup, Tolerance);
85 //=======================================================================
88 //=======================================================================
89 void GeomAPI_ProjectPointOnSurf::Init ()
91 myIsDone = myExtPS.IsDone() && ( myExtPS.NbExt() > 0);
94 // evaluate the lower distance and its index;
95 Standard_Real Dist2, Dist2Min = myExtPS.SquareDistance(1);
98 for ( Standard_Integer i = 2; i <= myExtPS.NbExt(); i++) {
99 Dist2 = myExtPS.SquareDistance(i);
100 if (Dist2 < Dist2Min) {
107 //=======================================================================
110 //=======================================================================
111 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
112 const Handle(Geom_Surface)& Surface)
115 Init (P, Surface, Precision::Confusion());
117 //=======================================================================
120 //=======================================================================
121 void GeomAPI_ProjectPointOnSurf::Init(const gp_Pnt& P,
122 const Handle(Geom_Surface)& Surface,
123 const Standard_Real Tolerance)
126 //modified by NIZNHY-PKV Thu Apr 4 10:37:55 2002 f
127 //GeomAdaptor_Surface TheSurface (Surface);
128 //myExtPS = Extrema_ExtPS (P, TheSurface, Tolerance, Tolerance);
130 //modified by NIZNHY-PKV Mon Apr 8 11:13:37 2002 f XXX
131 Standard_Real Umin, Usup, Vmin, Vsup;
132 Surface->Bounds(Umin, Usup, Vmin, Vsup);
133 myGeomAdaptor.Load(Surface, Umin, Usup, Vmin, Vsup);
135 //myExtPS = Extrema_ExtPS();
136 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
138 //XXXmyExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tolerance, Tolerance);
139 //modified by NIZNHY-PKV Mon Apr 8 11:13:44 2002 t XXX
141 //modified by NIZNHY-PKV Thu Apr 4 10:37:58 2002 t
146 //=======================================================================
149 //=======================================================================
150 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
151 const Handle(Geom_Surface)& Surface,
152 const Standard_Real Umin,
153 const Standard_Real Usup,
154 const Standard_Real Vmin,
155 const Standard_Real Vsup )
157 Standard_Real Tolerance = Precision::PConfusion();
158 //modified by NIZNHY-PKV Thu Apr 4 10:38:23 2002 f
159 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
160 //myExtPS = Extrema_ExtPS (P, TheSurface, Tol, Tol);
161 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
162 //myExtPS = Extrema_ExtPS();
163 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
165 //XXX myExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tol, Tol);
166 //modified by NIZNHY-PKV Thu Apr 4 10:38:30 2002 t
170 //=======================================================================
173 //=======================================================================
174 void GeomAPI_ProjectPointOnSurf::Init (const gp_Pnt& P,
175 const Handle(Geom_Surface)& Surface,
176 const Standard_Real Umin,
177 const Standard_Real Usup,
178 const Standard_Real Vmin,
179 const Standard_Real Vsup,
180 const Standard_Real Tolerance)
182 //modified by NIZNHY-PKV Thu Apr 4 10:39:10 2002 f
183 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
184 //myExtPS = Extrema_ExtPS (P, TheSurface, Tolerance, Tolerance);
185 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
186 //myExtPS = Extrema_ExtPS();
187 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
189 //XXX myExtPS = Extrema_ExtPS (P, myGeomAdaptor, Tolerance, Tolerance);
190 //modified by NIZNHY-PKV Thu Apr 4 10:39:14 2002 t
193 //=======================================================================
196 //=======================================================================
197 void GeomAPI_ProjectPointOnSurf::Init (const Handle(Geom_Surface)& Surface,
198 const Standard_Real Umin,
199 const Standard_Real Usup,
200 const Standard_Real Vmin,
201 const Standard_Real Vsup )
203 Standard_Real Tolerance = Precision::PConfusion();
204 //modified by NIZNHY-PKV Thu Apr 4 10:41:50 2002 f
205 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
206 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
207 //modified by NIZNHY-PKV Thu Apr 4 10:42:29 2002 t
208 //myExtPS = Extrema_ExtPS();
209 //modified by NIZNHY-PKV Thu Apr 4 10:42:32 2002 f
210 //myExtPS.Initialize(TheSurface, Umin, Usup, Vmin, Vsup, Tol, Tol);
211 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
212 //modified by NIZNHY-PKV Thu Apr 4 10:42:39 2002 t
213 myIsDone = Standard_False;
215 //=======================================================================
218 //=======================================================================
219 void GeomAPI_ProjectPointOnSurf::Init (const Handle(Geom_Surface)& Surface,
220 const Standard_Real Umin,
221 const Standard_Real Usup,
222 const Standard_Real Vmin,
223 const Standard_Real Vsup,
224 const Standard_Real Tolerance)
226 //modified by NIZNHY-PKV Thu Apr 4 10:43:00 2002 f
227 //GeomAdaptor_Surface TheSurface (Surface,Umin,Usup,Vmin,Vsup);
228 myGeomAdaptor.Load(Surface, Umin,Usup,Vmin,Vsup);
229 //modified by NIZNHY-PKV Thu Apr 4 10:43:16 2002 t
230 //myExtPS = Extrema_ExtPS();
231 //modified by NIZNHY-PKV Thu Apr 4 10:43:18 2002 f
232 //myExtPS.Initialize(TheSurface, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
233 myExtPS.Initialize(myGeomAdaptor, Umin, Usup, Vmin, Vsup, Tolerance, Tolerance);
234 //modified by NIZNHY-PKV Thu Apr 4 10:43:26 2002 t
235 myIsDone = Standard_False;
237 //=======================================================================
240 //=======================================================================
241 void GeomAPI_ProjectPointOnSurf::Perform(const gp_Pnt& P)
246 //=======================================================================
249 //=======================================================================
250 Standard_Boolean GeomAPI_ProjectPointOnSurf::IsDone () const
254 //=======================================================================
255 //function : NbPoints
257 //=======================================================================
258 Standard_Integer GeomAPI_ProjectPointOnSurf::NbPoints() const
261 return myExtPS.NbExt();
267 //=======================================================================
270 //=======================================================================
271 gp_Pnt GeomAPI_ProjectPointOnSurf::Point(const Standard_Integer Index) const
273 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
274 "GeomAPI_ProjectPointOnSurf::Point");
275 return (myExtPS.Point(Index)).Value();
277 //=======================================================================
278 //function : Parameters
280 //=======================================================================
281 void GeomAPI_ProjectPointOnSurf::Parameters(const Standard_Integer Index,
283 Standard_Real& V) const
285 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
286 "GeomAPI_ProjectPointOnSurf::Parameter");
287 (myExtPS.Point(Index)).Parameter(U,V);
289 //=======================================================================
290 //function : Distance
292 //=======================================================================
293 Standard_Real GeomAPI_ProjectPointOnSurf::Distance (const Standard_Integer Index) const
295 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
296 "GeomAPI_ProjectPointOnSurf::Distance");
297 return sqrt (myExtPS.SquareDistance(Index));
299 //=======================================================================
300 //function : NearestPoint
302 //=======================================================================
303 gp_Pnt GeomAPI_ProjectPointOnSurf::NearestPoint() const
305 StdFail_NotDone_Raise_if
306 (!myIsDone, "GeomAPI_ProjectPointOnSurf::NearestPoint");
308 return (myExtPS.Point(myIndex)).Value();
310 //=======================================================================
311 //function : Standard_Integer
313 //=======================================================================
314 GeomAPI_ProjectPointOnSurf::operator Standard_Integer() const
318 //=======================================================================
321 //=======================================================================
322 GeomAPI_ProjectPointOnSurf::operator gp_Pnt() const
324 return NearestPoint();
326 //=======================================================================
327 //function : LowerDistanceParameters
329 //=======================================================================
330 void GeomAPI_ProjectPointOnSurf::LowerDistanceParameters (Standard_Real& U,
331 Standard_Real& V ) const
333 StdFail_NotDone_Raise_if
334 (!myIsDone, "GeomAPI_ProjectPointOnSurf::LowerDistanceParameters");
336 (myExtPS.Point(myIndex)).Parameter(U,V);
338 //=======================================================================
339 //function : LowerDistance
341 //=======================================================================
342 Standard_Real GeomAPI_ProjectPointOnSurf::LowerDistance() const
344 StdFail_NotDone_Raise_if
345 (!myIsDone, "GeomAPI_ProjectPointOnSurf::LowerDistance");
347 return sqrt (myExtPS.SquareDistance(myIndex));
349 //=======================================================================
350 //function : Standard_Real
352 //=======================================================================
353 GeomAPI_ProjectPointOnSurf::operator Standard_Real() const
355 return LowerDistance();