1 // Created on: 1993-03-24
3 // Copyright (c) 1993-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.
19 #include <Geom2d_Geometry.hxx>
20 #include <Geom2d_Hyperbola.hxx>
22 #include <gp_Ax2d.hxx>
23 #include <gp_Ax22d.hxx>
24 #include <gp_Dir2d.hxx>
25 #include <gp_Hypr2d.hxx>
26 #include <gp_Pnt2d.hxx>
27 #include <gp_Trsf2d.hxx>
28 #include <gp_Vec2d.hxx>
30 #include <Precision.hxx>
31 #include <Standard_ConstructionError.hxx>
32 #include <Standard_DomainError.hxx>
33 #include <Standard_RangeError.hxx>
34 #include <Standard_Type.hxx>
36 typedef Geom2d_Hyperbola Hyperbola;
38 typedef gp_Dir2d Dir2d;
39 typedef gp_Pnt2d Pnt2d;
40 typedef gp_Vec2d Vec2d;
41 typedef gp_Trsf2d Trsf2d;
44 //=======================================================================
47 //=======================================================================
49 Handle(Geom2d_Geometry) Geom2d_Hyperbola::Copy() const
51 Handle(Geom2d_Hyperbola) H;
52 H = new Hyperbola (pos, majorRadius, minorRadius);
58 //=======================================================================
59 //function : Geom2d_Hyperbola
61 //=======================================================================
63 Geom2d_Hyperbola::Geom2d_Hyperbola (const gp_Hypr2d& H)
65 majorRadius = H.MajorRadius();
66 minorRadius = H.MinorRadius();
71 //=======================================================================
72 //function : Geom2d_Hyperbola
74 //=======================================================================
76 Geom2d_Hyperbola::Geom2d_Hyperbola (const Ax2d& A,
77 const Standard_Real MajorRadius,
78 const Standard_Real MinorRadius,
79 const Standard_Boolean Sense)
80 : majorRadius (MajorRadius), minorRadius (MinorRadius)
82 if( MajorRadius < 0.0|| MinorRadius < 0.0)
83 Standard_ConstructionError::Raise();
84 pos = gp_Ax22d(A, Sense);
87 //=======================================================================
88 //function : Geom2d_Hyperbola
90 //=======================================================================
92 Geom2d_Hyperbola::Geom2d_Hyperbola (const gp_Ax22d& Axis,
93 const Standard_Real MajorRadius,
94 const Standard_Real MinorRadius)
95 : majorRadius (MajorRadius), minorRadius (MinorRadius)
97 if( MajorRadius < 0.0|| MinorRadius < 0.0)
98 Standard_ConstructionError::Raise();
103 //=======================================================================
104 //function : SetHypr2d
106 //=======================================================================
108 void Geom2d_Hyperbola::SetHypr2d (const gp_Hypr2d& H)
110 majorRadius = H.MajorRadius();
111 minorRadius = H.MinorRadius();
116 //=======================================================================
117 //function : SetMajorRadius
119 //=======================================================================
121 void Geom2d_Hyperbola::SetMajorRadius (const Standard_Real MajorRadius)
123 if (MajorRadius < 0.0)
124 Standard_ConstructionError::Raise();
126 majorRadius = MajorRadius;
130 //=======================================================================
131 //function : SetMinorRadius
133 //=======================================================================
135 void Geom2d_Hyperbola::SetMinorRadius (const Standard_Real MinorRadius)
137 if (MinorRadius < 0.0 )
138 Standard_ConstructionError::Raise();
140 minorRadius = MinorRadius;
144 //=======================================================================
147 //=======================================================================
149 gp_Hypr2d Geom2d_Hyperbola::Hypr2d () const
151 return gp_Hypr2d (pos, majorRadius, minorRadius);
155 //=======================================================================
156 //function : ReversedParameter
158 //=======================================================================
160 Standard_Real Geom2d_Hyperbola::ReversedParameter( const Standard_Real U) const
165 //=======================================================================
166 //function : FirstParameter
168 //=======================================================================
170 Standard_Real Geom2d_Hyperbola::FirstParameter () const
172 return -Precision::Infinite();
175 //=======================================================================
176 //function : LastParameter
178 //=======================================================================
180 Standard_Real Geom2d_Hyperbola::LastParameter () const
182 return Precision::Infinite();
185 //=======================================================================
186 //function : IsClosed
188 //=======================================================================
190 Standard_Boolean Geom2d_Hyperbola::IsClosed () const
192 return Standard_False;
195 //=======================================================================
196 //function : IsPeriodic
198 //=======================================================================
200 Standard_Boolean Geom2d_Hyperbola::IsPeriodic () const
202 return Standard_False;
205 //=======================================================================
206 //function : Asymptote1
208 //=======================================================================
210 Ax2d Geom2d_Hyperbola::Asymptote1 () const
212 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
213 return Hv.Asymptote1();
216 //=======================================================================
217 //function : Asymptote2
219 //=======================================================================
221 Ax2d Geom2d_Hyperbola::Asymptote2 () const
223 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
224 return Hv.Asymptote2();
227 //=======================================================================
228 //function : ConjugateBranch1
230 //=======================================================================
232 gp_Hypr2d Geom2d_Hyperbola::ConjugateBranch1 () const
234 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
235 return Hv.ConjugateBranch1 ();
238 //=======================================================================
239 //function : ConjugateBranch2
241 //=======================================================================
243 gp_Hypr2d Geom2d_Hyperbola::ConjugateBranch2 () const
245 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
246 return Hv.ConjugateBranch2 ();
249 //=======================================================================
250 //function : Directrix1
252 //=======================================================================
254 Ax2d Geom2d_Hyperbola::Directrix1 () const
256 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
257 return Hv.Directrix1 ();
260 //=======================================================================
261 //function : Directrix2
263 //=======================================================================
265 Ax2d Geom2d_Hyperbola::Directrix2 () const
267 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
268 return Hv.Directrix2 ();
271 //=======================================================================
272 //function : Eccentricity
274 //=======================================================================
276 Standard_Real Geom2d_Hyperbola::Eccentricity () const
278 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), " ");
280 (Sqrt(majorRadius*majorRadius+minorRadius*minorRadius))/majorRadius;
283 //=======================================================================
286 //=======================================================================
288 Standard_Real Geom2d_Hyperbola::Focal () const
290 return 2.0 * Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
293 //=======================================================================
296 //=======================================================================
298 Pnt2d Geom2d_Hyperbola::Focus1 () const
300 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
301 XY Pxy = pos.XDirection().XY();
303 Pxy.Add (pos.Location().XY());
307 //=======================================================================
310 //=======================================================================
312 Pnt2d Geom2d_Hyperbola::Focus2 () const
314 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
315 XY Pxy = pos.XDirection().XY();
317 Pxy.Add (pos.Location().XY());
321 //=======================================================================
322 //function : MajorRadius
324 //=======================================================================
326 Standard_Real Geom2d_Hyperbola::MajorRadius () const
331 //=======================================================================
332 //function : MinorRadius
334 //=======================================================================
336 Standard_Real Geom2d_Hyperbola::MinorRadius () const
341 //=======================================================================
342 //function : OtherBranch
344 //=======================================================================
346 gp_Hypr2d Geom2d_Hyperbola::OtherBranch () const
348 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
349 return Hv.OtherBranch ();
353 //=======================================================================
354 //function : Parameter
356 //=======================================================================
358 Standard_Real Geom2d_Hyperbola::Parameter () const
360 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), " ");
361 return (minorRadius * minorRadius) / majorRadius;
364 //=======================================================================
367 //=======================================================================
369 void Geom2d_Hyperbola::D0 (const Standard_Real U,
372 P = ElCLib::HyperbolaValue (U, pos, majorRadius, minorRadius);
375 //=======================================================================
378 //=======================================================================
380 void Geom2d_Hyperbola::D1 (const Standard_Real U,
384 ElCLib::HyperbolaD1 (U, pos, majorRadius, minorRadius, P, V1);
388 //=======================================================================
391 //=======================================================================
393 void Geom2d_Hyperbola::D2 (const Standard_Real U,
395 Vec2d& V1, Vec2d& V2) const
397 ElCLib::HyperbolaD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
401 //=======================================================================
404 //=======================================================================
406 void Geom2d_Hyperbola::D3 (const Standard_Real U,
408 Vec2d& V1, Vec2d& V2, Vec2d& V3) const
410 ElCLib::HyperbolaD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
414 //=======================================================================
417 //=======================================================================
419 Vec2d Geom2d_Hyperbola::DN (const Standard_Real U, const Standard_Integer N) const
421 Standard_RangeError_Raise_if (N < 1, " ");
422 return ElCLib::HyperbolaDN (U, pos, majorRadius, minorRadius, N);
426 //=======================================================================
427 //function : Transform
429 //=======================================================================
431 void Geom2d_Hyperbola::Transform (const Trsf2d& T)
433 majorRadius = majorRadius * Abs (T.ScaleFactor());
434 minorRadius = minorRadius * Abs (T.ScaleFactor());