1 // Created on: 1993-03-10
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 <Geom_Geometry.hxx>
20 #include <Geom_Hyperbola.hxx>
23 #include <gp_Hypr.hxx>
25 #include <gp_Trsf.hxx>
28 #include <Precision.hxx>
29 #include <Standard_ConstructionError.hxx>
30 #include <Standard_DomainError.hxx>
31 #include <Standard_RangeError.hxx>
32 #include <Standard_Type.hxx>
34 IMPLEMENT_STANDARD_RTTIEXT(Geom_Hyperbola,Geom_Conic)
36 typedef Geom_Hyperbola Hyperbola;
44 //=======================================================================
47 //=======================================================================
49 Handle(Geom_Geometry) Geom_Hyperbola::Copy() const {
51 Handle(Geom_Hyperbola) H;
52 H = new Hyperbola (pos, majorRadius, minorRadius);
59 //=======================================================================
60 //function : Geom_Hyperbola
62 //=======================================================================
64 Geom_Hyperbola::Geom_Hyperbola (const gp_Hypr& H)
65 : majorRadius (H.MajorRadius()), minorRadius (H.MinorRadius()) {
71 //=======================================================================
72 //function : Geom_Hyperbola
74 //=======================================================================
76 Geom_Hyperbola::Geom_Hyperbola ( const Ax2& A,
77 const Standard_Real MajorRadius,
78 const Standard_Real MinorRadius)
79 : majorRadius (MajorRadius), minorRadius (MinorRadius) {
81 if (MajorRadius < 0.0 || MinorRadius < 0.0) {
82 throw Standard_ConstructionError();
87 //=======================================================================
90 //=======================================================================
92 Standard_Boolean Geom_Hyperbola::IsClosed () const { return Standard_False; }
94 //=======================================================================
95 //function : IsPeriodic
97 //=======================================================================
99 Standard_Boolean Geom_Hyperbola::IsPeriodic () const { return Standard_False; }
101 //=======================================================================
102 //function : FirstParameter
104 //=======================================================================
106 Standard_Real Geom_Hyperbola::FirstParameter () const
107 { return -Precision::Infinite(); }
109 //=======================================================================
110 //function : LastParameter
112 //=======================================================================
114 Standard_Real Geom_Hyperbola::LastParameter () const
115 { return Precision::Infinite(); }
117 //=======================================================================
118 //function : MajorRadius
120 //=======================================================================
122 Standard_Real Geom_Hyperbola::MajorRadius () const { return majorRadius; }
124 //=======================================================================
125 //function : MinorRadius
127 //=======================================================================
129 Standard_Real Geom_Hyperbola::MinorRadius () const { return minorRadius; }
131 //=======================================================================
134 //=======================================================================
136 void Geom_Hyperbola::SetHypr (const gp_Hypr& H) {
138 majorRadius = H.MajorRadius();
139 minorRadius = H.MinorRadius();
144 //=======================================================================
145 //function : SetMajorRadius
147 //=======================================================================
149 void Geom_Hyperbola::SetMajorRadius (const Standard_Real MajorRadius) {
151 if (MajorRadius < 0.0) throw Standard_ConstructionError();
152 else majorRadius = MajorRadius;
156 //=======================================================================
157 //function : SetMinorRadius
159 //=======================================================================
161 void Geom_Hyperbola::SetMinorRadius (const Standard_Real MinorRadius) {
163 if (MinorRadius < 0.0) throw Standard_ConstructionError();
164 else minorRadius = MinorRadius;
168 //=======================================================================
171 //=======================================================================
173 gp_Hypr Geom_Hyperbola::Hypr () const
175 return gp_Hypr (pos, majorRadius, minorRadius);
178 //=======================================================================
179 //function : ReversedParameter
181 //=======================================================================
183 Standard_Real Geom_Hyperbola::ReversedParameter( const Standard_Real U) const
188 //=======================================================================
189 //function : Asymptote1
191 //=======================================================================
193 Ax1 Geom_Hyperbola::Asymptote1 () const {
195 gp_Hypr Hv (pos, majorRadius, minorRadius);
196 return Hv.Asymptote1();
200 //=======================================================================
201 //function : Asymptote2
203 //=======================================================================
205 Ax1 Geom_Hyperbola::Asymptote2 () const {
207 gp_Hypr Hv (pos, majorRadius, minorRadius);
208 return Hv.Asymptote2();
212 //=======================================================================
213 //function : ConjugateBranch1
215 //=======================================================================
217 gp_Hypr Geom_Hyperbola::ConjugateBranch1 () const {
219 gp_Hypr Hv (pos, majorRadius, minorRadius);
220 return Hv.ConjugateBranch1();
223 //=======================================================================
224 //function : ConjugateBranch2
226 //=======================================================================
228 gp_Hypr Geom_Hyperbola::ConjugateBranch2 () const {
230 gp_Hypr Hv (pos, majorRadius, minorRadius);
231 return Hv.ConjugateBranch2();
235 //=======================================================================
236 //function : Directrix1
238 //=======================================================================
240 Ax1 Geom_Hyperbola::Directrix1 () const {
242 gp_Hypr Hv (pos, majorRadius, minorRadius);
243 return Hv.Directrix1();
246 //=======================================================================
247 //function : Directrix2
249 //=======================================================================
251 Ax1 Geom_Hyperbola::Directrix2 () const {
253 gp_Hypr Hv (pos, majorRadius, minorRadius);
254 return Hv.Directrix2();
257 //=======================================================================
260 //=======================================================================
262 void Geom_Hyperbola::D0 (const Standard_Real U, Pnt& P) const {
264 P = ElCLib::HyperbolaValue (U, pos, majorRadius, minorRadius);
267 //=======================================================================
270 //=======================================================================
272 void Geom_Hyperbola::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
274 ElCLib::HyperbolaD1 (U, pos, majorRadius, minorRadius, P, V1);
277 //=======================================================================
280 //=======================================================================
282 void Geom_Hyperbola::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const {
284 ElCLib::HyperbolaD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
287 //=======================================================================
290 //=======================================================================
292 void Geom_Hyperbola::D3 (
293 const Standard_Real U, Pnt& P, Vec& V1, Vec& V2, Vec& V3) const {
295 ElCLib::HyperbolaD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
298 //=======================================================================
301 //=======================================================================
303 Vec Geom_Hyperbola::DN (const Standard_Real U, const Standard_Integer N) const {
305 Standard_RangeError_Raise_if (N < 1, " ");
306 return ElCLib::HyperbolaDN (U, pos, majorRadius, minorRadius, N);
309 //=======================================================================
310 //function : Eccentricity
312 //=======================================================================
314 Standard_Real Geom_Hyperbola::Eccentricity () const {
316 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ")
317 return (Sqrt(majorRadius*majorRadius + minorRadius*minorRadius))/majorRadius;
320 //=======================================================================
323 //=======================================================================
325 Standard_Real Geom_Hyperbola::Focal () const {
327 return 2.0 * Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
330 //=======================================================================
333 //=======================================================================
335 Pnt Geom_Hyperbola::Focus1 () const {
337 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
338 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
339 pos.Location().Coord (Xp, Yp, Zp);
340 pos.XDirection().Coord (Xd, Yd, Zd);
341 return Pnt (Xp + C * Xd, Yp + C * Yd, Zp + C * Zd);
344 //=======================================================================
347 //=======================================================================
349 Pnt Geom_Hyperbola::Focus2 () const {
351 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
352 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
353 pos.Location().Coord (Xp, Yp, Zp);
354 pos.XDirection().Coord (Xd, Yd, Zd);
355 return Pnt (Xp - C * Xd, Yp - C * Yd, Zp - C * Zd);
358 //=======================================================================
359 //function : OtherBranch
361 //=======================================================================
363 gp_Hypr Geom_Hyperbola::OtherBranch () const {
365 gp_Hypr Hv (pos, majorRadius, minorRadius);
366 return Hv.OtherBranch ();
369 //=======================================================================
370 //function : Parameter
372 //=======================================================================
374 Standard_Real Geom_Hyperbola::Parameter () const {
376 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ");
377 return (minorRadius * minorRadius)/majorRadius;
380 //=======================================================================
381 //function : Transform
383 //=======================================================================
385 void Geom_Hyperbola::Transform (const Trsf& T) {
387 majorRadius = majorRadius * Abs(T.ScaleFactor());
388 minorRadius = minorRadius * Abs(T.ScaleFactor());
392 //=======================================================================
393 //function : DumpJson
395 //=======================================================================
396 void Geom_Hyperbola::DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth) const
398 OCCT_DUMP_TRANSIENT_CLASS_BEGIN (theOStream)
400 OCCT_DUMP_BASE_CLASS (theOStream, theDepth, Geom_Conic)
402 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, majorRadius)
403 OCCT_DUMP_FIELD_VALUE_NUMERICAL (theOStream, minorRadius)