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.
15 // LPA et JCV 07/92 mise a jour des methodes inline pour passage sur C1
18 #include <Standard_DomainError.hxx>
19 #include <Standard_ConstructionError.hxx>
21 inline gp_Hypr2d::gp_Hypr2d () :
22 majorRadius(RealLast()),
23 minorRadius(RealLast())
26 inline gp_Hypr2d::gp_Hypr2d (const gp_Ax22d& A,
27 const Standard_Real MajorRadius,
28 const Standard_Real MinorRadius) :
30 majorRadius(MajorRadius),
31 minorRadius(MinorRadius)
33 Standard_ConstructionError_Raise_if
34 (MinorRadius < 0.0 || MajorRadius < 0.0,"");
37 inline gp_Hypr2d::gp_Hypr2d (const gp_Ax2d& MajorAxis,
38 const Standard_Real MajorRadius,
39 const Standard_Real MinorRadius,
40 const Standard_Boolean Sense) :
41 majorRadius(MajorRadius),
42 minorRadius(MinorRadius)
44 pos = gp_Ax22d(MajorAxis,Sense);
45 Standard_ConstructionError_Raise_if
46 (MinorRadius < 0.0 || MajorRadius < 0.0,"");
49 inline void gp_Hypr2d::SetLocation (const gp_Pnt2d& P)
50 { pos.SetLocation (P); }
52 inline void gp_Hypr2d::SetMajorRadius (const Standard_Real MajorRadius)
54 Standard_ConstructionError_Raise_if(MajorRadius < 0.0,"");
55 majorRadius = MajorRadius;
58 inline void gp_Hypr2d::SetMinorRadius (const Standard_Real MinorRadius)
60 Standard_ConstructionError_Raise_if(MinorRadius < 0.0,"");
61 minorRadius = MinorRadius;
64 inline void gp_Hypr2d::SetAxis (const gp_Ax22d& A)
67 inline void gp_Hypr2d::SetXAxis (const gp_Ax2d& A)
70 inline void gp_Hypr2d::SetYAxis (const gp_Ax2d& A)
73 inline gp_Ax2d gp_Hypr2d::Asymptote1() const
75 Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "");
76 gp_Dir2d Vdir = pos.XDirection();
77 gp_XY Coord1 (pos.YDirection().XY());
78 gp_XY Coord2 = Coord1.Multiplied (minorRadius / majorRadius);
81 return gp_Ax2d (pos.Location(), Vdir);
84 inline gp_Ax2d gp_Hypr2d::Asymptote2() const {
85 Standard_ConstructionError_Raise_if (majorRadius <= gp::Resolution(), "");
86 gp_Vec2d Vdir = pos.XDirection();
87 gp_XY Coord1 (pos.YDirection().XY());
88 gp_XY Coord2 = Coord1.Multiplied (-minorRadius / majorRadius);
91 return gp_Ax2d (pos.Location(), Vdir);
94 inline gp_Hypr2d gp_Hypr2d::ConjugateBranch1() const
96 gp_Dir2d V (pos.YDirection());
97 Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
98 return gp_Hypr2d (gp_Ax2d (pos.Location(),V), minorRadius, majorRadius,sign);
101 inline gp_Hypr2d gp_Hypr2d::ConjugateBranch2() const
103 gp_Dir2d V (pos.YDirection().Reversed());
104 Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
105 return gp_Hypr2d (gp_Ax2d(pos.Location(),V),minorRadius, majorRadius,sign);
108 inline gp_Ax2d gp_Hypr2d::Directrix1() const
110 Standard_Real E = Eccentricity();
111 gp_XY Orig = pos.XDirection().XY();
112 Orig.Multiply (majorRadius/E);
113 Orig.Add (pos.Location().XY());
114 return gp_Ax2d (gp_Pnt2d(Orig),gp_Dir2d (pos.YDirection()));
117 inline gp_Ax2d gp_Hypr2d::Directrix2() const
119 Standard_Real E = Eccentricity();
120 gp_XY Orig = pos.XDirection().XY();
121 Orig.Multiply (Parameter()/E);
122 Orig.Add (Focus1().XY());
123 return gp_Ax2d (gp_Pnt2d(Orig),gp_Dir2d (pos.YDirection()));
126 inline Standard_Real gp_Hypr2d::Eccentricity() const
128 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
129 return sqrt(majorRadius * majorRadius +
130 minorRadius * minorRadius) / majorRadius;
133 inline Standard_Real gp_Hypr2d::Focal() const
135 return 2.0 * sqrt (majorRadius * majorRadius +
136 minorRadius * minorRadius);
139 inline gp_Pnt2d gp_Hypr2d::Focus1() const
141 Standard_Real C = sqrt (majorRadius * majorRadius +
142 minorRadius * minorRadius);
143 return gp_Pnt2d (pos.Location().X() + C * pos.XDirection().X(),
144 pos.Location().Y() + C * pos.XDirection().Y());
147 inline gp_Pnt2d gp_Hypr2d::Focus2() const
149 Standard_Real C = sqrt (majorRadius * majorRadius +
150 minorRadius * minorRadius);
151 return gp_Pnt2d (pos.Location().X() - C * pos.XDirection().X(),
152 pos.Location().Y() - C * pos.XDirection().Y());
155 inline const gp_Pnt2d& gp_Hypr2d::Location () const
156 { return pos.Location(); }
158 inline Standard_Real gp_Hypr2d::MajorRadius() const
159 { return majorRadius; }
161 inline Standard_Real gp_Hypr2d::MinorRadius() const
162 { return minorRadius; }
164 inline gp_Hypr2d gp_Hypr2d::OtherBranch() const
166 Standard_Boolean sign = (pos.XDirection().Crossed(pos.YDirection())) >= 0.0;
167 return gp_Hypr2d (gp_Ax2d (pos.Location(),pos.XDirection().Reversed()),
168 majorRadius,minorRadius,sign);
171 inline Standard_Real gp_Hypr2d::Parameter() const
173 Standard_DomainError_Raise_if (majorRadius <= gp::Resolution(), "");
174 return (minorRadius * minorRadius) / majorRadius;
177 inline const gp_Ax22d& gp_Hypr2d::Axis () const
180 inline gp_Ax2d gp_Hypr2d::XAxis () const
181 { return pos.XAxis(); }
183 inline gp_Ax2d gp_Hypr2d::YAxis () const
184 { return pos.YAxis(); }
186 inline void gp_Hypr2d::Reverse()
188 gp_Dir2d Temp = pos.YDirection ();
190 pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp));
193 inline gp_Hypr2d gp_Hypr2d::Reversed() const
196 gp_Dir2d Temp = pos.YDirection ();
198 H.pos.SetAxis(gp_Ax22d(pos.Location(),pos.XDirection(),Temp));
202 inline Standard_Boolean gp_Hypr2d::IsDirect() const
203 { return (pos.XDirection().Crossed(pos.YDirection())) >= 0.0; }
205 inline void gp_Hypr2d::Rotate (const gp_Pnt2d& P,
206 const Standard_Real Ang)
207 {pos.Rotate (P,Ang);}
209 inline gp_Hypr2d gp_Hypr2d::Rotated (const gp_Pnt2d& P,
210 const Standard_Real Ang) const
213 H.pos.Rotate (P, Ang);
217 inline void gp_Hypr2d::Scale (const gp_Pnt2d& P,
218 const Standard_Real S)
221 if (majorRadius < 0) majorRadius = - majorRadius;
223 if (minorRadius < 0) minorRadius = - minorRadius;
227 inline gp_Hypr2d gp_Hypr2d::Scaled (const gp_Pnt2d& P,
228 const Standard_Real S) const
232 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
234 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
239 inline void gp_Hypr2d::Transform (const gp_Trsf2d& T)
241 majorRadius *= T.ScaleFactor();
242 if (majorRadius < 0) majorRadius = - majorRadius;
243 minorRadius *= T.ScaleFactor();
244 if (minorRadius < 0) minorRadius = - minorRadius;
248 inline gp_Hypr2d gp_Hypr2d::Transformed (const gp_Trsf2d& T) const
251 H.majorRadius *= T.ScaleFactor();
252 if (H.majorRadius < 0) H.majorRadius = - H.majorRadius;
253 H.minorRadius *= T.ScaleFactor();
254 if (H.minorRadius < 0) H.minorRadius = - H.minorRadius;
259 inline void gp_Hypr2d::Translate (const gp_Vec2d& V)
260 { pos.Translate(V); }
262 inline gp_Hypr2d gp_Hypr2d::Translated (const gp_Vec2d& V) const
269 inline void gp_Hypr2d::Translate (const gp_Pnt2d& P1,
272 pos.Translate(P1, P2);
275 inline gp_Hypr2d gp_Hypr2d::Translated (const gp_Pnt2d& P1,
276 const gp_Pnt2d& P2) const
279 H.pos.Translate(P1, P2);