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 IMPLEMENT_STANDARD_RTTIEXT(Geom2d_Hyperbola,Geom2d_Conic)
38 typedef Geom2d_Hyperbola Hyperbola;
40 typedef gp_Dir2d Dir2d;
41 typedef gp_Pnt2d Pnt2d;
42 typedef gp_Vec2d Vec2d;
43 typedef gp_Trsf2d Trsf2d;
46 //=======================================================================
49 //=======================================================================
51 Handle(Geom2d_Geometry) Geom2d_Hyperbola::Copy() const
53 Handle(Geom2d_Hyperbola) H;
54 H = new Hyperbola (pos, majorRadius, minorRadius);
60 //=======================================================================
61 //function : Geom2d_Hyperbola
63 //=======================================================================
65 Geom2d_Hyperbola::Geom2d_Hyperbola (const gp_Hypr2d& H)
67 majorRadius = H.MajorRadius();
68 minorRadius = H.MinorRadius();
73 //=======================================================================
74 //function : Geom2d_Hyperbola
76 //=======================================================================
78 Geom2d_Hyperbola::Geom2d_Hyperbola (const Ax2d& A,
79 const Standard_Real MajorRadius,
80 const Standard_Real MinorRadius,
81 const Standard_Boolean Sense)
82 : majorRadius (MajorRadius), minorRadius (MinorRadius)
84 if( MajorRadius < 0.0|| MinorRadius < 0.0)
85 throw Standard_ConstructionError();
86 pos = gp_Ax22d(A, Sense);
89 //=======================================================================
90 //function : Geom2d_Hyperbola
92 //=======================================================================
94 Geom2d_Hyperbola::Geom2d_Hyperbola (const gp_Ax22d& Axis,
95 const Standard_Real MajorRadius,
96 const Standard_Real MinorRadius)
97 : majorRadius (MajorRadius), minorRadius (MinorRadius)
99 if( MajorRadius < 0.0|| MinorRadius < 0.0)
100 throw Standard_ConstructionError();
105 //=======================================================================
106 //function : SetHypr2d
108 //=======================================================================
110 void Geom2d_Hyperbola::SetHypr2d (const gp_Hypr2d& H)
112 majorRadius = H.MajorRadius();
113 minorRadius = H.MinorRadius();
118 //=======================================================================
119 //function : SetMajorRadius
121 //=======================================================================
123 void Geom2d_Hyperbola::SetMajorRadius (const Standard_Real MajorRadius)
125 if (MajorRadius < 0.0)
126 throw Standard_ConstructionError();
128 majorRadius = MajorRadius;
132 //=======================================================================
133 //function : SetMinorRadius
135 //=======================================================================
137 void Geom2d_Hyperbola::SetMinorRadius (const Standard_Real MinorRadius)
139 if (MinorRadius < 0.0 )
140 throw Standard_ConstructionError();
142 minorRadius = MinorRadius;
146 //=======================================================================
149 //=======================================================================
151 gp_Hypr2d Geom2d_Hyperbola::Hypr2d () const
153 return gp_Hypr2d (pos, majorRadius, minorRadius);
157 //=======================================================================
158 //function : ReversedParameter
160 //=======================================================================
162 Standard_Real Geom2d_Hyperbola::ReversedParameter( const Standard_Real U) const
167 //=======================================================================
168 //function : FirstParameter
170 //=======================================================================
172 Standard_Real Geom2d_Hyperbola::FirstParameter () const
174 return -Precision::Infinite();
177 //=======================================================================
178 //function : LastParameter
180 //=======================================================================
182 Standard_Real Geom2d_Hyperbola::LastParameter () const
184 return Precision::Infinite();
187 //=======================================================================
188 //function : IsClosed
190 //=======================================================================
192 Standard_Boolean Geom2d_Hyperbola::IsClosed () const
194 return Standard_False;
197 //=======================================================================
198 //function : IsPeriodic
200 //=======================================================================
202 Standard_Boolean Geom2d_Hyperbola::IsPeriodic () const
204 return Standard_False;
207 //=======================================================================
208 //function : Asymptote1
210 //=======================================================================
212 Ax2d Geom2d_Hyperbola::Asymptote1 () const
214 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
215 return Hv.Asymptote1();
218 //=======================================================================
219 //function : Asymptote2
221 //=======================================================================
223 Ax2d Geom2d_Hyperbola::Asymptote2 () const
225 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
226 return Hv.Asymptote2();
229 //=======================================================================
230 //function : ConjugateBranch1
232 //=======================================================================
234 gp_Hypr2d Geom2d_Hyperbola::ConjugateBranch1 () const
236 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
237 return Hv.ConjugateBranch1 ();
240 //=======================================================================
241 //function : ConjugateBranch2
243 //=======================================================================
245 gp_Hypr2d Geom2d_Hyperbola::ConjugateBranch2 () const
247 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
248 return Hv.ConjugateBranch2 ();
251 //=======================================================================
252 //function : Directrix1
254 //=======================================================================
256 Ax2d Geom2d_Hyperbola::Directrix1 () const
258 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
259 return Hv.Directrix1 ();
262 //=======================================================================
263 //function : Directrix2
265 //=======================================================================
267 Ax2d Geom2d_Hyperbola::Directrix2 () const
269 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
270 return Hv.Directrix2 ();
273 //=======================================================================
274 //function : Eccentricity
276 //=======================================================================
278 Standard_Real Geom2d_Hyperbola::Eccentricity () const
280 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), " ");
282 (Sqrt(majorRadius*majorRadius+minorRadius*minorRadius))/majorRadius;
285 //=======================================================================
288 //=======================================================================
290 Standard_Real Geom2d_Hyperbola::Focal () const
292 return 2.0 * Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
295 //=======================================================================
298 //=======================================================================
300 Pnt2d Geom2d_Hyperbola::Focus1 () const
302 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
303 XY Pxy = pos.XDirection().XY();
305 Pxy.Add (pos.Location().XY());
309 //=======================================================================
312 //=======================================================================
314 Pnt2d Geom2d_Hyperbola::Focus2 () const
316 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
317 XY Pxy = pos.XDirection().XY();
319 Pxy.Add (pos.Location().XY());
323 //=======================================================================
324 //function : MajorRadius
326 //=======================================================================
328 Standard_Real Geom2d_Hyperbola::MajorRadius () const
333 //=======================================================================
334 //function : MinorRadius
336 //=======================================================================
338 Standard_Real Geom2d_Hyperbola::MinorRadius () const
343 //=======================================================================
344 //function : OtherBranch
346 //=======================================================================
348 gp_Hypr2d Geom2d_Hyperbola::OtherBranch () const
350 gp_Hypr2d Hv (pos, majorRadius, minorRadius);
351 return Hv.OtherBranch ();
355 //=======================================================================
356 //function : Parameter
358 //=======================================================================
360 Standard_Real Geom2d_Hyperbola::Parameter () const
362 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), " ");
363 return (minorRadius * minorRadius) / majorRadius;
366 //=======================================================================
369 //=======================================================================
371 void Geom2d_Hyperbola::D0 (const Standard_Real U,
374 P = ElCLib::HyperbolaValue (U, pos, majorRadius, minorRadius);
377 //=======================================================================
380 //=======================================================================
382 void Geom2d_Hyperbola::D1 (const Standard_Real U,
386 ElCLib::HyperbolaD1 (U, pos, majorRadius, minorRadius, P, V1);
390 //=======================================================================
393 //=======================================================================
395 void Geom2d_Hyperbola::D2 (const Standard_Real U,
397 Vec2d& V1, Vec2d& V2) const
399 ElCLib::HyperbolaD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
403 //=======================================================================
406 //=======================================================================
408 void Geom2d_Hyperbola::D3 (const Standard_Real U,
410 Vec2d& V1, Vec2d& V2, Vec2d& V3) const
412 ElCLib::HyperbolaD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
416 //=======================================================================
419 //=======================================================================
421 Vec2d Geom2d_Hyperbola::DN (const Standard_Real U, const Standard_Integer N) const
423 Standard_RangeError_Raise_if (N < 1, " ");
424 return ElCLib::HyperbolaDN (U, pos, majorRadius, minorRadius, N);
428 //=======================================================================
429 //function : Transform
431 //=======================================================================
433 void Geom2d_Hyperbola::Transform (const Trsf2d& T)
435 majorRadius = majorRadius * Abs (T.ScaleFactor());
436 minorRadius = minorRadius * Abs (T.ScaleFactor());