0022488: Typo in Geom2d_BSplineCurve::LocateU() - which uses a value not adjusted...
[occt.git] / src / Geom2d / Geom2d_Ellipse.cxx
1 // File:        Geom2d_Ellipse.cxx
2 // Created:     Wed Mar 24 19:22:03 1993
3 // Author:      JCV
4 //              <fid@sdsun2>
5 // Copyright:   Matra Datavision 1993
6
7 //File Geom2d_Ellipse.cxx, JCV 19/07/1991
8
9
10 #include <Geom2d_Ellipse.ixx>
11 #include <gp.hxx>
12 #include <gp_Dir2d.hxx>
13 #include <gp_XYZ.hxx>
14 #include <ElCLib.hxx>
15 #include <Standard_RangeError.hxx>
16 #include <Standard_ConstructionError.hxx>
17
18
19 typedef Geom2d_Ellipse         Ellipse;
20 typedef Handle(Geom2d_Ellipse) Handle(Ellipse);
21 typedef gp_Ax2d   Ax2d;
22 typedef gp_Dir2d  Dir2d;
23 typedef gp_Pnt2d  Pnt2d;
24 typedef gp_Vec2d  Vec2d;
25 typedef gp_Trsf2d Trsf2d;
26 typedef gp_XY     XY;
27
28
29
30
31
32 //=======================================================================
33 //function : Copy
34 //purpose  : 
35 //=======================================================================
36
37 Handle(Geom2d_Geometry) Geom2d_Ellipse::Copy() const 
38 {
39   Handle(Ellipse) E;
40   E = new Ellipse (pos, majorRadius, minorRadius);
41   return E;
42 }
43
44
45 //=======================================================================
46 //function : Geom2d_Ellipse
47 //purpose  : 
48 //=======================================================================
49
50 Geom2d_Ellipse::Geom2d_Ellipse (const gp_Elips2d& E) {
51  
52   majorRadius = E.MajorRadius();
53   minorRadius = E.MinorRadius();
54   pos = E.Axis();
55 }
56
57
58
59 //=======================================================================
60 //function : Geom2d_Ellipse
61 //purpose  : 
62 //=======================================================================
63
64 Geom2d_Ellipse::Geom2d_Ellipse (const Ax2d& MajorAxis,
65                                 const Standard_Real MajorRadius,
66                                 const Standard_Real MinorRadius,
67                                 const Standard_Boolean Sense) 
68 :majorRadius (MajorRadius), minorRadius (MinorRadius){
69
70   if (MajorRadius < MinorRadius || MinorRadius < 0.0 ) {
71     Standard_ConstructionError::Raise();
72   }
73   pos = gp_Ax22d(MajorAxis, Sense);
74 }
75
76
77 //=======================================================================
78 //function : Geom2d_Ellipse
79 //purpose  : 
80 //=======================================================================
81
82 Geom2d_Ellipse::Geom2d_Ellipse (const gp_Ax22d& Axis, 
83                                 const Standard_Real MajorRadius, 
84                                 const Standard_Real MinorRadius) 
85 : majorRadius (MajorRadius), minorRadius (MinorRadius)
86 {
87   if (MajorRadius < MinorRadius || MinorRadius < 0.0 ) {
88     Standard_ConstructionError::Raise();
89   }
90   pos = Axis;
91 }
92
93
94 //=======================================================================
95 //function : SetElips2d
96 //purpose  : 
97 //=======================================================================
98
99 void Geom2d_Ellipse::SetElips2d (const gp_Elips2d& E) 
100 {
101   majorRadius = E.MajorRadius();
102   minorRadius = E.MinorRadius();
103   pos = E.Axis();
104 }
105
106
107 //=======================================================================
108 //function : SetMajorRadius
109 //purpose  : 
110 //=======================================================================
111
112 void Geom2d_Ellipse::SetMajorRadius (const Standard_Real MajorRadius) 
113 {
114   if (MajorRadius < minorRadius) 
115     Standard_ConstructionError::Raise();
116   else                           
117     majorRadius = MajorRadius; 
118 }
119
120
121 //=======================================================================
122 //function : SetMinorRadius
123 //purpose  : 
124 //=======================================================================
125
126 void Geom2d_Ellipse::SetMinorRadius (const Standard_Real MinorRadius) 
127 {
128    if (MinorRadius < 0 || majorRadius < MinorRadius) 
129      { Standard_ConstructionError::Raise(); }
130    else 
131      { minorRadius = MinorRadius; }
132 }
133
134
135 //=======================================================================
136 //function : Elips2d
137 //purpose  : 
138 //=======================================================================
139
140 gp_Elips2d Geom2d_Ellipse::Elips2d () const 
141 {
142   return gp_Elips2d (pos, majorRadius, minorRadius);
143 }
144
145 //=======================================================================
146 //function : ReversedParameter
147 //purpose  : 
148 //=======================================================================
149
150 Standard_Real Geom2d_Ellipse::ReversedParameter( const Standard_Real U) const 
151 {
152   return (2. * M_PI - U);
153 }
154
155 //=======================================================================
156 //function : Directrix1
157 //purpose  : 
158 //=======================================================================
159
160 Ax2d Geom2d_Ellipse::Directrix1 () const 
161 {
162   gp_Elips2d Ev (pos, majorRadius, minorRadius);
163   return Ev.Directrix1();
164 }
165
166
167 //=======================================================================
168 //function : Directrix2
169 //purpose  : 
170 //=======================================================================
171
172 Ax2d Geom2d_Ellipse::Directrix2 () const 
173 {
174   gp_Elips2d Ev (pos, majorRadius, minorRadius);
175   return Ev.Directrix2();
176 }
177
178
179 //=======================================================================
180 //function : Eccentricity
181 //purpose  : 
182 //=======================================================================
183
184 Standard_Real Geom2d_Ellipse::Eccentricity () const 
185 {
186   if (majorRadius == 0.0) 
187     { return 0.0; }
188   else 
189     { return 
190         (Sqrt(majorRadius*majorRadius-minorRadius*minorRadius))/majorRadius;
191     }
192 }
193
194
195 //=======================================================================
196 //function : Focal
197 //purpose  : 
198 //=======================================================================
199
200 Standard_Real Geom2d_Ellipse::Focal () const 
201 {
202   return 2.0 * Sqrt(majorRadius * majorRadius - minorRadius * minorRadius);
203 }
204
205
206 //=======================================================================
207 //function : Focus1
208 //purpose  : 
209 //=======================================================================
210
211 Pnt2d Geom2d_Ellipse::Focus1 () const 
212 {
213   Standard_Real C = Sqrt(majorRadius * majorRadius - minorRadius * minorRadius);
214   return Pnt2d (pos.Location().X() + C * pos.XDirection().X(),
215                 pos.Location().Y() + C * pos.XDirection().Y());
216 }
217
218
219 //=======================================================================
220 //function : Focus2
221 //purpose  : 
222 //=======================================================================
223
224 Pnt2d Geom2d_Ellipse::Focus2 () const 
225 {
226   Standard_Real C = Sqrt(majorRadius * majorRadius - minorRadius * minorRadius);
227   return Pnt2d (pos.Location().X() - C * pos.XDirection().X(),
228                 pos.Location().Y() - C * pos.XDirection().Y());
229 }
230
231 //=======================================================================
232 //function : MajorRadius
233 //purpose  : 
234 //=======================================================================
235
236 Standard_Real Geom2d_Ellipse::MajorRadius () const       
237 {
238   return majorRadius; 
239 }
240
241 //=======================================================================
242 //function : MinorRadius
243 //purpose  : 
244 //=======================================================================
245
246 Standard_Real Geom2d_Ellipse::MinorRadius () const       
247 {
248   return minorRadius; 
249 }
250
251 //=======================================================================
252 //function : Parameter
253 //purpose  : 
254 //=======================================================================
255
256 Standard_Real Geom2d_Ellipse::Parameter () const 
257 {
258   if (majorRadius == 0.0) 
259     return 0.0;
260   else                    
261     return (minorRadius * minorRadius)/majorRadius;
262 }
263
264
265 //=======================================================================
266 //function : FirstParameter
267 //purpose  : 
268 //=======================================================================
269
270 Standard_Real Geom2d_Ellipse::FirstParameter () const    
271 {
272   return 0.0; 
273 }
274
275 //=======================================================================
276 //function : LastParameter
277 //purpose  : 
278 //=======================================================================
279
280 Standard_Real Geom2d_Ellipse::LastParameter () const     
281 {
282   return 2.0 * M_PI; 
283 }
284
285 //=======================================================================
286 //function : IsClosed
287 //purpose  : 
288 //=======================================================================
289
290 Standard_Boolean Geom2d_Ellipse::IsClosed () const       
291 {
292   return Standard_True; 
293 }
294
295 //=======================================================================
296 //function : IsPeriodic
297 //purpose  : 
298 //=======================================================================
299
300 Standard_Boolean Geom2d_Ellipse::IsPeriodic () const     
301 {
302   return Standard_True; 
303 }
304
305 //=======================================================================
306 //function : D0
307 //purpose  : 
308 //=======================================================================
309
310 void Geom2d_Ellipse::D0 (const Standard_Real U, Pnt2d& P) const 
311 {
312   P = ElCLib::EllipseValue (U, pos, majorRadius, minorRadius);
313 }
314
315 //=======================================================================
316 //function : D1
317 //purpose  : 
318 //=======================================================================
319
320 void Geom2d_Ellipse::D1 (const Standard_Real U, Pnt2d& P, Vec2d& V1) const 
321 {
322   ElCLib::EllipseD1 (U, pos, majorRadius, minorRadius, P, V1);
323 }
324
325
326 //=======================================================================
327 //function : D2
328 //purpose  : 
329 //=======================================================================
330
331 void Geom2d_Ellipse::D2 (const Standard_Real U, 
332                                Pnt2d& P, 
333                                Vec2d& V1, Vec2d& V2) const 
334 {
335   ElCLib::EllipseD2 (U, pos, majorRadius, minorRadius, P, V1, V2);
336 }
337
338
339 //=======================================================================
340 //function : D3
341 //purpose  : 
342 //=======================================================================
343
344 void Geom2d_Ellipse::D3 (const Standard_Real U, 
345                                Pnt2d& P, 
346                                Vec2d& V1, Vec2d& V2, Vec2d& V3) const 
347 {
348   ElCLib::EllipseD3 (U, pos, majorRadius, minorRadius, P, V1, V2, V3);
349 }
350
351
352 //=======================================================================
353 //function : DN
354 //purpose  : 
355 //=======================================================================
356
357 Vec2d Geom2d_Ellipse::DN (const Standard_Real U, const Standard_Integer N) const 
358 {
359   Standard_RangeError_Raise_if (N < 1, " ");
360   return ElCLib::EllipseDN (U, pos, majorRadius, minorRadius, N);
361 }
362
363 //=======================================================================
364 //function : Transform
365 //purpose  : 
366 //=======================================================================
367
368 void Geom2d_Ellipse::Transform (const Trsf2d& T) 
369 {
370   majorRadius = majorRadius * Abs(T.ScaleFactor());
371   minorRadius = minorRadius * Abs(T.ScaleFactor());
372   pos.Transform(T);
373 }