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 typedef Geom_Hyperbola Hyperbola;
42 //=======================================================================
45 //=======================================================================
47 Handle(Geom_Geometry) Geom_Hyperbola::Copy() const {
49 Handle(Geom_Hyperbola) H;
50 H = new Hyperbola (pos, majorRadius, minorRadius);
57 //=======================================================================
58 //function : Geom_Hyperbola
60 //=======================================================================
62 Geom_Hyperbola::Geom_Hyperbola (const gp_Hypr& H)
63 : majorRadius (H.MajorRadius()), minorRadius (H.MinorRadius()) {
69 //=======================================================================
70 //function : Geom_Hyperbola
72 //=======================================================================
74 Geom_Hyperbola::Geom_Hyperbola ( const Ax2& A,
75 const Standard_Real MajorRadius,
76 const Standard_Real MinorRadius)
77 : majorRadius (MajorRadius), minorRadius (MinorRadius) {
79 if (MajorRadius < 0.0 || MinorRadius < 0.0) {
80 Standard_ConstructionError::Raise();
85 //=======================================================================
88 //=======================================================================
90 Standard_Boolean Geom_Hyperbola::IsClosed () const { return Standard_False; }
92 //=======================================================================
93 //function : IsPeriodic
95 //=======================================================================
97 Standard_Boolean Geom_Hyperbola::IsPeriodic () const { return Standard_False; }
99 //=======================================================================
100 //function : FirstParameter
102 //=======================================================================
104 Standard_Real Geom_Hyperbola::FirstParameter () const
105 { return -Precision::Infinite(); }
107 //=======================================================================
108 //function : LastParameter
110 //=======================================================================
112 Standard_Real Geom_Hyperbola::LastParameter () const
113 { return Precision::Infinite(); }
115 //=======================================================================
116 //function : MajorRadius
118 //=======================================================================
120 Standard_Real Geom_Hyperbola::MajorRadius () const { return majorRadius; }
122 //=======================================================================
123 //function : MinorRadius
125 //=======================================================================
127 Standard_Real Geom_Hyperbola::MinorRadius () const { return minorRadius; }
129 //=======================================================================
132 //=======================================================================
134 void Geom_Hyperbola::SetHypr (const gp_Hypr& H) {
136 majorRadius = H.MajorRadius();
137 minorRadius = H.MinorRadius();
142 //=======================================================================
143 //function : SetMajorRadius
145 //=======================================================================
147 void Geom_Hyperbola::SetMajorRadius (const Standard_Real MajorRadius) {
149 if (MajorRadius < 0.0) Standard_ConstructionError::Raise();
150 else majorRadius = MajorRadius;
154 //=======================================================================
155 //function : SetMinorRadius
157 //=======================================================================
159 void Geom_Hyperbola::SetMinorRadius (const Standard_Real MinorRadius) {
161 if (MinorRadius < 0.0) Standard_ConstructionError::Raise();
162 else minorRadius = MinorRadius;
166 //=======================================================================
169 //=======================================================================
171 gp_Hypr Geom_Hyperbola::Hypr () const
173 return gp_Hypr (pos, majorRadius, minorRadius);
176 //=======================================================================
177 //function : ReversedParameter
179 //=======================================================================
181 Standard_Real Geom_Hyperbola::ReversedParameter( const Standard_Real U) const
186 //=======================================================================
187 //function : Asymptote1
189 //=======================================================================
191 Ax1 Geom_Hyperbola::Asymptote1 () const {
193 gp_Hypr Hv (pos, majorRadius, minorRadius);
194 return Hv.Asymptote1();
198 //=======================================================================
199 //function : Asymptote2
201 //=======================================================================
203 Ax1 Geom_Hyperbola::Asymptote2 () const {
205 gp_Hypr Hv (pos, majorRadius, minorRadius);
206 return Hv.Asymptote2();
210 //=======================================================================
211 //function : ConjugateBranch1
213 //=======================================================================
215 gp_Hypr Geom_Hyperbola::ConjugateBranch1 () const {
217 gp_Hypr Hv (pos, majorRadius, minorRadius);
218 return Hv.ConjugateBranch1();
221 //=======================================================================
222 //function : ConjugateBranch2
224 //=======================================================================
226 gp_Hypr Geom_Hyperbola::ConjugateBranch2 () const {
228 gp_Hypr Hv (pos, majorRadius, minorRadius);
229 return Hv.ConjugateBranch2();
233 //=======================================================================
234 //function : Directrix1
236 //=======================================================================
238 Ax1 Geom_Hyperbola::Directrix1 () const {
240 gp_Hypr Hv (pos, majorRadius, minorRadius);
241 return Hv.Directrix1();
244 //=======================================================================
245 //function : Directrix2
247 //=======================================================================
249 Ax1 Geom_Hyperbola::Directrix2 () const {
251 gp_Hypr Hv (pos, majorRadius, minorRadius);
252 return Hv.Directrix2();
255 //=======================================================================
258 //=======================================================================
260 void Geom_Hyperbola::D0 (const Standard_Real U, Pnt& P) const {
262 P = ElCLib::HyperbolaValue (U, pos, majorRadius, minorRadius);
265 //=======================================================================
268 //=======================================================================
270 void Geom_Hyperbola::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
272 ElCLib::HyperbolaD1 (U, pos, majorRadius, minorRadius, P, V1);
275 //=======================================================================
278 //=======================================================================
280 void Geom_Hyperbola::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const {
282 ElCLib::HyperbolaD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
285 //=======================================================================
288 //=======================================================================
290 void Geom_Hyperbola::D3 (
291 const Standard_Real U, Pnt& P, Vec& V1, Vec& V2, Vec& V3) const {
293 ElCLib::HyperbolaD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
296 //=======================================================================
299 //=======================================================================
301 Vec Geom_Hyperbola::DN (const Standard_Real U, const Standard_Integer N) const {
303 Standard_RangeError_Raise_if (N < 1, " ");
304 return ElCLib::HyperbolaDN (U, pos, majorRadius, minorRadius, N);
307 //=======================================================================
308 //function : Eccentricity
310 //=======================================================================
312 Standard_Real Geom_Hyperbola::Eccentricity () const {
314 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ")
315 return (Sqrt(majorRadius*majorRadius + minorRadius*minorRadius))/majorRadius;
318 //=======================================================================
321 //=======================================================================
323 Standard_Real Geom_Hyperbola::Focal () const {
325 return 2.0 * Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
328 //=======================================================================
331 //=======================================================================
333 Pnt Geom_Hyperbola::Focus1 () const {
335 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
336 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
337 pos.Location().Coord (Xp, Yp, Zp);
338 pos.XDirection().Coord (Xd, Yd, Zd);
339 return Pnt (Xp + C * Xd, Yp + C * Yd, Zp + C * Zd);
342 //=======================================================================
345 //=======================================================================
347 Pnt Geom_Hyperbola::Focus2 () const {
349 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
350 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
351 pos.Location().Coord (Xp, Yp, Zp);
352 pos.XDirection().Coord (Xd, Yd, Zd);
353 return Pnt (Xp - C * Xd, Yp - C * Yd, Zp - C * Zd);
356 //=======================================================================
357 //function : OtherBranch
359 //=======================================================================
361 gp_Hypr Geom_Hyperbola::OtherBranch () const {
363 gp_Hypr Hv (pos, majorRadius, minorRadius);
364 return Hv.OtherBranch ();
367 //=======================================================================
368 //function : Parameter
370 //=======================================================================
372 Standard_Real Geom_Hyperbola::Parameter () const {
374 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ");
375 return (minorRadius * minorRadius)/majorRadius;
378 //=======================================================================
379 //function : Transform
381 //=======================================================================
383 void Geom_Hyperbola::Transform (const Trsf& T) {
385 majorRadius = majorRadius * Abs(T.ScaleFactor());
386 minorRadius = minorRadius * Abs(T.ScaleFactor());