1 // Created on: 1994-03-23
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_ExtPC2d.hxx>
19 #include <Geom2d_Curve.hxx>
20 #include <Geom2dAdaptor_Curve.hxx>
21 #include <Geom2dAPI_ProjectPointOnCurve.hxx>
22 #include <gp_Pnt2d.hxx>
23 #include <Standard_OutOfRange.hxx>
24 #include <StdFail_NotDone.hxx>
26 //=======================================================================
27 //function : Geom2dAPI_ProjectPointOnCurve
29 //=======================================================================
30 Geom2dAPI_ProjectPointOnCurve::Geom2dAPI_ProjectPointOnCurve()
32 myIsDone = Standard_False;
36 //=======================================================================
37 //function : Geom2dAPI_ProjectPointOnCurve
39 //=======================================================================
41 Geom2dAPI_ProjectPointOnCurve::Geom2dAPI_ProjectPointOnCurve
43 const Handle(Geom2d_Curve)& Curve)
49 //=======================================================================
50 //function : Geom2dAPI_ProjectPointOnCurve
52 //=======================================================================
54 Geom2dAPI_ProjectPointOnCurve::Geom2dAPI_ProjectPointOnCurve
56 const Handle(Geom2d_Curve)& Curve,
57 const Standard_Real Umin,
58 const Standard_Real Usup)
60 Init(P,Curve,Umin,Usup);
64 //=======================================================================
67 //=======================================================================
69 void Geom2dAPI_ProjectPointOnCurve::Init
71 const Handle(Geom2d_Curve)& Curve)
73 Init(P,Curve,Curve->FirstParameter(),Curve->LastParameter());
77 //=======================================================================
80 //=======================================================================
82 void Geom2dAPI_ProjectPointOnCurve::Init
84 const Handle(Geom2d_Curve)& Curve,
85 const Standard_Real Umin,
86 const Standard_Real Usup )
88 myC.Load(Curve,Umin,Usup);
90 Extrema_ExtPC2d theExtPC2d(P, myC);
94 myIsDone = myExtPC.IsDone() && ( myExtPC.NbExt() > 0);
97 // evaluate the lower distance and its index;
100 Standard_Real Dist2, Dist2Min = myExtPC.SquareDistance(1);
103 for ( Standard_Integer i = 2; i <= myExtPC.NbExt(); i++) {
104 Dist2 = myExtPC.SquareDistance(i);
105 if ( Dist2 < Dist2Min) {
114 //=======================================================================
115 //function : NbPoints
117 //=======================================================================
119 Standard_Integer Geom2dAPI_ProjectPointOnCurve::NbPoints() const
122 return myExtPC.NbExt();
128 //=======================================================================
131 //=======================================================================
133 gp_Pnt2d Geom2dAPI_ProjectPointOnCurve::Point
134 (const Standard_Integer Index) const
136 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
137 "Geom2dAPI_ProjectPointOnCurve::Point");
138 return (myExtPC.Point(Index)).Value();
142 //=======================================================================
143 //function : Parameter
145 //=======================================================================
147 Standard_Real Geom2dAPI_ProjectPointOnCurve::Parameter
148 (const Standard_Integer Index) const
150 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
151 "Geom2dAPI_ProjectPointOnCurve::Parameter");
152 return (myExtPC.Point(Index)).Parameter();
156 //=======================================================================
157 //function : Parameter
159 //=======================================================================
161 void Geom2dAPI_ProjectPointOnCurve::Parameter
162 (const Standard_Integer Index,
163 Standard_Real& U ) const
165 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
166 "Geom2dAPI_ProjectPointOnCurve::Parameter");
167 U = (myExtPC.Point(Index)).Parameter();
171 //=======================================================================
172 //function : Distance
174 //=======================================================================
176 Standard_Real Geom2dAPI_ProjectPointOnCurve::Distance
177 (const Standard_Integer Index) const
179 Standard_OutOfRange_Raise_if( Index < 1 || Index > NbPoints(),
180 "Geom2dAPI_ProjectPointOnCurve::Distance");
181 return sqrt(myExtPC.SquareDistance(Index));
185 //=======================================================================
186 //function : NearestPoint
188 //=======================================================================
190 gp_Pnt2d Geom2dAPI_ProjectPointOnCurve::NearestPoint() const
192 StdFail_NotDone_Raise_if
193 (!myIsDone, "Geom2dAPI_ProjectPointOnCurve:NearestPoint");
195 return (myExtPC.Point(myIndex)).Value();
199 //=======================================================================
200 //function : Standard_Integer
202 //=======================================================================
204 Geom2dAPI_ProjectPointOnCurve::operator Standard_Integer() const
210 //=======================================================================
211 //function : gp_Pnt2d
213 //=======================================================================
215 Geom2dAPI_ProjectPointOnCurve::operator gp_Pnt2d() const
217 return NearestPoint();
221 //=======================================================================
222 //function : LowerDistanceParameter
224 //=======================================================================
226 Standard_Real Geom2dAPI_ProjectPointOnCurve::LowerDistanceParameter() const
228 StdFail_NotDone_Raise_if
229 (!myIsDone, "Geom2dAPI_ProjectPointOnCurve:LowerDistanceParameter");
231 return (myExtPC.Point(myIndex)).Parameter();
235 //=======================================================================
236 //function : LowerDistance
238 //=======================================================================
240 Standard_Real Geom2dAPI_ProjectPointOnCurve::LowerDistance() const
242 StdFail_NotDone_Raise_if
243 (!myIsDone,"Geom2dAPI_ProjectPointOnCurve:LowerDistance");
245 return sqrt (myExtPC.SquareDistance(myIndex));
249 //=======================================================================
250 //function : operator
252 //=======================================================================
254 Geom2dAPI_ProjectPointOnCurve::operator Standard_Real() const
256 return LowerDistance();