1 // Copyright (c) 1995-1999 Matra Datavision
2 // Copyright (c) 1999-2012 OPEN CASCADE SAS
4 // The content of this file is subject to the Open CASCADE Technology Public
5 // License Version 6.5 (the "License"). You may not use the content of this file
6 // except in compliance with the License. Please obtain a copy of the License
7 // at http://www.opencascade.org and read it completely before using this file.
9 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
10 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 // The Original Code and all software distributed under the License is
13 // distributed on an "AS IS" basis, without warranty of any kind, and the
14 // Initial Developer hereby disclaims all such warranties, including without
15 // limitation, any warranties of merchantability, fitness for a particular
16 // purpose or non-infringement. Please see the License for the specific terms
17 // and conditions governing the rights and limitations under the License.
21 #include <Standard_DomainError.hxx>
22 #include <Standard_ConstructionError.hxx>
24 inline gp_Hypr::gp_Hypr () :
25 majorRadius(RealLast()),
26 minorRadius(RealFirst())
29 inline gp_Hypr::gp_Hypr (const gp_Ax2& A2,
30 const Standard_Real MajorRadius,
31 const Standard_Real MinorRadius):
33 majorRadius(MajorRadius),
34 minorRadius(MinorRadius)
36 Standard_ConstructionError_Raise_if
37 (MinorRadius < 0.0 || MajorRadius < 0.0,"");
40 inline void gp_Hypr::SetAxis (const gp_Ax1& A1)
43 inline void gp_Hypr::SetLocation (const gp_Pnt& P)
44 { pos = gp_Ax2 (P, pos.Direction(), pos.XDirection()); }
46 inline void gp_Hypr::SetMajorRadius (const Standard_Real R)
48 Standard_ConstructionError_Raise_if(R < 0.0,"");
52 inline void gp_Hypr::SetMinorRadius (const Standard_Real R)
54 Standard_ConstructionError_Raise_if(R < 0.0,"");
58 inline void gp_Hypr::SetPosition (const gp_Ax2& A2)
61 inline gp_Ax1 gp_Hypr::Asymptote1 () const
63 Standard_ConstructionError_Raise_if
64 (majorRadius <= gp::Resolution(), "");
65 gp_Vec V1 = gp_Vec (pos.YDirection());
66 V1.Multiply (minorRadius / majorRadius);
67 gp_Vec V = gp_Vec (pos.XDirection());
69 return gp_Ax1(pos.Location(), gp_Dir(V));
72 inline gp_Ax1 gp_Hypr::Asymptote2 () const
74 Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "");
75 gp_Vec V1 = gp_Vec (pos.YDirection());
76 V1.Multiply (-minorRadius / majorRadius);
77 gp_Vec V = gp_Vec (pos.XDirection());
79 return gp_Ax1( pos.Location(), gp_Dir(V));
82 inline const gp_Ax1& gp_Hypr::Axis () const
83 { return pos.Axis(); }
85 inline gp_Hypr gp_Hypr::ConjugateBranch1 () const
87 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), pos.YDirection()),
92 inline gp_Hypr gp_Hypr::ConjugateBranch2 () const
94 gp_Dir D = pos.YDirection();
96 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D),
101 inline gp_Ax1 gp_Hypr::Directrix1 () const
103 Standard_Real E = Eccentricity();
104 gp_XYZ Orig = pos.XDirection().XYZ();
105 Orig.Multiply (majorRadius/E);
106 Orig.Add (pos.Location().XYZ());
107 return gp_Ax1 (gp_Pnt(Orig), pos.YDirection());
110 inline gp_Ax1 gp_Hypr::Directrix2 () const
112 Standard_Real E = Eccentricity();
113 gp_XYZ Orig = pos.XDirection().XYZ();
114 Orig.Multiply (-majorRadius/E);
115 Orig.Add (pos.Location().XYZ());
116 return gp_Ax1 (gp_Pnt(Orig), pos.YDirection());
119 inline Standard_Real gp_Hypr::Eccentricity () const
121 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
122 return sqrt(majorRadius * majorRadius +
123 minorRadius * minorRadius) / majorRadius;
126 inline Standard_Real gp_Hypr::Focal () const
128 return 2.0 * sqrt(majorRadius * majorRadius +
129 minorRadius * minorRadius);
132 inline gp_Pnt gp_Hypr::Focus1 () const
134 Standard_Real C = sqrt(majorRadius * majorRadius +
135 minorRadius * minorRadius);
136 const gp_Pnt& PP = pos.Location ();
137 const gp_Dir& DD = pos.XDirection();
138 return gp_Pnt (PP.X() + C * DD.X(),
140 PP.Z() + C * DD.Z());
143 inline gp_Pnt gp_Hypr::Focus2 () const
145 Standard_Real C = sqrt(majorRadius * majorRadius +
146 minorRadius * minorRadius);
147 const gp_Pnt& PP = pos.Location ();
148 const gp_Dir& DD = pos.XDirection();
149 return gp_Pnt (PP.X() - C * DD.X(),
151 PP.Z() - C * DD.Z());
154 inline const gp_Pnt& gp_Hypr::Location () const
155 { return pos.Location(); }
157 inline Standard_Real gp_Hypr::MajorRadius() const
158 { return majorRadius; }
160 inline Standard_Real gp_Hypr::MinorRadius() const
161 { return minorRadius; }
163 inline gp_Hypr gp_Hypr::OtherBranch () const
165 gp_Dir D = pos.XDirection ();
167 return gp_Hypr (gp_Ax2(pos.Location(), pos.Direction(), D),
168 majorRadius, minorRadius);
171 inline Standard_Real gp_Hypr::Parameter() const
173 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
174 return (minorRadius * minorRadius) / majorRadius;
177 inline const gp_Ax2& gp_Hypr::Position() const
180 inline gp_Ax1 gp_Hypr::XAxis () const
181 {return gp_Ax1 (pos.Location(), pos.XDirection());}
183 inline gp_Ax1 gp_Hypr::YAxis () const
184 {return gp_Ax1 (pos.Location(), pos.YDirection());}
186 inline void gp_Hypr::Rotate (const gp_Ax1& A1,
187 const Standard_Real Ang)
188 { pos.Rotate(A1, Ang); }
190 inline gp_Hypr gp_Hypr::Rotated (const gp_Ax1& A1,
191 const Standard_Real Ang) const
194 H.pos.Rotate(A1, Ang);
198 inline void gp_Hypr::Scale (const gp_Pnt& P,
199 const Standard_Real S)
202 if (majorRadius < 0) majorRadius = - majorRadius;
204 if (minorRadius < 0) minorRadius = - minorRadius;
208 inline gp_Hypr gp_Hypr::Scaled (const gp_Pnt& P,
209 const Standard_Real S) const
213 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
215 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
220 inline void gp_Hypr::Transform (const gp_Trsf& T)
222 majorRadius *= T.ScaleFactor();
223 if (majorRadius < 0) majorRadius = - majorRadius;
224 minorRadius *= T.ScaleFactor();
225 if (minorRadius < 0) minorRadius = - minorRadius;
229 inline gp_Hypr gp_Hypr::Transformed (const gp_Trsf& T) const
232 H.majorRadius *= T.ScaleFactor();
233 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
234 H.minorRadius *= T.ScaleFactor();
235 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
240 inline void gp_Hypr::Translate (const gp_Vec& V)
241 { pos.Translate(V); }
243 inline gp_Hypr gp_Hypr::Translated (const gp_Vec& V) const
250 inline void gp_Hypr::Translate (const gp_Pnt& P1,
252 {pos.Translate(P1,P2);}
254 inline gp_Hypr gp_Hypr::Translated (const gp_Pnt& P1,
255 const gp_Pnt& P2) const
258 H.pos.Translate(P1, P2);