1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2014 OPEN CASCADE SAS
4 // This file is part of Open CASCADE Technology software library.
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
16 #include <Standard_DomainError.hxx>
17 #include <Standard_ConstructionError.hxx>
19 inline gp_Hypr::gp_Hypr () :
20 majorRadius(RealLast()),
21 minorRadius(RealFirst())
24 inline gp_Hypr::gp_Hypr (const gp_Ax2& A2,
25 const Standard_Real MajorRadius,
26 const Standard_Real MinorRadius):
28 majorRadius(MajorRadius),
29 minorRadius(MinorRadius)
31 Standard_ConstructionError_Raise_if
32 (MinorRadius < 0.0 || MajorRadius < 0.0,"");
35 inline void gp_Hypr::SetAxis (const gp_Ax1& A1)
38 inline void gp_Hypr::SetLocation (const gp_Pnt& P)
39 { pos = gp_Ax2 (P, pos.Direction(), pos.XDirection()); }
41 inline void gp_Hypr::SetMajorRadius (const Standard_Real R)
43 Standard_ConstructionError_Raise_if(R < 0.0,"");
47 inline void gp_Hypr::SetMinorRadius (const Standard_Real R)
49 Standard_ConstructionError_Raise_if(R < 0.0,"");
53 inline void gp_Hypr::SetPosition (const gp_Ax2& A2)
56 inline gp_Ax1 gp_Hypr::Asymptote1 () const
58 Standard_ConstructionError_Raise_if
59 (majorRadius <= gp::Resolution(), "");
60 gp_Vec V1 = gp_Vec (pos.YDirection());
61 V1.Multiply (minorRadius / majorRadius);
62 gp_Vec V = gp_Vec (pos.XDirection());
64 return gp_Ax1(pos.Location(), gp_Dir(V));
67 inline gp_Ax1 gp_Hypr::Asymptote2 () const
69 Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "");
70 gp_Vec V1 = gp_Vec (pos.YDirection());
71 V1.Multiply (-minorRadius / majorRadius);
72 gp_Vec V = gp_Vec (pos.XDirection());
74 return gp_Ax1( pos.Location(), gp_Dir(V));
77 inline const gp_Ax1& gp_Hypr::Axis () const
78 { return pos.Axis(); }
80 inline gp_Hypr gp_Hypr::ConjugateBranch1 () const
82 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), pos.YDirection()),
87 inline gp_Hypr gp_Hypr::ConjugateBranch2 () const
89 gp_Dir D = pos.YDirection();
91 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D),
96 inline gp_Ax1 gp_Hypr::Directrix1 () const
98 Standard_Real E = Eccentricity();
99 gp_XYZ Orig = pos.XDirection().XYZ();
100 Orig.Multiply (majorRadius/E);
101 Orig.Add (pos.Location().XYZ());
102 return gp_Ax1 (gp_Pnt(Orig), pos.YDirection());
105 inline gp_Ax1 gp_Hypr::Directrix2 () const
107 Standard_Real E = Eccentricity();
108 gp_XYZ Orig = pos.XDirection().XYZ();
109 Orig.Multiply (-majorRadius/E);
110 Orig.Add (pos.Location().XYZ());
111 return gp_Ax1 (gp_Pnt(Orig), pos.YDirection());
114 inline Standard_Real gp_Hypr::Eccentricity () const
116 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
117 return sqrt(majorRadius * majorRadius +
118 minorRadius * minorRadius) / majorRadius;
121 inline Standard_Real gp_Hypr::Focal () const
123 return 2.0 * sqrt(majorRadius * majorRadius +
124 minorRadius * minorRadius);
127 inline gp_Pnt gp_Hypr::Focus1 () const
129 Standard_Real C = sqrt(majorRadius * majorRadius +
130 minorRadius * minorRadius);
131 const gp_Pnt& PP = pos.Location ();
132 const gp_Dir& DD = pos.XDirection();
133 return gp_Pnt (PP.X() + C * DD.X(),
135 PP.Z() + C * DD.Z());
138 inline gp_Pnt gp_Hypr::Focus2 () const
140 Standard_Real C = sqrt(majorRadius * majorRadius +
141 minorRadius * minorRadius);
142 const gp_Pnt& PP = pos.Location ();
143 const gp_Dir& DD = pos.XDirection();
144 return gp_Pnt (PP.X() - C * DD.X(),
146 PP.Z() - C * DD.Z());
149 inline const gp_Pnt& gp_Hypr::Location () const
150 { return pos.Location(); }
152 inline Standard_Real gp_Hypr::MajorRadius() const
153 { return majorRadius; }
155 inline Standard_Real gp_Hypr::MinorRadius() const
156 { return minorRadius; }
158 inline gp_Hypr gp_Hypr::OtherBranch () const
160 gp_Dir D = pos.XDirection ();
162 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D),
163 majorRadius, minorRadius);
166 inline Standard_Real gp_Hypr::Parameter() const
168 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
169 return (minorRadius * minorRadius) / majorRadius;
172 inline const gp_Ax2& gp_Hypr::Position() const
175 inline gp_Ax1 gp_Hypr::XAxis () const
176 {return gp_Ax1 (pos.Location(), pos.XDirection());}
178 inline gp_Ax1 gp_Hypr::YAxis () const
179 {return gp_Ax1 (pos.Location(), pos.YDirection());}
181 inline void gp_Hypr::Rotate (const gp_Ax1& A1,
182 const Standard_Real Ang)
183 { pos.Rotate(A1, Ang); }
185 inline gp_Hypr gp_Hypr::Rotated (const gp_Ax1& A1,
186 const Standard_Real Ang) const
189 H.pos.Rotate(A1, Ang);
193 inline void gp_Hypr::Scale (const gp_Pnt& P,
194 const Standard_Real S)
197 if (majorRadius < 0) majorRadius = - majorRadius;
199 if (minorRadius < 0) minorRadius = - minorRadius;
203 inline gp_Hypr gp_Hypr::Scaled (const gp_Pnt& P,
204 const Standard_Real S) const
208 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
210 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
215 inline void gp_Hypr::Transform (const gp_Trsf& T)
217 majorRadius *= T.ScaleFactor();
218 if (majorRadius < 0) majorRadius = - majorRadius;
219 minorRadius *= T.ScaleFactor();
220 if (minorRadius < 0) minorRadius = - minorRadius;
224 inline gp_Hypr gp_Hypr::Transformed (const gp_Trsf& T) const
227 H.majorRadius *= T.ScaleFactor();
228 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
229 H.minorRadius *= T.ScaleFactor();
230 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
235 inline void gp_Hypr::Translate (const gp_Vec& V)
236 { pos.Translate(V); }
238 inline gp_Hypr gp_Hypr::Translated (const gp_Vec& V) const
245 inline void gp_Hypr::Translate (const gp_Pnt& P1,
247 {pos.Translate(P1,P2);}
249 inline gp_Hypr gp_Hypr::Translated (const gp_Pnt& P1,
250 const gp_Pnt& P2) const
253 H.pos.Translate(P1, P2);