0026252: GeomAdaptor_Surface should use inner adaptor to calculate values of complex...
[occt.git] / src / Geom / Geom_SurfaceOfRevolution.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
18 #include <BSplCLib.hxx>
19 #include <BSplSLib.hxx>
20 #include <Geom_BSplineCurve.hxx>
21 #include <Geom_Circle.hxx>
22 #include <Geom_Curve.hxx>
23 #include <Geom_Geometry.hxx>
24 #include <Geom_SurfaceOfRevolution.hxx>
25 #include <Geom_UndefinedDerivative.hxx>
26 #include <GeomEvaluator_SurfaceOfRevolution.hxx>
27 #include <gp.hxx>
28 #include <gp_Ax1.hxx>
29 #include <gp_Ax2.hxx>
30 #include <gp_Ax2d.hxx>
31 #include <gp_Dir.hxx>
32 #include <gp_GTrsf2d.hxx>
33 #include <gp_Lin.hxx>
34 #include <gp_Pnt.hxx>
35 #include <gp_Trsf.hxx>
36 #include <gp_Vec.hxx>
37 #include <gp_XYZ.hxx>
38 #include <Precision.hxx>
39 #include <Standard_ConstructionError.hxx>
40 #include <Standard_NotImplemented.hxx>
41 #include <Standard_RangeError.hxx>
42 #include <Standard_Type.hxx>
43
44 #define  POLES    (poles->Array2())
45 #define  WEIGHTS  (weights->Array2())
46 #define  UKNOTS   (uknots->Array1())
47 #define  VKNOTS   (vknots->Array1())
48 #define  UFKNOTS  (ufknots->Array1())
49 #define  VFKNOTS  (vfknots->Array1())
50 #define  FMULTS   (BSplCLib::NoMults())
51
52 typedef Geom_SurfaceOfRevolution         SurfaceOfRevolution;
53 typedef Geom_Curve                       Curve;
54 typedef gp_Ax1  Ax1;
55 typedef gp_Ax2  Ax2;
56 typedef gp_Dir  Dir;
57 typedef gp_Lin  Lin;
58 typedef gp_Pnt  Pnt;
59 typedef gp_Trsf Trsf;
60 typedef gp_Vec  Vec;
61 typedef gp_XYZ  XYZ;
62
63
64
65
66
67 //=======================================================================
68 //function : Copy
69 //purpose  : 
70 //=======================================================================
71
72 Handle(Geom_Geometry) Geom_SurfaceOfRevolution::Copy () const {
73
74   return new Geom_SurfaceOfRevolution (basisCurve, Axis());
75 }
76
77
78 //=======================================================================
79 //function : Geom_SurfaceOfRevolution
80 //purpose  : 
81 //=======================================================================
82
83 Geom_SurfaceOfRevolution::Geom_SurfaceOfRevolution 
84   (const Handle(Geom_Curve)& C , 
85    const Ax1&           A1 ) : loc (A1.Location()) {
86
87   direction  = A1.Direction();
88   SetBasisCurve(C);
89 }
90
91
92 //=======================================================================
93 //function : UReverse
94 //purpose  : 
95 //=======================================================================
96
97 void Geom_SurfaceOfRevolution::UReverse () { 
98
99   direction.Reverse();
100   myEvaluator->SetDirection(direction);
101 }
102
103
104 //=======================================================================
105 //function : UReversedParameter
106 //purpose  : 
107 //=======================================================================
108
109 Standard_Real Geom_SurfaceOfRevolution::UReversedParameter (const Standard_Real U) const {
110
111   return ( 2.*M_PI - U);
112 }
113
114
115 //=======================================================================
116 //function : VReverse
117 //purpose  : 
118 //=======================================================================
119
120 void Geom_SurfaceOfRevolution::VReverse () { 
121
122   basisCurve->Reverse(); 
123 }
124
125
126 //=======================================================================
127 //function : VReversedParameter
128 //purpose  : 
129 //=======================================================================
130
131 Standard_Real Geom_SurfaceOfRevolution::VReversedParameter (const Standard_Real V) const {
132
133   return basisCurve->ReversedParameter(V);
134 }
135
136
137 //=======================================================================
138 //function : Location
139 //purpose  : 
140 //=======================================================================
141
142 const gp_Pnt& Geom_SurfaceOfRevolution::Location () const { 
143
144   return loc; 
145 }
146
147 //=======================================================================
148 //function : IsUPeriodic
149 //purpose  : 
150 //=======================================================================
151
152 Standard_Boolean Geom_SurfaceOfRevolution::IsUPeriodic () const {
153
154   return Standard_True; 
155 }
156
157 //=======================================================================
158 //function : IsCNu
159 //purpose  : 
160 //=======================================================================
161
162 Standard_Boolean Geom_SurfaceOfRevolution::IsCNu (const Standard_Integer ) const  {
163
164   return Standard_True;
165 }
166
167 //=======================================================================
168 //function : Axis
169 //purpose  : 
170 //=======================================================================
171
172 Ax1 Geom_SurfaceOfRevolution::Axis () const  { 
173
174   return Ax1 (loc, direction); 
175 }
176
177 //=======================================================================
178 //function : IsCNv
179 //purpose  : 
180 //=======================================================================
181
182 Standard_Boolean Geom_SurfaceOfRevolution::IsCNv (const Standard_Integer N) const {
183
184   Standard_RangeError_Raise_if (N < 0, " ");
185   return basisCurve->IsCN(N);
186 }
187
188
189 //=======================================================================
190 //function : IsUClosed
191 //purpose  : 
192 //=======================================================================
193
194 Standard_Boolean Geom_SurfaceOfRevolution::IsUClosed () const { 
195
196   return Standard_True; 
197 }
198
199 //=======================================================================
200 //function : IsVClosed
201 //purpose  : 
202 //=======================================================================
203
204 Standard_Boolean Geom_SurfaceOfRevolution::IsVClosed () const 
205
206   return basisCurve->IsClosed();
207 }
208
209
210 //=======================================================================
211 //function : IsVPeriodic
212 //purpose  : 
213 //=======================================================================
214
215 Standard_Boolean Geom_SurfaceOfRevolution::IsVPeriodic () const { 
216
217   return basisCurve->IsPeriodic(); 
218 }
219
220
221 //=======================================================================
222 //function : SetAxis
223 //purpose  : 
224 //=======================================================================
225
226 void Geom_SurfaceOfRevolution::SetAxis (const Ax1& A1) {
227
228    direction = A1.Direction();
229    loc = A1.Location();
230    myEvaluator->SetAxis(A1);
231 }
232
233
234 //=======================================================================
235 //function : SetDirection
236 //purpose  : 
237 //=======================================================================
238
239 void Geom_SurfaceOfRevolution::SetDirection (const Dir& V) {
240
241    direction = V;
242    myEvaluator->SetDirection(direction);
243 }
244
245
246 //=======================================================================
247 //function : SetBasisCurve
248 //purpose  : 
249 //=======================================================================
250
251 void Geom_SurfaceOfRevolution::SetBasisCurve (const Handle(Geom_Curve)& C) {
252
253    basisCurve = Handle(Geom_Curve)::DownCast(C->Copy());
254    smooth     = C->Continuity();
255    myEvaluator = new GeomEvaluator_SurfaceOfRevolution(basisCurve, direction, loc);
256 }
257
258
259 //=======================================================================
260 //function : SetLocation
261 //purpose  : 
262 //=======================================================================
263
264 void Geom_SurfaceOfRevolution::SetLocation (const Pnt& P) {
265
266    loc = P;
267    myEvaluator->SetLocation(loc);
268 }
269
270
271 //=======================================================================
272 //function : Bounds
273 //purpose  : 
274 //=======================================================================
275
276 void Geom_SurfaceOfRevolution::Bounds ( Standard_Real& U1, 
277                                         Standard_Real& U2, 
278                                         Standard_Real& V1, 
279                                         Standard_Real& V2 ) const {
280
281   U1 = 0.0; 
282   U2 = 2.0 * M_PI; 
283   V1 = basisCurve->FirstParameter();  
284   V2 = basisCurve->LastParameter();
285 }
286
287
288 //=======================================================================
289 //function : D0
290 //purpose  : 
291 //=======================================================================
292
293 void Geom_SurfaceOfRevolution::D0
294 (const Standard_Real U, const Standard_Real V, Pnt& P) const
295 {
296   myEvaluator->D0(U, V, P);
297 }
298
299
300 //=======================================================================
301 //function : D1
302 //purpose  : 
303 //=======================================================================
304
305 void Geom_SurfaceOfRevolution::D1 
306   (const Standard_Real U, const Standard_Real V, 
307          Pnt& P, 
308          Vec& D1U, Vec& D1V   ) const
309 {
310   myEvaluator->D1(U, V, P, D1U, D1V);
311 }
312
313 //=======================================================================
314 //function : D2
315 //purpose  : 
316 //=======================================================================
317
318 void Geom_SurfaceOfRevolution::D2 
319   (const Standard_Real   U, const Standard_Real V,
320          Pnt&   P, 
321          Vec& D1U, Vec& D1V, 
322          Vec& D2U, Vec& D2V, Vec& D2UV ) const
323 {
324   myEvaluator->D2(U, V, P, D1U, D1V, D2U, D2V, D2UV);
325 }
326
327
328
329 //=======================================================================
330 //function : D3
331 //purpose  : 
332 //=======================================================================
333
334 void Geom_SurfaceOfRevolution::D3 
335   (const Standard_Real U, const Standard_Real V,
336          Pnt& P,
337          Vec& D1U, Vec& D1V, 
338          Vec& D2U, Vec& D2V, Vec& D2UV,
339          Vec& D3U, Vec& D3V, Vec& D3UUV, Vec& D3UVV ) const
340 {
341   myEvaluator->D3(U, V, P, D1U, D1V, D2U, D2V, D2UV, D3U, D3V, D3UUV, D3UVV);
342 }
343
344
345 //=======================================================================
346 //function : DN
347 //purpose  : 
348 //=======================================================================
349
350 Vec Geom_SurfaceOfRevolution::DN (const Standard_Real    U , const Standard_Real    V, 
351                                   const Standard_Integer Nu, const Standard_Integer Nv) const
352 {
353   return myEvaluator->DN(U, V, Nu, Nv);
354 }
355
356
357 //=======================================================================
358 //function : ReferencePlane
359 //purpose  : 
360 //=======================================================================
361
362 Ax2 Geom_SurfaceOfRevolution::ReferencePlane() const {
363         
364    Standard_NotImplemented::Raise ();
365    return gp_Ax2();
366 }
367
368
369 //=======================================================================
370 //function : UIso
371 //purpose  : 
372 //=======================================================================
373
374 Handle(Geom_Curve) Geom_SurfaceOfRevolution::UIso (const Standard_Real U) const {
375
376    Handle(Geom_Curve) C = Handle(Geom_Curve)::DownCast(basisCurve->Copy());
377    Ax1 RotAxis = Ax1 (loc, direction);
378    C->Rotate (RotAxis, U);
379    return C;
380 }
381
382
383 //=======================================================================
384 //function : VIso
385 //purpose  : 
386 //=======================================================================
387
388 Handle(Geom_Curve) Geom_SurfaceOfRevolution::VIso (const Standard_Real V) const {
389
390   Handle(Geom_Circle) Circ;
391   Pnt Pc = basisCurve->Value (V);
392   gp_Lin L1(loc,direction);
393   Standard_Real Rad= L1.Distance(Pc);
394
395   Ax2 Rep ;
396   if ( Rad > gp::Resolution()) { 
397     XYZ P  = Pc.XYZ(); 
398     XYZ C;
399     C.SetLinearForm((P-loc.XYZ()).Dot(direction.XYZ()), 
400                     direction.XYZ(), loc.XYZ() );
401     P = P-C;
402     if(P.Modulus() > gp::Resolution()) {
403       gp_Dir D = P.Normalized();
404       Rep = gp_Ax2(C, direction, D);
405     }
406     else 
407       Rep = gp_Ax2(C, direction);
408   }
409   else
410     Rep = gp_Ax2(Pc, direction);
411
412   Circ   = new Geom_Circle (Rep, Rad);
413   return Circ;
414 }
415
416
417 //=======================================================================
418 //function : Transform
419 //purpose  : 
420 //=======================================================================
421
422 void Geom_SurfaceOfRevolution::Transform (const Trsf& T) {
423
424   loc.Transform (T);
425   direction.Transform (T);
426   basisCurve->Transform (T);
427   if(T.ScaleFactor()*T.HVectorialPart().Determinant() < 0.) UReverse(); 
428   myEvaluator->SetDirection(direction);
429   myEvaluator->SetLocation(loc);
430 }
431
432 //=======================================================================
433 //function : TransformParameters
434 //purpose  : 
435 //=======================================================================
436
437 void Geom_SurfaceOfRevolution::TransformParameters(Standard_Real& ,
438                                                    Standard_Real& V,
439                                                    const gp_Trsf& T) 
440 const
441 {
442   V = basisCurve->TransformedParameter(V,T);
443 }
444
445 //=======================================================================
446 //function : ParametricTransformation
447 //purpose  : 
448 //=======================================================================
449
450 gp_GTrsf2d Geom_SurfaceOfRevolution::ParametricTransformation
451 (const gp_Trsf& T) const
452 {
453   gp_GTrsf2d T2;
454   gp_Ax2d Axis(gp::Origin2d(),gp::DX2d());
455   T2.SetAffinity(Axis, basisCurve->ParametricTransformation(T));
456   return T2;
457 }
458