0024023: Revamp the OCCT Handle -- general
[occt.git] / src / Geom / Geom_Parabola.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_Parabola.ixx>
18
19 #include <Precision.hxx>
20 #include <ElCLib.hxx>
21 #include <gp_XYZ.hxx>
22 #include <Standard_ConstructionError.hxx>
23 #include <Standard_RangeError.hxx>
24
25 typedef Geom_Parabola         Parabola;
26 typedef gp_Ax1  Ax1;
27 typedef gp_Ax2  Ax2;
28 typedef gp_Pnt  Pnt;
29 typedef gp_Trsf Trsf;
30 typedef gp_Vec  Vec;
31 typedef gp_XYZ  XYZ;
32
33 //=======================================================================
34 //function : Copy
35 //purpose  : 
36 //=======================================================================
37
38 Handle(Geom_Geometry) Geom_Parabola::Copy() const {
39
40    Handle(Geom_Parabola) Prb;
41    Prb = new Parabola (pos, focalLength);
42    return Prb;
43 }
44
45
46
47 //=======================================================================
48 //function : Geom_Parabola
49 //purpose  : 
50 //=======================================================================
51
52 Geom_Parabola::Geom_Parabola (const gp_Parab& Prb) 
53  : focalLength (Prb.Focal()) 
54 { pos = Prb.Position(); }
55
56
57 //=======================================================================
58 //function : Geom_Parabola
59 //purpose  : 
60 //=======================================================================
61
62 Geom_Parabola::Geom_Parabola (const Ax2& A2, const Standard_Real Focal) 
63  : focalLength (Focal) {
64    
65   if(Focal < 0.0)  Standard_ConstructionError::Raise();
66   pos = A2;
67 }
68
69
70 //=======================================================================
71 //function : Geom_Parabola
72 //purpose  : 
73 //=======================================================================
74
75 Geom_Parabola::Geom_Parabola (const Ax1& D, const Pnt& F) {
76
77    gp_Parab Prb (D, F);
78    pos = Prb.Position();
79    focalLength = Prb.Focal();
80 }
81
82 //=======================================================================
83 //function : ReversedParameter
84 //purpose  : 
85 //=======================================================================
86
87 Standard_Real Geom_Parabola::ReversedParameter( const Standard_Real U) const
88 {
89   return (-U);
90 }
91
92
93 //=======================================================================
94 //function : IsClosed
95 //purpose  : 
96 //=======================================================================
97
98 Standard_Boolean Geom_Parabola::IsClosed () const { return Standard_False; }
99
100 //=======================================================================
101 //function : IsPeriodic
102 //purpose  : 
103 //=======================================================================
104
105 Standard_Boolean Geom_Parabola::IsPeriodic () const     {  return Standard_False; }
106
107 //=======================================================================
108 //function : Eccentricity
109 //purpose  : 
110 //=======================================================================
111
112 Standard_Real Geom_Parabola::Eccentricity () const      { return 1.0; }
113
114 //=======================================================================
115 //function : FirstParameter
116 //purpose  : 
117 //=======================================================================
118
119 Standard_Real Geom_Parabola::FirstParameter () const    
120 { return -Precision::Infinite(); }
121
122 //=======================================================================
123 //function : Focal
124 //purpose  : 
125 //=======================================================================
126
127 Standard_Real Geom_Parabola::Focal () const             { return focalLength; }
128
129 //=======================================================================
130 //function : LastParameter
131 //purpose  : 
132 //=======================================================================
133
134 Standard_Real Geom_Parabola::LastParameter () const     
135 { return Precision::Infinite(); }
136
137 //=======================================================================
138 //function : Parameter
139 //purpose  : 
140 //=======================================================================
141
142 Standard_Real Geom_Parabola::Parameter () const         { return 2.0 * focalLength; }
143
144 //=======================================================================
145 //function : SetFocal
146 //purpose  : 
147 //=======================================================================
148
149 void Geom_Parabola::SetFocal (const Standard_Real Focal) {
150
151    if (Focal < 0.0)  Standard_ConstructionError::Raise();
152    focalLength = Focal;
153 }
154
155
156 //=======================================================================
157 //function : SetParab
158 //purpose  : 
159 //=======================================================================
160
161 void Geom_Parabola::SetParab (const gp_Parab& Prb) {
162
163    focalLength = Prb.Focal ();
164    pos = Prb.Position ();
165 }
166
167
168 //=======================================================================
169 //function : Directrix
170 //purpose  : 
171 //=======================================================================
172
173 Ax1 Geom_Parabola::Directrix () const {
174
175    gp_Parab Prb (pos, focalLength);
176    return Prb.Directrix();
177 }
178
179
180 //=======================================================================
181 //function : D0
182 //purpose  : 
183 //=======================================================================
184
185 void Geom_Parabola::D0 (const Standard_Real U, Pnt& P) const {
186
187    P = ElCLib::ParabolaValue (U, pos, focalLength);
188 }
189
190
191 //=======================================================================
192 //function : D1
193 //purpose  : 
194 //=======================================================================
195
196 void Geom_Parabola::D1 (const Standard_Real U, Pnt& P, Vec& V1) const {
197
198   ElCLib::ParabolaD1 (U, pos, focalLength, P, V1);
199 }
200
201
202 //=======================================================================
203 //function : D2
204 //purpose  : 
205 //=======================================================================
206
207 void Geom_Parabola::D2 (const Standard_Real U, Pnt& P, Vec& V1, Vec& V2) const {
208
209    ElCLib::ParabolaD2 (U, pos, focalLength, P, V1, V2);
210 }
211
212
213 //=======================================================================
214 //function : D3
215 //purpose  : 
216 //=======================================================================
217
218 void Geom_Parabola::D3 (const Standard_Real U, 
219                         Pnt& P, Vec& V1, Vec& V2, Vec& V3) const {
220
221    ElCLib::ParabolaD2 (U, pos, focalLength, P, V1, V2);
222    V3.SetCoord (0.0, 0.0, 0.0);
223 }
224
225
226 //=======================================================================
227 //function : DN
228 //purpose  : 
229 //=======================================================================
230
231 Vec Geom_Parabola::DN (const Standard_Real U, const Standard_Integer N) const {
232
233   Standard_RangeError_Raise_if (N < 1, " ");
234    return ElCLib::ParabolaDN (U, pos, focalLength, N);
235 }
236
237
238 //=======================================================================
239 //function : Focus
240 //purpose  : 
241 //=======================================================================
242
243 Pnt Geom_Parabola::Focus () const {
244
245   Standard_Real Xp, Yp, Zp, Xd, Yd, Zd;
246   pos.Location().Coord (Xp, Yp, Zp);
247   pos.XDirection().Coord (Xd, Yd, Zd);
248   return Pnt (Xp + focalLength*Xd, Yp + focalLength*Yd, Zp + focalLength*Zd);
249 }
250
251
252 //=======================================================================
253 //function : Parab
254 //purpose  : 
255 //=======================================================================
256
257 gp_Parab Geom_Parabola::Parab () const {
258
259    return gp_Parab (pos, focalLength);
260 }
261
262
263 //=======================================================================
264 //function : Transform
265 //purpose  : 
266 //=======================================================================
267
268 void Geom_Parabola::Transform (const Trsf& T) {
269
270   focalLength *= Abs(T.ScaleFactor());
271   pos.Transform (T);
272 }
273
274
275
276 //=======================================================================
277 //function : TransformedParameter
278 //purpose  : 
279 //=======================================================================
280
281 Standard_Real Geom_Parabola::TransformedParameter(const Standard_Real U,
282                                                   const gp_Trsf& T) const
283 {
284   if (Precision::IsInfinite(U)) return U;
285   return U * Abs(T.ScaleFactor());
286 }
287
288
289 //=======================================================================
290 //function : TransformedParameter
291 //purpose  : 
292 //=======================================================================
293
294 Standard_Real Geom_Parabola::ParametricTransformation(const gp_Trsf& T) const
295 {
296   return Abs(T.ScaleFactor());
297 }
298
299