5f0434030e6ede71d099ced8922df132d5d6fd12
[occt.git] / src / Geom / Geom_Ellipse.cxx
1 // Created on: 1993-03-10
2 // Created by: JCV
3 // Copyright (c) 1993-1999 Matra Datavision
4 // Copyright (c) 1999-2014 OPEN CASCADE SAS
5 //
6 // This file is part of Open CASCADE Technology software library.
7 //
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.
13 //
14 // Alternatively, this file may be used under the terms of Open CASCADE
15 // commercial license or contractual agreement.
16
17 #include <Geom_Ellipse.ixx>
18 #include <gp_XYZ.hxx>
19 #include <ElCLib.hxx>
20 #include <Standard_ConstructionError.hxx>
21 #include <Standard_RangeError.hxx>
22
23 typedef Geom_Ellipse         Ellipse;
24 typedef Handle(Geom_Ellipse) Handle(Ellipse);
25 typedef gp_Ax1  Ax1;
26 typedef gp_Ax2  Ax2;
27 typedef gp_Pnt  Pnt;
28 typedef gp_Vec  Vec;
29 typedef gp_Trsf Trsf;
30 typedef gp_XYZ  XYZ;
31
32
33
34
35
36 //=======================================================================
37 //function : Copy
38 //purpose  : 
39 //=======================================================================
40
41 Handle(Geom_Geometry) Geom_Ellipse::Copy() const
42 {
43   Handle(Ellipse) E;
44   E = new Ellipse (pos, majorRadius, minorRadius);
45   return E;
46 }
47
48
49
50
51 //=======================================================================
52 //function : Geom_Ellipse
53 //purpose  : 
54 //=======================================================================
55
56 Geom_Ellipse::Geom_Ellipse (const gp_Elips& E) 
57   : majorRadius (E.MajorRadius()), minorRadius (E.MinorRadius()) 
58 {
59   pos = E.Position ();
60 }
61
62
63 //=======================================================================
64 //function : Geom_Ellipse
65 //purpose  : 
66 //=======================================================================
67
68 Geom_Ellipse::Geom_Ellipse ( const Ax2& A, 
69                              const Standard_Real MajorRadius,
70                              const Standard_Real MinorRadius) 
71   : majorRadius (MajorRadius), minorRadius (MinorRadius) {
72
73    if (MajorRadius < MinorRadius || MinorRadius < 0.0 ) {
74      Standard_ConstructionError::Raise();
75    }
76    pos = A;
77 }
78
79
80 //=======================================================================
81 //function : IsClosed
82 //purpose  : 
83 //=======================================================================
84
85 Standard_Boolean Geom_Ellipse::IsClosed () const      { return Standard_True; }
86
87 //=======================================================================
88 //function : IsPeriodic
89 //purpose  : 
90 //=======================================================================
91
92 Standard_Boolean Geom_Ellipse::IsPeriodic () const    { return Standard_True; }
93
94 //=======================================================================
95 //function : FirstParameter
96 //purpose  : 
97 //=======================================================================
98
99 Standard_Real Geom_Ellipse::FirstParameter () const   { return 0.0; }
100
101 //=======================================================================
102 //function : LastParameter
103 //purpose  : 
104 //=======================================================================
105
106 Standard_Real Geom_Ellipse::LastParameter () const    { return 2.0 * M_PI; }
107
108 //=======================================================================
109 //function : MajorRadius
110 //purpose  : 
111 //=======================================================================
112
113 Standard_Real Geom_Ellipse::MajorRadius () const      { return majorRadius; }
114
115 //=======================================================================
116 //function : MinorRadius
117 //purpose  : 
118 //=======================================================================
119
120 Standard_Real Geom_Ellipse::MinorRadius () const      { return minorRadius; }
121
122 //=======================================================================
123 //function : SetElips
124 //purpose  : 
125 //=======================================================================
126
127 void Geom_Ellipse::SetElips (const gp_Elips& E) {
128
129   majorRadius = E.MajorRadius();
130   minorRadius = E.MinorRadius();
131   pos = E.Position();
132 }
133
134
135 //=======================================================================
136 //function : SetMajorRadius
137 //purpose  : 
138 //=======================================================================
139
140 void Geom_Ellipse::SetMajorRadius (const Standard_Real MajorRadius) {
141
142   if (MajorRadius < minorRadius)  Standard_ConstructionError::Raise ();
143   else                            majorRadius = MajorRadius; 
144 }
145
146
147 //=======================================================================
148 //function : SetMinorRadius
149 //purpose  : 
150 //=======================================================================
151
152 void Geom_Ellipse::SetMinorRadius (const Standard_Real MinorRadius) {
153
154    if (MinorRadius < 0 || majorRadius < MinorRadius) {
155      Standard_ConstructionError::Raise();
156    }
157    else { minorRadius = MinorRadius; }
158 }
159
160
161 //=======================================================================
162 //function : Elips
163 //purpose  : 
164 //=======================================================================
165
166 gp_Elips Geom_Ellipse::Elips () const {
167
168   return gp_Elips (pos, majorRadius, minorRadius);
169 }
170
171
172 //=======================================================================
173 //function : ReversedParameter
174 //purpose  : 
175 //=======================================================================
176
177 Standard_Real Geom_Ellipse::ReversedParameter( const Standard_Real U) const 
178 {
179   return ( 2. * M_PI - U);
180 }
181
182
183 //=======================================================================
184 //function : Directrix1
185 //purpose  : 
186 //=======================================================================
187
188 Ax1 Geom_Ellipse::Directrix1 () const {
189
190    gp_Elips Ev (pos, majorRadius, minorRadius);
191    return Ev.Directrix1();
192 }
193
194
195 //=======================================================================
196 //function : Directrix2
197 //purpose  : 
198 //=======================================================================
199
200 Ax1 Geom_Ellipse::Directrix2 () const {
201
202   gp_Elips Ev (pos, majorRadius, minorRadius);
203   return Ev.Directrix2();
204 }
205
206
207 //=======================================================================
208 //function : D0
209 //purpose  : 
210 //=======================================================================
211
212 void Geom_Ellipse::D0 (const Standard_Real U, gp_Pnt& P) const {
213
214   P = ElCLib::EllipseValue (U, pos, majorRadius, minorRadius);
215 }
216
217
218 //=======================================================================
219 //function : D1
220 //purpose  : 
221 //=======================================================================
222
223 void Geom_Ellipse::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
224
225   ElCLib::EllipseD1 (U, pos, majorRadius, minorRadius, P, V1);
226 }
227
228
229 //=======================================================================
230 //function : D2
231 //purpose  : 
232 //=======================================================================
233
234 void Geom_Ellipse::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const {
235
236   ElCLib::EllipseD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
237 }
238
239
240 //=======================================================================
241 //function : D3
242 //purpose  : 
243 //=======================================================================
244
245 void Geom_Ellipse::D3 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2, Vec& V3) const {
246
247   ElCLib::EllipseD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
248 }
249
250
251 //=======================================================================
252 //function : DN
253 //purpose  : 
254 //=======================================================================
255
256 Vec Geom_Ellipse::DN (const Standard_Real U, const Standard_Integer N) const {
257
258    Standard_RangeError_Raise_if (N < 1, " ");
259    return ElCLib::EllipseDN (U, pos, majorRadius, minorRadius, N);
260 }
261
262
263 //=======================================================================
264 //function : Eccentricity
265 //purpose  : 
266 //=======================================================================
267
268 Standard_Real Geom_Ellipse::Eccentricity () const {
269
270   if (majorRadius == 0.0) { return 0.0; }
271   else {
272     return (Sqrt(majorRadius*majorRadius-minorRadius*minorRadius))/majorRadius;
273   }
274 }
275
276
277 //=======================================================================
278 //function : Focal
279 //purpose  : 
280 //=======================================================================
281
282 Standard_Real Geom_Ellipse::Focal () const {
283
284   return 2.0 * Sqrt(majorRadius * majorRadius - minorRadius * minorRadius);
285 }
286
287
288 //=======================================================================
289 //function : Focus1
290 //purpose  : 
291 //=======================================================================
292
293 Pnt Geom_Ellipse::Focus1 () const {
294
295   Standard_Real C = Sqrt (majorRadius * majorRadius - minorRadius * minorRadius);
296   Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
297   pos.Location().Coord (Xp, Yp, Zp);
298   pos.XDirection().Coord (Xd, Yd, Zd);
299   return Pnt (Xp + C * Xd,  Yp + C * Yd,  Zp + C * Zd);
300 }
301
302
303 //=======================================================================
304 //function : Focus2
305 //purpose  : 
306 //=======================================================================
307
308 Pnt Geom_Ellipse::Focus2 () const {
309
310   Standard_Real C = Sqrt (majorRadius * majorRadius - minorRadius * minorRadius);
311   Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
312   pos.Location().Coord (Xp, Yp, Zp);
313   pos.XDirection().Coord (Xd, Yd, Zd);
314   return Pnt (Xp - C * Xd,  Yp - C * Yd,  Zp - C * Zd);
315 }
316
317
318 //=======================================================================
319 //function : Parameter
320 //purpose  : 
321 //=======================================================================
322
323 Standard_Real Geom_Ellipse::Parameter () const {
324
325   if (majorRadius == 0.0)  return 0.0;
326   else                     return (minorRadius * minorRadius) / majorRadius;
327 }
328
329
330 //=======================================================================
331 //function : Transform
332 //purpose  : 
333 //=======================================================================
334
335 void Geom_Ellipse::Transform (const Trsf& T) {
336
337   majorRadius = majorRadius * Abs(T.ScaleFactor());
338   minorRadius = minorRadius * Abs(T.ScaleFactor());
339   pos.Transform(T);
340 }