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.
17 #include <Geom_Hyperbola.ixx>
19 #include <Precision.hxx>
22 #include <Standard_RangeError.hxx>
23 #include <Standard_ConstructionError.hxx>
26 typedef Geom_Hyperbola Hyperbola;
34 //=======================================================================
37 //=======================================================================
39 Handle(Geom_Geometry) Geom_Hyperbola::Copy() const {
41 Handle(Geom_Hyperbola) H;
42 H = new Hyperbola (pos, majorRadius, minorRadius);
49 //=======================================================================
50 //function : Geom_Hyperbola
52 //=======================================================================
54 Geom_Hyperbola::Geom_Hyperbola (const gp_Hypr& H)
55 : majorRadius (H.MajorRadius()), minorRadius (H.MinorRadius()) {
61 //=======================================================================
62 //function : Geom_Hyperbola
64 //=======================================================================
66 Geom_Hyperbola::Geom_Hyperbola ( const Ax2& A,
67 const Standard_Real MajorRadius,
68 const Standard_Real MinorRadius)
69 : majorRadius (MajorRadius), minorRadius (MinorRadius) {
71 if (MajorRadius < 0.0 || MinorRadius < 0.0) {
72 Standard_ConstructionError::Raise();
77 //=======================================================================
80 //=======================================================================
82 Standard_Boolean Geom_Hyperbola::IsClosed () const { return Standard_False; }
84 //=======================================================================
85 //function : IsPeriodic
87 //=======================================================================
89 Standard_Boolean Geom_Hyperbola::IsPeriodic () const { return Standard_False; }
91 //=======================================================================
92 //function : FirstParameter
94 //=======================================================================
96 Standard_Real Geom_Hyperbola::FirstParameter () const
97 { return -Precision::Infinite(); }
99 //=======================================================================
100 //function : LastParameter
102 //=======================================================================
104 Standard_Real Geom_Hyperbola::LastParameter () const
105 { return Precision::Infinite(); }
107 //=======================================================================
108 //function : MajorRadius
110 //=======================================================================
112 Standard_Real Geom_Hyperbola::MajorRadius () const { return majorRadius; }
114 //=======================================================================
115 //function : MinorRadius
117 //=======================================================================
119 Standard_Real Geom_Hyperbola::MinorRadius () const { return minorRadius; }
121 //=======================================================================
124 //=======================================================================
126 void Geom_Hyperbola::SetHypr (const gp_Hypr& H) {
128 majorRadius = H.MajorRadius();
129 minorRadius = H.MinorRadius();
134 //=======================================================================
135 //function : SetMajorRadius
137 //=======================================================================
139 void Geom_Hyperbola::SetMajorRadius (const Standard_Real MajorRadius) {
141 if (MajorRadius < 0.0) Standard_ConstructionError::Raise();
142 else majorRadius = MajorRadius;
146 //=======================================================================
147 //function : SetMinorRadius
149 //=======================================================================
151 void Geom_Hyperbola::SetMinorRadius (const Standard_Real MinorRadius) {
153 if (MinorRadius < 0.0) Standard_ConstructionError::Raise();
154 else minorRadius = MinorRadius;
158 //=======================================================================
161 //=======================================================================
163 gp_Hypr Geom_Hyperbola::Hypr () const
165 return gp_Hypr (pos, majorRadius, minorRadius);
168 //=======================================================================
169 //function : ReversedParameter
171 //=======================================================================
173 Standard_Real Geom_Hyperbola::ReversedParameter( const Standard_Real U) const
178 //=======================================================================
179 //function : Asymptote1
181 //=======================================================================
183 Ax1 Geom_Hyperbola::Asymptote1 () const {
185 gp_Hypr Hv (pos, majorRadius, minorRadius);
186 return Hv.Asymptote1();
190 //=======================================================================
191 //function : Asymptote2
193 //=======================================================================
195 Ax1 Geom_Hyperbola::Asymptote2 () const {
197 gp_Hypr Hv (pos, majorRadius, minorRadius);
198 return Hv.Asymptote2();
202 //=======================================================================
203 //function : ConjugateBranch1
205 //=======================================================================
207 gp_Hypr Geom_Hyperbola::ConjugateBranch1 () const {
209 gp_Hypr Hv (pos, majorRadius, minorRadius);
210 return Hv.ConjugateBranch1();
213 //=======================================================================
214 //function : ConjugateBranch2
216 //=======================================================================
218 gp_Hypr Geom_Hyperbola::ConjugateBranch2 () const {
220 gp_Hypr Hv (pos, majorRadius, minorRadius);
221 return Hv.ConjugateBranch2();
225 //=======================================================================
226 //function : Directrix1
228 //=======================================================================
230 Ax1 Geom_Hyperbola::Directrix1 () const {
232 gp_Hypr Hv (pos, majorRadius, minorRadius);
233 return Hv.Directrix1();
236 //=======================================================================
237 //function : Directrix2
239 //=======================================================================
241 Ax1 Geom_Hyperbola::Directrix2 () const {
243 gp_Hypr Hv (pos, majorRadius, minorRadius);
244 return Hv.Directrix2();
247 //=======================================================================
250 //=======================================================================
252 void Geom_Hyperbola::D0 (const Standard_Real U, Pnt& P) const {
254 P = ElCLib::HyperbolaValue (U, pos, majorRadius, minorRadius);
257 //=======================================================================
260 //=======================================================================
262 void Geom_Hyperbola::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
264 ElCLib::HyperbolaD1 (U, pos, majorRadius, minorRadius, P, V1);
267 //=======================================================================
270 //=======================================================================
272 void Geom_Hyperbola::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const {
274 ElCLib::HyperbolaD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
277 //=======================================================================
280 //=======================================================================
282 void Geom_Hyperbola::D3 (
283 const Standard_Real U, Pnt& P, Vec& V1, Vec& V2, Vec& V3) const {
285 ElCLib::HyperbolaD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
288 //=======================================================================
291 //=======================================================================
293 Vec Geom_Hyperbola::DN (const Standard_Real U, const Standard_Integer N) const {
295 Standard_RangeError_Raise_if (N < 1, " ");
296 return ElCLib::HyperbolaDN (U, pos, majorRadius, minorRadius, N);
299 //=======================================================================
300 //function : Eccentricity
302 //=======================================================================
304 Standard_Real Geom_Hyperbola::Eccentricity () const {
306 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ")
307 return (Sqrt(majorRadius*majorRadius + minorRadius*minorRadius))/majorRadius;
310 //=======================================================================
313 //=======================================================================
315 Standard_Real Geom_Hyperbola::Focal () const {
317 return 2.0 * Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
320 //=======================================================================
323 //=======================================================================
325 Pnt Geom_Hyperbola::Focus1 () const {
327 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
328 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
329 pos.Location().Coord (Xp, Yp, Zp);
330 pos.XDirection().Coord (Xd, Yd, Zd);
331 return Pnt (Xp + C * Xd, Yp + C * Yd, Zp + C * Zd);
334 //=======================================================================
337 //=======================================================================
339 Pnt Geom_Hyperbola::Focus2 () const {
341 Standard_Real C = Sqrt(majorRadius * majorRadius + minorRadius * minorRadius);
342 Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
343 pos.Location().Coord (Xp, Yp, Zp);
344 pos.XDirection().Coord (Xd, Yd, Zd);
345 return Pnt (Xp - C * Xd, Yp - C * Yd, Zp - C * Zd);
348 //=======================================================================
349 //function : OtherBranch
351 //=======================================================================
353 gp_Hypr Geom_Hyperbola::OtherBranch () const {
355 gp_Hypr Hv (pos, majorRadius, minorRadius);
356 return Hv.OtherBranch ();
359 //=======================================================================
360 //function : Parameter
362 //=======================================================================
364 Standard_Real Geom_Hyperbola::Parameter () const {
366 Standard_ConstructionError_Raise_if (majorRadius == 0.0, " ");
367 return (minorRadius * minorRadius)/majorRadius;
370 //=======================================================================
371 //function : Transform
373 //=======================================================================
375 void Geom_Hyperbola::Transform (const Trsf& T) {
377 majorRadius = majorRadius * Abs(T.ScaleFactor());
378 minorRadius = minorRadius * Abs(T.ScaleFactor());